Compare commits
7
Commits
352c3c84dd
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fd8e6ec8e
|
||
|
|
be31a2fe58
|
||
|
|
27f3e0e507
|
||
|
|
e23046fd39
|
||
|
|
c9da2ebc45
|
||
|
|
a6a01be3e6
|
||
|
|
2755e5fb06
|
No files matched your search
@@ -0,0 +1,113 @@
|
||||
# Maintaining this package
|
||||
|
||||
Notes for whoever builds and ships the package. Nothing here is repeated
|
||||
from `README.md`, which describes the runtime surface, or from
|
||||
`instructions.md`, which is written for end users.
|
||||
|
||||
## Source layout
|
||||
|
||||
Kamado's own source is not vendored. The Makefile rsyncs `api/`, `ui/`
|
||||
and `ckpool/` from a sibling checkout into `./kamado-src/`, which is
|
||||
gitignored, before packing. Override the location with
|
||||
`KAMADO_SRC=/path/to/KamadoPool`.
|
||||
|
||||
```text
|
||||
startos/
|
||||
manifest/ id, image, volumes, bitcoind dependency
|
||||
main.ts subcontainer, config rendering, daemons, health checks
|
||||
interfaces.ts dashboard and the three stratum interfaces
|
||||
fileModels/ store.json
|
||||
actions/ the user-facing actions
|
||||
dependencies.ts bitcoind requirement and the ZMQ task
|
||||
backups.ts both volumes
|
||||
versions/ version graph and release notes
|
||||
init/ store seeding and init ordering
|
||||
i18n/ dictionaries for every user-facing string
|
||||
assets/scripts/ ckpool run wrapper, TLS certificate init
|
||||
Dockerfile ckpool, dashboard, API, runtime
|
||||
```
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Node and npm, Docker with buildx, `rsync`, and `start-cli`.
|
||||
|
||||
`start-cli` must be recent enough to pack `instructions.md`. Run
|
||||
`start-cli s9pk list-ingredients`: if `./instructions.md` is absent from
|
||||
the output, the build will silently ship without instructions and the
|
||||
StartOS instructions page will be blank. Older builds also lack the
|
||||
`--instructions` flag on `s9pk pack`.
|
||||
|
||||
`start-cli` resolves its configured StartOS host on every command,
|
||||
including local ones like `s9pk pack`. The workspace config at
|
||||
`.startos/config.yaml` (found by walking up from the working directory)
|
||||
sets that host under `host.default`, and it must be a name that resolves
|
||||
on the build machine even though packing never contacts it. The template
|
||||
that `s9pk init-workspace` writes points at a Start9 development host,
|
||||
which is what produces `Failed to resolve hostname` on a fresh workspace.
|
||||
|
||||
## Building
|
||||
|
||||
```sh
|
||||
npm ci # once
|
||||
make setup # once per boot: binfmt handlers and a multi-platform builder
|
||||
make # kamado-pool.s9pk, universal, ship this
|
||||
```
|
||||
|
||||
`make x86` and `make arm` emit single-arch packages and skip the other
|
||||
architecture, which is much faster while iterating.
|
||||
|
||||
Only the CKPool and runtime stages are built for the target
|
||||
architecture, and the aarch64 half of those runs under emulation on an
|
||||
x86 host, which is why `make setup` is needed. The dashboard and API
|
||||
stages pin `--platform=$BUILDPLATFORM` and cross compile instead: the
|
||||
dashboard emits architecture-independent assets, and the API is
|
||||
`CGO_ENABLED=0` with a pure-Go SQLite driver, so `GOARCH` cross
|
||||
compilation is exact and the two slowest stages never run emulated.
|
||||
|
||||
`make setup` installs binfmt handlers from `tonistiigi/binfmt`. The
|
||||
older `multiarch/qemu-user-static` image ships a qemu whose emulated gcc
|
||||
segfaults intermittently part way through the CKPool build, which
|
||||
presents as an unexplained compiler failure in bundled jansson or in the
|
||||
test link step.
|
||||
|
||||
## Build failures worth recognising
|
||||
|
||||
**`Failed to resolve hostname`.** The workspace host does not resolve.
|
||||
See Prerequisites above.
|
||||
|
||||
**A compiler crash inside the CKPool stage.** Usually emulation, not the
|
||||
code. Re-run `make`; cached layers make the retry cheap. If it recurs,
|
||||
confirm `make setup` installed the current binfmt handlers.
|
||||
|
||||
**`429 Too Many Requests` pulling base images.** Docker Hub's anonymous
|
||||
pull limit, reached easily when iterating. It clears on its own, or
|
||||
`docker login` raises the ceiling immediately.
|
||||
|
||||
## Installing
|
||||
|
||||
```sh
|
||||
make install
|
||||
```
|
||||
|
||||
Requires the workspace host to point at a real server. Otherwise
|
||||
sideload the produced `.s9pk` through the StartOS web interface, which
|
||||
accepts a reinstall of the same version.
|
||||
|
||||
## Release checklist
|
||||
|
||||
1. Add a version file under `startos/versions/` with release notes in
|
||||
every locale the package already supports, and register it in
|
||||
`versions/index.ts` as `current`, moving the previous version into
|
||||
`other` so existing installs keep a migration path.
|
||||
2. Keep `migrations` empty unless stored data actually changes shape,
|
||||
and say why in a comment either way.
|
||||
3. Update `README.md` if the runtime surface changed: processes,
|
||||
volumes, interfaces, actions, tasks, health checks, backups or
|
||||
limitations. Update `instructions.md` if operator-facing behaviour
|
||||
changed.
|
||||
4. Add any new user-facing string to the i18n dictionaries. The `i18n`
|
||||
helper is typed against them, so a missing entry fails the typecheck
|
||||
rather than shipping untranslated.
|
||||
5. `npm run check` and `make`, then confirm the packed manifest reports
|
||||
the intended version and that `instructions.md` is present in the
|
||||
archive.
|
||||
+2
-2
@@ -14,7 +14,7 @@
|
||||
# built for the target platform (emulated when building aarch64 on x86).
|
||||
# The UI and API stages pin --platform=$BUILDPLATFORM and cross-compile,
|
||||
# which is both correct and far faster than emulating them:
|
||||
# * the Svelte UI emits static assets — no target-arch code at all;
|
||||
# * the Svelte UI emits static assets, no target-arch code at all;
|
||||
# * kamado-api is CGO_ENABLED=0 with a pure-Go SQLite driver
|
||||
# (modernc.org/sqlite), so GOARCH cross-compilation is exact.
|
||||
|
||||
@@ -93,7 +93,7 @@ COPY assets/scripts/kamado-tls-init.sh /usr/local/bin/kamado-tls-init.sh
|
||||
RUN chmod +x /usr/local/bin/kamado-ckpool-run.sh /usr/local/bin/kamado-tls-init.sh \
|
||||
&& mkdir -p /etc/ckpool /run/ckpool
|
||||
|
||||
# Documents the defaults only — the stratum ports are user-configurable and
|
||||
# Documents the defaults only, the stratum ports are user-configurable and
|
||||
# StartOS publishes ports from the interface bindings, not from EXPOSE.
|
||||
EXPOSE 3333 3334 8080
|
||||
WORKDIR /root
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
Kamado Pool
|
||||
Copyright (C) 2026 Kamado Pool contributors
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
---
|
||||
|
||||
This project is built on top of CKPool by Con Kolivas, which is itself
|
||||
licensed under GPL-3.0. See https://bitbucket.org/ckolivas/ckpool for
|
||||
the upstream source. The full GPL-3.0 text is available at:
|
||||
https://www.gnu.org/licenses/gpl-3.0.txt
|
||||
@@ -1,13 +1,13 @@
|
||||
# Kamado Pool — StartOS 0.4.0 package.
|
||||
# Kamado Pool, StartOS 0.4.0 package.
|
||||
#
|
||||
# Prerequisites: node/npm, docker (with buildx), start-cli, rsync.
|
||||
# First run `npm ci`, then:
|
||||
# make -> kamado-pool.s9pk, the universal package (x86_64 +
|
||||
# aarch64 in one file) — this is what to ship.
|
||||
# aarch64 in one file), this is what to ship.
|
||||
# make x86 / arm -> single-arch packages, for faster dev iteration.
|
||||
#
|
||||
# Building the aarch64 image on an x86 host needs qemu binfmt handlers and
|
||||
# a builder that advertises linux/arm64 — `make setup` registers both.
|
||||
# a builder that advertises linux/arm64, `make setup` registers both.
|
||||
#
|
||||
# KamadoPool source is expected in a sibling checkout at ../KamadoPool
|
||||
# (override with `make KAMADO_SRC=/path/to/KamadoPool`). It is synced into
|
||||
@@ -30,7 +30,7 @@ KAMADO_DEPS := $(shell find "$(KAMADO_SRC)/api" "$(KAMADO_SRC)/ui" "$(KAMADO_SRC
|
||||
\( -name node_modules -o -name dist \) -prune -o -type f -print 2>/dev/null)
|
||||
|
||||
ifeq (,$(wildcard node_modules/@start9labs/start-sdk/s9pk.mk))
|
||||
$(error node_modules missing — run 'npm ci' first)
|
||||
$(error node_modules missing, run 'npm ci' first)
|
||||
endif
|
||||
|
||||
# overrides to s9pk.mk must precede the include statement
|
||||
|
||||
@@ -1,95 +1,214 @@
|
||||
# Kamado Pool — StartOS 0.4.0 Packaging
|
||||
<p align="center">
|
||||
<img src="icon.png" alt="Kamado Pool" width="160" />
|
||||
</p>
|
||||
|
||||
StartOS **0.4.0** wrapper for [Kamado Pool](../KamadoPool), a modern solo Bitcoin mining pool built on a patched fork of CKPool-solo with a Go middleware API and Svelte real-time dashboard.
|
||||
<h1 align="center">Kamado Pool</h1>
|
||||
|
||||
This is the 0.4.0 port of the [0.3.5.1 wrapper](../KamadoPool-StartOS-0351), rebuilt on the TypeScript `@start9labs/start-sdk` and the revised 0.4.0 service architecture.
|
||||
Kamado Pool is a solo Bitcoin mining pool: a patched CKPool-solo stratum server, a Go middleware API, and a Svelte dashboard, packaged as one StartOS service. Block rewards are paid by the coinbase directly to the address each miner connects with, so the service holds no balances and performs no payouts.
|
||||
|
||||
## What changed from the 0.3.5.1 package
|
||||
Everything not listed in this document should behave the same as upstream.
|
||||
|
||||
| 0.3.5.1 | 0.4.0 |
|
||||
## Image and Container Runtime
|
||||
|
||||
The package builds a single image from the repository Dockerfile and runs every process inside one shared subcontainer, so the API can reach CKPool's Unix socket and tail its log file without cross-container plumbing.
|
||||
|
||||
| Property | Value |
|
||||
|---|---|
|
||||
| `manifest.yaml` + Deno `embassy.js` procedures | `startos/` TypeScript package on `@start9labs/start-sdk` (npm), bundled with ncc |
|
||||
| Single container, `docker_entrypoint.sh` supervises ckpool + kamado-api + stunnel | One shared subcontainer, three daemons (`api`, `ckpool`, `stunnel`) + oneshots, individually health-checked and ordered by the SDK daemon runtime |
|
||||
| Config form (`getConfig`/`setConfig`) writing `start9/config.yaml` | `store.json` file model + **Configure** action with input spec; settings changes restart daemons reactively |
|
||||
| RPC credentials via config **pointers** to `bitcoind`/`bitcoind-testnet` | bitcoind **cookie** auth read from a read-only dependency mount; RPC/ZMQ reached over the LXC bridge address resolved reactively (no `.embassy` DNS) |
|
||||
| Two dependency variants (`bitcoind`, `bitcoind-testnet`) | Single `bitcoind` dependency; the active chain is detected at runtime from `getblockchaininfo` (the coinbase self-test address is chosen accordingly) |
|
||||
| No LAN TCP forwarding — users needed router forwards / simpleproxy for stratum | Stratum (and TLS stratum) exposed as **raw TCP host bindings**, directly reachable on the LAN. In-container ports are fixed constants; the configured value sets only the interface's `preferredExternalPort`, so a port change is a pure rebind that neither orphans a binding nor restarts the pool |
|
||||
| `properties` for TLS fingerprint/PEM | **Stratum TLS Certificate** action (fingerprint + PEM, copyable) |
|
||||
| Health checks: web / ckpool / bitcoin / submit-gap | Same four, plus an optional **ZMQ Block Feed** check, as daemon `ready` checks + standalone health checks |
|
||||
| duplicity backup of both volumes | `sdk.setupBackups` of both volumes (`main`, `ckpool`) |
|
||||
| compat migrations | `VersionGraph` with an `up` migration that converts a 0.3.5.1 `config.yaml` into `store.json` and preserves the SQLite DB, TLS cert, and ckpool state |
|
||||
| — | i18n (en, es, de, pl, fr) for all user-facing strings |
|
||||
| Image id | `main` |
|
||||
| Source | `Dockerfile` at the repository root |
|
||||
| Architectures | `x86_64`, `aarch64` |
|
||||
| Base | Debian slim |
|
||||
| Subcontainer | one shared instance for all processes |
|
||||
|
||||
Retained behavior: the ckpool restart loop gated on bitcoind reachability (now a daemon wrapper script), dual block-detection (ZMQ + 100 ms blockpoll), loopback stratum binds for TLS tagging (now one per certificate, declared to kamado-api via `STRATUM_SERVERS` so the dashboard names the certificate on hover), the v4 self-signed certificate with broad SANs, and ckpool loglevel 6 with `--log-shares`.
|
||||
The image is assembled in four stages: CKPool compiled from upstream source with the Kamado patch series applied, the dashboard built to static assets, the Go API cross compiled with those assets embedded in the binary, and a runtime stage carrying the two binaries plus `curl`, `jq`, `stunnel4` and `openssl`.
|
||||
|
||||
Stratum is exposed on **three** endpoints, each a separate interface and port. Plaintext, and two TLS paths that differ in who terminates them: **Stratum (TLS, Public Domain)** declares `addSsl`, so StartOS terminates it and issues/renews a Let's Encrypt certificate for any domain attached to it — this is the only way to get a publicly trusted certificate, because StartOS provisions ACME only for endpoints it terminates TLS for, and a raw TCP binding is offered no certificate authority at all. **Stratum (TLS, Local Network)** stays raw TCP terminated in-container by stunnel with the persisted self-signed certificate, for LAN miners that pin it — public CAs cannot sign a bare IP or `.local` name. Each forwards to its own ckpool bind, so `serverurl` index identifies the path and the dashboard padlock names the certificate in use.
|
||||
Processes, in start order:
|
||||
|
||||
## Prerequisites
|
||||
| Name | Kind | Purpose |
|
||||
|---|---|---|
|
||||
| `dirs` | oneshot | Creates the data, TLS, log and socket directories on the volumes |
|
||||
| `api` | daemon | Serves the dashboard, REST API and WebSocket feed; aggregates CKPool and Bitcoin Core state |
|
||||
| `ckpool` | daemon | Stratum server; waits for Bitcoin Core, detects the active chain, then execs CKPool |
|
||||
| `tls-cert` | oneshot | Generates the self-signed stratum certificate when absent or outdated |
|
||||
| `stunnel` | daemon | Terminates stratum TLS and forwards to CKPool's loopback bind |
|
||||
|
||||
- **Node.js + npm**
|
||||
- **Docker** with buildx
|
||||
- **start-cli** — from the [StartOS packaging guide](https://docs.start9.com/packaging/0.4.0.x/environment-setup.html)
|
||||
- **rsync**
|
||||
- **KamadoPool source** — local sibling checkout at `../KamadoPool` (override with `KAMADO_SRC=/path/to/KamadoPool`)
|
||||
## Volume and Data Layout
|
||||
|
||||
## Building
|
||||
Two volumes separate the service's own state from CKPool's, because they have different lifetimes and different restore semantics.
|
||||
|
||||
```sh
|
||||
npm ci # once — installs the SDK and bitcoin-core-startos (for typed dependency wiring)
|
||||
make setup # once per boot — qemu binfmt + a multi-platform buildx builder
|
||||
make # kamado-pool.s9pk — the universal package (ship this)
|
||||
| Volume | Mount point | Contents |
|
||||
|---|---|---|
|
||||
| `main` | `/root/.kamado` | SQLite database (found blocks, share statistics, accelerated transactions, log cursor), persisted stratum TLS certificate and key |
|
||||
| `ckpool` | `/root/.ckpool` | CKPool's own state directory and its log files |
|
||||
|
||||
Bitcoin Core's data directory is mounted read only at `/mnt/bitcoind`, solely to read the RPC cookie. Nothing is written there.
|
||||
|
||||
The rendered CKPool configuration and the stunnel configuration live on the subcontainer root filesystem rather than on a volume. Both are regenerated on every start, because both depend on values that are not known until the service runs: the active chain and the ports the OS actually assigned.
|
||||
|
||||
## File Models
|
||||
|
||||
The package owns one persisted settings file, and everything else it writes is regenerated from that file plus runtime state.
|
||||
|
||||
| File | Location | Seeded | Rewritten by |
|
||||
|---|---|---|---|
|
||||
| `store.json` | `main` volume | Defaults on first start, or migrated from the previous package format | The Configure action |
|
||||
| CKPool configuration | subcontainer rootfs | Rendered on every start | Service start, from `store.json` and the detected chain |
|
||||
| stunnel configuration | subcontainer rootfs | Rendered on every start | Service start, from `store.json` and the assigned ports |
|
||||
| TLS certificate and key | `main` volume | Generated on first start | The Regenerate TLS Certificate action, or automatically when the certificate format changes |
|
||||
|
||||
Hand edits do not survive. The two rendered configurations are overwritten on every start, and `store.json` is owned by the Configure action. Change settings through Configure rather than by editing files.
|
||||
|
||||
## Dependencies
|
||||
|
||||
Bitcoin Core is required. Kamado builds block templates from it, validates miner payout addresses against it, and submits solved blocks to it, so the service cannot mine without it.
|
||||
|
||||
| Dependency | Requirement | Health checks required | Mounts |
|
||||
|---|---|---|---|
|
||||
| Bitcoin Core | Required, must be running | Its own health check and its sync progress | Its data directory, read only, for the RPC cookie |
|
||||
|
||||
Sync progress is required deliberately. Mining against an unsynced node produces work on a stale chain tip, so an unsynced node is surfaced as an unsatisfied dependency rather than as a warning.
|
||||
|
||||
## Network Access and Interfaces
|
||||
|
||||
Four interfaces are published. The dashboard is a web interface; the three stratum interfaces are raw TCP endpoints that miners connect to directly, with no proxy in front of them.
|
||||
|
||||
| Interface | Type | Protocol | Purpose |
|
||||
|---|---|---|---|
|
||||
| Web Dashboard | ui | http | Dashboard, REST API and WebSocket feed |
|
||||
| Stratum | api | tcp | Plaintext stratum, the default for miners on a trusted network |
|
||||
| Stratum (TLS, Local Network) | api | tcp | Stratum over TLS using the package's self-signed certificate |
|
||||
| Stratum (TLS, Public Domain) | api | tcp | Stratum over TLS using a certificate StartOS issues for an attached domain |
|
||||
|
||||
All three stratum endpoints run at the same time on separate ports. The stratum ports are configurable, but the numbers set in Configure are requests rather than guarantees: the OS assigns a different port when the requested one is already claimed, and the Pool Status action reports the ports actually in use.
|
||||
|
||||
The two TLS interfaces exist because they are secured differently. The local-network one serves a self-signed certificate that miners must be told to trust, since no public certificate authority will sign a bare LAN address. The public-domain one relies on StartOS issuing and renewing a publicly trusted certificate for a domain attached to that interface, which requires that domain to be reachable for the issuance challenge.
|
||||
|
||||
The dashboard's API refuses cross-origin browser requests on its WebSocket and on every request that changes state, so another site cannot drive it using a signed-in browser session.
|
||||
|
||||
## Installation and First-Run Flow
|
||||
|
||||
Installation differs from upstream mainly in that there is no payout address to configure and no pool account to create.
|
||||
|
||||
1. Install and start Bitcoin Core and let it finish syncing. The dependency stays unsatisfied until it does.
|
||||
2. Accept the suggested task to enable ZMQ on Bitcoin Core. It is recommended rather than required; without it the service falls back to RPC polling.
|
||||
3. Start Kamado Pool. On first start it creates its directories, generates a self-signed stratum certificate, detects which chain Bitcoin Core is running, and renders the CKPool configuration for that chain.
|
||||
4. Open the Web Dashboard and point miners at the stratum port.
|
||||
|
||||
Miners authenticate with a Bitcoin address as the stratum username, optionally followed by a worker name for labelling. The service validates that username against Bitcoin Core and refuses to authorise a worker whose username is not a valid address on the active chain, so a misconfigured miner fails loudly instead of mining to nowhere.
|
||||
|
||||
## Actions
|
||||
|
||||
Every action is user-facing; none are hidden. Configure is the only one that changes settings, and the rest are diagnostic or maintenance operations.
|
||||
|
||||
| Action | Run it when | What it changes | Cost | Safe to repeat |
|
||||
|---|---|---|---|---|
|
||||
| Configure | Changing ports, vardiff, the coinbase tag, ZMQ, local TLS, log level or the explorer URL | Writes `store.json` | Rebinds interfaces; a port change does not restart the pool | Yes |
|
||||
| Pool Status | Diagnosing anything | Nothing | One pass of internal queries | Yes |
|
||||
| Stratum TLS Certificate | Setting up a miner that must trust the self-signed certificate | Nothing | Reads the stored certificate | Yes |
|
||||
| Regenerate TLS Certificate | Rotating an expired or distrusted certificate | Deletes the stored certificate and key | A fresh certificate is generated on the next start | Yes, but miners pinning the old fingerprint must be updated |
|
||||
| Reset Block Latency | After tuning ZMQ or the node, to start fresh measurements | Zeroes the block-update latency counters | Immediate | Yes |
|
||||
| Rebuild Share Statistics | The all-time difficulty distribution or rejection reasons look wrong | Replaces the stored totals, but only when the log accounts for more shares than they hold | Reads the entire CKPool log, which can run to millions of lines | Yes; a second run is refused while one is in progress |
|
||||
|
||||
Pool Status returns a full text report: dependency and sync state, pool health, connected miners, hashrate, found blocks, the gap between attempted and confirmed block submissions, the endpoints and any domains actually in use, and the state of proof-of-work header capture. Stratum TLS Certificate returns both the SHA-256 fingerprint, for firmware that pins fingerprints, and the full PEM, for firmware that accepts a custom root. Rebuild Share Statistics reports how many shares the log accounted for and whether the stored totals were replaced.
|
||||
|
||||
## Tasks
|
||||
|
||||
One task is raised, and only when the operator has asked for ZMQ.
|
||||
|
||||
| Task | Raised when | Severity | Cleared when |
|
||||
|---|---|---|---|
|
||||
| Enable ZMQ on Bitcoin Core | ZMQ is enabled in Configure and Bitcoin Core does not have its ZMQ publishers on | Important | Bitcoin Core's configuration matches, or ZMQ is turned off in Configure |
|
||||
|
||||
It is important rather than critical because the service degrades gracefully. Without ZMQ it polls the RPC for new blocks instead, at the cost of slower stale-work detection.
|
||||
|
||||
## Health Checks
|
||||
|
||||
Six checks cover the two daemons, the dependency, and three failure modes that process state alone cannot reveal.
|
||||
|
||||
| Check | Probes | Grace period | Failure means | Remediation |
|
||||
|---|---|---|---|---|
|
||||
| Web Dashboard | The dashboard port is accepting connections | 15 seconds | The API is not serving | Check the service logs |
|
||||
| Stratum Server | The stratum port is accepting connections | 30 seconds | Miners cannot connect | Check the service logs; CKPool waits for Bitcoin Core before it binds |
|
||||
| Bitcoin Core RPC | The API can reach Bitcoin Core and it reports itself synced | Startup only | No usable templates, so no useful work is served | Check that Bitcoin Core is running and synced |
|
||||
| Block Submission | Every attempted block submission reached confirmation | Startup only | A solved block was submitted but never confirmed | Check the Bitcoin Core logs; of these checks this is the one worth investigating immediately |
|
||||
| ZMQ Block Feed | Block notifications are still arriving, when ZMQ is enabled | Startup only | Notifications have gone stale and detection has fallen back to polling | Re-run the ZMQ task, or check Bitcoin Core's publishers |
|
||||
| Stratum TLS | The TLS stratum port is accepting connections, when local TLS is enabled | Startup only | Miners using TLS cannot connect | Confirm the certificate exists; regenerate it if not |
|
||||
|
||||
## Backups and Restore
|
||||
|
||||
Both volumes are backed up in full, because the service's history has no other source.
|
||||
|
||||
The `main` volume carries the SQLite database and the stratum TLS certificate, so a restore preserves found blocks, share statistics, best-share records, and the certificate that miners may have pinned. The `ckpool` volume carries CKPool's state and its logs. The logs are included deliberately rather than treated as disposable: the database holds a read cursor into them and the share statistics can be rebuilt from them, so restoring one without the other leaves the two inconsistent.
|
||||
|
||||
Nothing is excluded. There is no wallet, no key material beyond the stratum certificate, and no accounting state to rebuild, because rewards are paid by the coinbase directly to miners.
|
||||
|
||||
## Limitations and Differences
|
||||
|
||||
These are the places where the packaged service is narrower than upstream, or where the OS rather than the package has the final say. None of them prevent normal solo mining.
|
||||
|
||||
1. Only the chain Bitcoin Core is already running is supported. The service detects it at start; there is no chain selector.
|
||||
2. The stratum ports set in Configure are requests, not guarantees. The OS assigns a different port when the requested one is taken.
|
||||
3. The domain used for public-domain TLS is not a package setting. It follows whatever domain is attached to that interface, and only its port is configurable.
|
||||
4. Certificates for a public domain are issued by StartOS rather than by the package. If issuance fails, that endpoint serves the self-signed certificate instead, which public clients reject.
|
||||
5. The dashboard's read-only endpoints are not individually authenticated. Anything that can reach the dashboard port on the network can read pool data, including payout addresses and per-worker hashrates.
|
||||
6. Proof-of-work header capture covers only shares accepted after that feature was introduced. Earlier best shares cannot be reconstructed, because CKPool discards job data once work moves on.
|
||||
7. Share statistics can only be rebuilt as far back as the current CKPool log reaches.
|
||||
8. The service kills CKPool when Bitcoin Core becomes unreachable, so miners fail over to a backup pool instead of mining stale work. CKPool restarts automatically once Bitcoin Core recovers.
|
||||
|
||||
## Quick Reference for AI Consumers
|
||||
|
||||
The block below summarises the operable surface in one place, for tooling and support agents that need the shape of the service without reading the sections above.
|
||||
|
||||
```yaml
|
||||
service:
|
||||
purpose: solo Bitcoin mining pool; rewards paid by coinbase directly to the miner
|
||||
holds_funds: false
|
||||
payout_address: supplied by each miner as its stratum username
|
||||
|
||||
image:
|
||||
id: main
|
||||
architectures: [x86_64, aarch64]
|
||||
subcontainer: single, shared by all processes
|
||||
|
||||
processes:
|
||||
oneshots: [dirs, tls-cert]
|
||||
daemons: [api, ckpool, stunnel]
|
||||
|
||||
volumes:
|
||||
main: {mount: /root/.kamado, holds: [sqlite database, tls certificate]}
|
||||
ckpool: {mount: /root/.ckpool, holds: [ckpool state, logs]}
|
||||
bitcoind: {mount: /mnt/bitcoind, mode: read-only, purpose: rpc cookie}
|
||||
|
||||
dependencies:
|
||||
bitcoind: {required: true, must_be: [running, synced]}
|
||||
|
||||
interfaces:
|
||||
ui: {name: Web Dashboard, protocol: http}
|
||||
stratum: {protocol: tcp, tls: false}
|
||||
stratum-tls: {protocol: tcp, tls: self-signed}
|
||||
stratum-tls-public: {protocol: tcp, tls: issued-by-startos}
|
||||
|
||||
actions:
|
||||
configure: {mutates: settings}
|
||||
pool-status: {mutates: nothing, use_for: diagnosis}
|
||||
stratum-tls-certificate: {mutates: nothing, returns: [fingerprint, pem]}
|
||||
regenerate-tls-certificate: {mutates: tls certificate}
|
||||
reset-block-latency: {mutates: latency counters}
|
||||
rebuild-share-statistics: {mutates: all-time share statistics, cost: full log scan}
|
||||
|
||||
health_checks:
|
||||
[web dashboard, stratum server, bitcoin core rpc, block submission,
|
||||
zmq block feed, stratum tls]
|
||||
|
||||
tasks:
|
||||
enable-zmq: {target: bitcoind, severity: important, optional: true}
|
||||
|
||||
backups:
|
||||
volumes: [main, ckpool]
|
||||
excluded: none
|
||||
|
||||
first_run:
|
||||
requires: bitcoin core running and synced
|
||||
generates: self-signed stratum certificate
|
||||
configuration_needed: none for mining; miners supply their own payout address
|
||||
```
|
||||
|
||||
`make` produces a **universal `kamado-pool.s9pk`** carrying both the x86_64 and aarch64 images, so a single file installs on any StartOS machine. For faster iteration during development, `make x86` and `make arm` emit single-arch packages (`kamado-pool_x86_64.s9pk` / `kamado-pool_aarch64.s9pk`) and skip the other architecture entirely.
|
||||
|
||||
The Makefile syncs `../KamadoPool`'s `api/`, `ui/`, and `ckpool/` into `./kamado-src/` (gitignored) before packing; `start-cli s9pk pack` then builds the Docker image per architecture from the local `Dockerfile` (ckpool is cloned from the pinned upstream commit and patched with Kamado's patch series, the Svelte UI is embedded into the Go binary).
|
||||
|
||||
Only the ckpool stage and the runtime stage are built for the target architecture — the aarch64 half of those runs under qemu emulation on an x86 host, which is why `make setup` is required. The UI and API stages pin `--platform=$BUILDPLATFORM` and cross-compile instead: the Svelte build emits architecture-independent static assets, and `kamado-api` is `CGO_ENABLED=0` with a pure-Go SQLite driver, so `GOARCH` cross-compilation is exact and avoids emulating the two slowest stages.
|
||||
|
||||
**Note:** `start-cli s9pk pack` records a `gitHash` in the manifest and therefore requires this directory to be a git repository with at least one commit. Until you make one, you can point git at a throwaway repo just for the pack step:
|
||||
|
||||
```sh
|
||||
git init /tmp/stub && cd /tmp/stub && touch .stub && git add .stub && git commit -m stub
|
||||
GIT_DIR=/tmp/stub/.git make
|
||||
```
|
||||
|
||||
**Troubleshooting:** if the Docker build fails with DNS errors like `lookup registry-1.docker.io … connection refused` from inside buildkit, your buildx builder container cannot resolve DNS (common with systemd-resolved hosts). The `network=host` driver option in `make setup` is what avoids this.
|
||||
|
||||
### Install to your server
|
||||
|
||||
Configure `~/.startos/config.yaml` with your server, then:
|
||||
|
||||
```sh
|
||||
make install
|
||||
```
|
||||
|
||||
Or sideload the produced `kamado-pool.s9pk` through the StartOS web UI.
|
||||
|
||||
### Overrides
|
||||
|
||||
```sh
|
||||
make KAMADO_SRC=/path/to/KamadoPool
|
||||
```
|
||||
|
||||
## Package layout
|
||||
|
||||
```text
|
||||
startos/
|
||||
manifest/ id, images (local Dockerfile build), volumes, bitcoind dependency
|
||||
main.ts subcontainer, ckpool.conf + stunnel.conf rendering, daemons + health checks (fixed internal ports)
|
||||
interfaces.ts Web UI (http 8080), Stratum (raw TCP), Stratum TLS Local (raw TCP, stunnel/self-signed), Stratum TLS Public (addSsl, OS-terminated/Let's Encrypt)
|
||||
fileModels/ store.json (service settings, incl. stratum ports)
|
||||
actions/ Configure, Pool Status, Stratum TLS Certificate, Regenerate TLS Certificate, Reset Block Latency
|
||||
dependencies.ts bitcoind (running, synced) + ZMQ autoconfig task
|
||||
backups.ts volumes: main, ckpool
|
||||
versions/ 0.2.2:0, graph back to 0.2.0 with migration from the 0.3.5.1 wrapper
|
||||
init/ store seeding, init ordering
|
||||
i18n/ dictionaries (en, es, de, pl, fr)
|
||||
assets/
|
||||
scripts/ kamado-ckpool-run.sh (bitcoind wait + chain detect + exec ckpool), kamado-tls-init.sh (cert v4)
|
||||
Dockerfile ckpool (patched) + Svelte UI + Go API + runtime stage
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
GPL-3.0 — matches upstream Kamado and CKPool.
|
||||
@@ -1,8 +0,0 @@
|
||||
# TODO
|
||||
|
||||
- [ ] Replace the placeholder `packageRepo` / `upstreamRepo` / `marketingUrl` URLs in `startos/manifest/index.ts` once the repos are published.
|
||||
- [ ] Make a real first commit in this repo so packed s9pks record a meaningful `gitHash` (builds currently need the `GIT_DIR` stub described in the README).
|
||||
- [ ] Widen the `bitcoind` dependency floor check: the range is `>=28.4:13`, verified against Bitcoin Core 31.1 on-device.
|
||||
- [ ] Test the 0.3.5.1 → 0.4.0 update path on a device that has the old package installed (config migration, DB/TLS/ckpool state carry-over).
|
||||
- [ ] Consider pinning the `bitcoin-core-startos` dev dependency to `next/31.x` instead of `next/28.x`. It is a build-time type/constant dependency only — the host ids (`rpc`, `zmq`), ports (8332, 28332), action id (`autoconfig`), health-check ids (`bitcoind`, `sync-progress`) and the `zmqEnabled` field are identical in both branches — but matching the deployed 31.x package would catch upstream drift at typecheck time.
|
||||
- [ ] Consider converting `icon.png` to an SVG.
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# Kamado Pool — ckpool daemon wrapper for StartOS 0.4.0.
|
||||
# Kamado Pool, ckpool daemon wrapper for StartOS 0.4.0.
|
||||
#
|
||||
# main.ts renders /etc/ckpool/ckpool.conf.template into the subcontainer
|
||||
# rootfs with everything resolved except the coinbase-builder self-test
|
||||
@@ -8,14 +8,14 @@
|
||||
# 1. Blocks until bitcoind answers getblockchaininfo, so ckpool is never
|
||||
# launched into a wall. When kamado-api kills ckpool on bitcoind
|
||||
# failure (letting miners fail over to a backup pool), StartOS
|
||||
# restarts this daemon and the wait re-arms until bitcoind recovers —
|
||||
# restarts this daemon and the wait re-arms until bitcoind recovers,
|
||||
# the 0.3.x supervised-restart loop, expressed as a daemon.
|
||||
# 2. Detects the chain and substitutes a network-valid self-test address.
|
||||
# CKPool-solo uses the worker's stratum username as the payout address;
|
||||
# the conf `btcaddress` is only consulted once at startup to build and
|
||||
# validate a sample coinbase transaction against bitcoind. Since no
|
||||
# worker has connected yet at that point, we hand it the genesis block
|
||||
# coinbase address for the active network — always valid, and solo
|
||||
# coinbase address for the active network, always valid, and solo
|
||||
# mode never credits it a satoshi.
|
||||
# 3. Renders the final conf and execs ckpool.
|
||||
#
|
||||
@@ -54,7 +54,7 @@ case "${CHAIN}" in
|
||||
SELFTEST_ADDRESS="1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
|
||||
;;
|
||||
test|testnet4|signet|regtest)
|
||||
# Testnet genesis coinbase address — valid P2PKH on testnet-family
|
||||
# Testnet genesis coinbase address, valid P2PKH on testnet-family
|
||||
# networks (testnet3/testnet4/signet/regtest share address prefixes).
|
||||
SELFTEST_ADDRESS="mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn"
|
||||
;;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# Kamado Pool — stratum TLS certificate init (oneshot, idempotent).
|
||||
# Kamado Pool, stratum TLS certificate init (oneshot, idempotent).
|
||||
#
|
||||
# Generates the persisted self-signed stratum certificate the stunnel
|
||||
# daemon serves. Regenerates only when files are missing or the cert-format
|
||||
@@ -21,7 +21,7 @@ mkdir -p "${TLS_DIR}"
|
||||
# Bump TLS_CERT_VERSION any time the cert format/extensions change.
|
||||
# The startup check regenerates whenever the marker file is missing
|
||||
# or doesn't match this version. This is more reliable than poking
|
||||
# at the existing cert's extensions — we know *exactly* when a new
|
||||
# at the existing cert's extensions, we know *exactly* when a new
|
||||
# shape is required and the upgrade self-heals on next boot.
|
||||
# v4: broaden subjectAltName to cover mDNS / LAN / Tor hostnames
|
||||
# so miner firmwares that verify the SAN against the hostname
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 568 B After Width: | Height: | Size: 27 KiB |
+35
-20
@@ -1,40 +1,41 @@
|
||||
# Kamado Pool
|
||||
|
||||
Kamado is a solo Bitcoin mining pool built on a patched fork of CKPool-solo, with a Go middleware API and a real-time Svelte dashboard. When a miner connected to your Kamado instance solves a block, **the full block reward goes to the payout address that miner connected with** — no pool fees, no splits, no share accounting.
|
||||
Kamado is a solo Bitcoin mining pool built on a patched fork of CKPool-solo, with a Go middleware API and a real-time Svelte dashboard. When a miner connected to your Kamado instance solves a block, **the full block reward goes to the payout address that miner connected with**, no pool fees, no splits, no share accounting.
|
||||
|
||||
## What you get on StartOS
|
||||
|
||||
- **A running solo pool**: stratum server (ckpool), middleware API, and web dashboard, supervised as separate daemons with individual health checks.
|
||||
- **A real-time dashboard** with live hashrate, per-miner stats, hardware detection, block history, best-share leaderboards, and a transaction accelerator.
|
||||
- **Direct LAN stratum access**: StartOS 0.4.0 exposes the stratum TCP port on your network — no router port-forward or proxy needed (this was a 0.3.x limitation).
|
||||
- **Stratum TLS on both sides of the network**: a Let's Encrypt certificate issued by StartOS for miners connecting over a clearnet domain, and a persisted self-signed certificate for miners on the LAN — each on its own port, both alongside the plaintext endpoint.
|
||||
- **Direct LAN stratum access**: StartOS 0.4.0 exposes the stratum TCP port on your network, no router port-forward or proxy needed (this was a 0.3.x limitation).
|
||||
- **Stratum TLS on both sides of the network**: a Let's Encrypt certificate issued by StartOS for miners connecting over a clearnet domain, and a persisted self-signed certificate for miners on the LAN, each on its own port, both alongside the plaintext endpoint.
|
||||
- **Verifiable proof of work**: the actual block header behind your best share, with a full-screen walkthrough of the SHA-256 that anyone can repeat for themselves.
|
||||
|
||||
## Setup
|
||||
|
||||
1. Install and start **Bitcoin Core**. Kamado requires it running and synced; mining on an unsynced node produces invalid work.
|
||||
2. Accept the suggested task to enable **ZMQ** on Bitcoin Core (recommended — it gives sub-second new-block detection; without it Kamado falls back to RPC polling).
|
||||
2. Accept the suggested task to enable **ZMQ** on Bitcoin Core (recommended, it gives sub-second new-block detection; without it Kamado falls back to RPC polling).
|
||||
3. Start Kamado Pool and open the **Web Dashboard** from the interface list.
|
||||
|
||||
There is no payout address to configure. CKPool-solo pays the full block reward directly to whichever Bitcoin address the miner connects with as its stratum username — see **Connecting miners** below. Kamado validates worker usernames against Bitcoin Core and **refuses to authenticate any worker whose username is not a valid address on the active network**, so misconfigured miners fail loudly instead of silently mining to the wrong place.
|
||||
There is no payout address to configure. CKPool-solo pays the full block reward directly to whichever Bitcoin address the miner connects with as its stratum username, see **Connecting miners** below. Kamado validates worker usernames against Bitcoin Core and **refuses to authenticate any worker whose username is not a valid address on the active network**, so misconfigured miners fail loudly instead of silently mining to the wrong place.
|
||||
|
||||
## Connecting miners
|
||||
|
||||
The stratum port defaults to **3333** and can be changed in the *Configure* action — that setting is the network port your miners connect to. Check the **Stratum** interface after saving to see the port actually in use, since the OS assigns a different one if your choice is already claimed by another service. Point each miner at:
|
||||
The stratum port defaults to **3333** and can be changed in the *Configure* action, that setting is the network port your miners connect to. Check the **Stratum** interface after saving to see the port actually in use, since the OS assigns a different one if your choice is already claimed by another service. Point each miner at:
|
||||
|
||||
```text
|
||||
stratum+tcp://<your-server-lan-address>:<stratum-port>
|
||||
```
|
||||
|
||||
- **Username**: the Bitcoin address that should receive the block reward, optionally followed by `.workername` for labelling in the dashboard (e.g. `bc1q....myBitaxe`).
|
||||
- **Password**: ignored — anything works.
|
||||
- **Password**: ignored, anything works.
|
||||
|
||||
### Stratum over TLS
|
||||
|
||||
Kamado offers two separate TLS endpoints, because they are secured in different ways:
|
||||
|
||||
**Over the internet — Stratum (TLS, Public Domain).** Attach a domain to this interface in the StartOS UI and choose Let's Encrypt. StartOS obtains and renews the certificate and terminates TLS itself, so miners validate it against their normal root store with nothing pasted in. See *Reaching the pool from the internet* below — attaching the domain is not quite the whole setup.
|
||||
**Over the internet, Stratum (TLS, Public Domain).** Attach a domain to this interface in the StartOS UI and choose Let's Encrypt. StartOS obtains and renews the certificate and terminates TLS itself, so miners validate it against their normal root store with nothing pasted in. See *Reaching the pool from the internet* below, attaching the domain is not quite the whole setup.
|
||||
|
||||
**On your local network — Stratum (TLS, Local Network).** Enable **Stratum TLS (Local Network)** in *Configure* to serve a self-signed certificate on its own port. Public certificate authorities cannot sign a bare LAN IP or a `.local` name, so this path stays self-signed and miners must be told to trust it. Run the **Stratum TLS Certificate** action to get:
|
||||
**On your local network, Stratum (TLS, Local Network).** Enable **Stratum TLS (Local Network)** in *Configure* to serve a self-signed certificate on its own port. Public certificate authorities cannot sign a bare LAN IP or a `.local` name, so this path stays self-signed and miners must be told to trust it. Run the **Stratum TLS Certificate** action to get:
|
||||
|
||||
- the **SHA-256 fingerprint** for firmwares that pin fingerprints, and
|
||||
- the **full PEM** to paste into firmwares that accept a custom root (AxeOS exposes a *Stratum SSL Cert* field for exactly this).
|
||||
@@ -54,41 +55,55 @@ Miners outside your network use the **Stratum (TLS, Public Domain)** interface:
|
||||
stratum+ssl://<your-domain>:<public-tls-port>
|
||||
```
|
||||
|
||||
Set the miner to use its **system/built-in certificates** — a Let's Encrypt chain validates against any normal root store with nothing pasted in.
|
||||
Set the miner to use its **system/built-in certificates**, a Let's Encrypt chain validates against any normal root store with nothing pasted in.
|
||||
|
||||
Two things worth knowing if a certificate never appears:
|
||||
|
||||
- **Issuance validates on port 443 of your domain**, using the TLS-ALPN-01 challenge, regardless of which port the pool itself runs on. If your server isn't reachable on 443 for that name, issuance fails and StartOS falls back to a self-signed certificate that public clients reject.
|
||||
- **A hostname that has failed validation repeatedly gets rate-limited** by Let's Encrypt (5 failures per hostname per hour), and StartOS retries roughly every minute — so a name that failed early can stay stuck long after the original cause is fixed. Check `start-cli server logs | grep -i acme`; if you see `ACME order failed` looping, remove the domain to stop the retries, wait for the hour to clear, then re-add it. Using a fresh hostname sidesteps it entirely.
|
||||
- **A hostname that has failed validation repeatedly gets rate-limited** by Let's Encrypt (5 failures per hostname per hour), and StartOS retries roughly every minute, so a name that failed early can stay stuck long after the original cause is fixed. Check `start-cli server logs | grep -i acme`; if you see `ACME order failed` looping, remove the domain to stop the retries, wait for the hour to clear, then re-add it. Using a fresh hostname sidesteps it entirely.
|
||||
|
||||
## Proving your best share
|
||||
|
||||
Every share that sets a new record is stored with the block header behind it, version, previous block, merkle root, time, bits and nonce, plus the coinbase transaction and merkle branches needed to rebuild that merkle root. The dashboard's **best share** tile opens an analysis page, and **Show PoW** there opens the header itself, drawn as a block with every field in place.
|
||||
|
||||
This is worth having because a screenshot of a big difficulty number proves nothing, anyone can edit one, and a picture cannot show whether the work was ever done. The raw 80 bytes on that page are the share hash's exact preimage: anyone can hash them and see for themselves both that the hash is genuine and that finding it took the work claimed. Because the header commits to the previous block, and through the merkle root to the coinbase transaction that pays you, the proof cannot be lifted from another miner's share or replayed from a different block.
|
||||
|
||||
Press **Verify** and the page takes over the screen to replay the entire verification in your browser, from the real computation: rebuilding the merkle root fold by fold, padding the header into two 512-bit message blocks, then every SHA-256 compression round with a live view of all 256 bits of the working state, ending on the block hash and its comparison against the share and network targets. A copyable one-line terminal command is on the page too, if you would rather check it outside the browser entirely.
|
||||
|
||||
Headers are recorded from version 0.2.3 onward. A best share found before that cannot be reconstructed, CKPool discards job data once work moves on, so until a new record is set, the page shows the best share since the update and says so plainly.
|
||||
|
||||
## Configuration
|
||||
|
||||
Everything lives in the **Configure** action: the three stratum ports (plaintext, local-network TLS, public-domain TLS), vardiff (starting/min/max difficulty), idle-client disconnect, the coinbase tag embedded in solved blocks, ZMQ, local-network TLS, log level, and an optional self-hosted mempool explorer URL for dashboard links.
|
||||
|
||||
Which domain is used for public TLS is deliberately *not* a config option — it follows whatever you attach to the **Stratum (TLS, Public Domain)** interface, so there is no second copy of that setting to drift out of sync with what the OS actually has. Only its port lives in *Configure*.
|
||||
Which domain is used for public TLS is deliberately *not* a config option, it follows whatever you attach to the **Stratum (TLS, Public Domain)** interface, so there is no second copy of that setting to drift out of sync with what the OS actually has. Only its port lives in *Configure*.
|
||||
|
||||
Changing a port rebinds the interface without restarting the pool, so miners already connected on other ports keep hashing — but anything pointed at the old port must be updated. Setting any two of the three ports to the same number is rejected when you save.
|
||||
Changing a port rebinds the interface without restarting the pool, so miners already connected on other ports keep hashing, but anything pointed at the old port must be updated. Setting any two of the three ports to the same number is rejected when you save.
|
||||
|
||||
## Actions
|
||||
|
||||
- **Pool Status** — full text snapshot: Bitcoin Core sync, ckpool health, miners, hashrate, found blocks, submit-gap diagnostics.
|
||||
- **Stratum TLS Certificate** — fingerprint + PEM for miner setup.
|
||||
- **Regenerate TLS Certificate** — clears the cert; a fresh one is generated on next start.
|
||||
- **Reset Block Latency** — zeroes the block-update latency counters after tuning.
|
||||
- **Pool Status**: full text snapshot: Bitcoin Core sync, ckpool health, miners, hashrate, found blocks, submit-gap and proof-of-work capture diagnostics.
|
||||
- **Stratum TLS Certificate**: fingerprint + PEM for miner setup.
|
||||
- **Regenerate TLS Certificate**: clears the cert; a fresh one is generated on next start.
|
||||
- **Reset Block Latency**: zeroes the block-update latency counters after tuning.
|
||||
- **Rebuild Share Statistics**: recounts the all-time difficulty distribution and rejection reasons by rereading CKPool's log, for when those totals look wrong.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- **No miners appear after connecting**: check the Stratum interface for the right port, and confirm the miner reaches it (`telnet <server> <port>`). Check the Kamado logs.
|
||||
- **Bitcoin Core RPC errors**: make sure Bitcoin Core is running and fully synced; Kamado's *Bitcoin Core RPC* health check shows the current state.
|
||||
- **Best share resets to 0 after a block is found**: upstream CKPool zeroes the "current round" best diff on solve. Kamado ships a patch that also exposes the all-time best, so the dashboard has both columns.
|
||||
- **The proof-of-work page is empty**: headers are only recorded from 0.2.3 onward, and only for shares accepted after the service restarted into that version, nothing earlier can be reconstructed. The next accepted share fills it in. If it stays empty, the **Pool Status** action traces the capture pipeline link by link and names which one is broken.
|
||||
- **All-time share statistics look wrong or reset**: run the **Rebuild Share Statistics** action. It recounts them from CKPool's log, and only replaces the stored totals when the log accounts for more shares than they hold, so it can restore history but never erase it.
|
||||
- **A burst of rejected shares right after restarting**: fixed in 0.2.3. Earlier versions sent miners work before telling them the difficulty and reset every miner to the pool's starting difficulty, so the first shares after each restart came back rejected. If you still see it, confirm the service is on 0.2.3 or later.
|
||||
- **Miner rejects the TLS certificate**: re-check that the PEM was pasted completely (including the BEGIN/END lines), or pin the SHA-256 fingerprint, or disable verification in the miner.
|
||||
- **A miner set to system certificates rejects the public-domain endpoint** (`No matching trusted root certificate found`, mbedTLS `-0x2700`/`-0x3000`): StartOS is serving its own self-signed certificate because Let's Encrypt never issued one. Check `start-cli server logs | grep -i acme` for `ACME order failed`, and confirm your server is reachable on **port 443** for that domain — that is where the TLS-ALPN-01 challenge is performed, whatever port the pool runs on. A hostname that failed repeatedly may also be rate-limited; see *Reaching the pool from the internet* above. Verify what is actually served with:
|
||||
- **A miner set to system certificates rejects the public-domain endpoint** (`No matching trusted root certificate found`, mbedTLS `-0x2700`/`-0x3000`): StartOS is serving its own self-signed certificate because Let's Encrypt never issued one. Check `start-cli server logs | grep -i acme` for `ACME order failed`, and confirm your server is reachable on **port 443** for that domain, that is where the TLS-ALPN-01 challenge is performed, whatever port the pool runs on. A hostname that failed repeatedly may also be rate-limited; see *Reaching the pool from the internet* above. Verify what is actually served with:
|
||||
|
||||
```sh
|
||||
openssl s_client -connect <domain>:<port> -servername <domain> </dev/null 2>/dev/null | openssl x509 -noout -issuer
|
||||
```
|
||||
- **Miner rejects the certificate on a public domain**: make sure it is connecting by the domain name, not by IP — the certificate is only valid for the name. If it is using the name and still fails, the firmware's CA root store may not include Let's Encrypt's ISRG Root X1; pin the certificate or use the plaintext endpoint for that miner.
|
||||
- **The public domain's certificate is not being served**: it takes a few minutes after adding a domain for StartOS to complete the ACME challenge, and the certificate is the OS's to issue — check the domain on the **Stratum (TLS, Public Domain)** interface, that its DNS points at your server, and that the port is reachable from the internet. The other endpoints keep serving meanwhile.
|
||||
- **Miner rejects the certificate on a public domain**: make sure it is connecting by the domain name, not by IP, the certificate is only valid for the name. If it is using the name and still fails, the firmware's CA root store may not include Let's Encrypt's ISRG Root X1; pin the certificate or use the plaintext endpoint for that miner.
|
||||
- **The public domain's certificate is not being served**: it takes a few minutes after adding a domain for StartOS to complete the ACME challenge, and the certificate is the OS's to issue, check the domain on the **Stratum (TLS, Public Domain)** interface, that its DNS points at your server, and that the port is reachable from the internet. The other endpoints keep serving meanwhile.
|
||||
|
||||
## Upstream
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ export const inputSpec = InputSpec.of({
|
||||
stratumTlsPort: Value.number({
|
||||
name: i18n('Preferred Stratum TLS Port (Local Network)'),
|
||||
description: i18n(
|
||||
'Network port to publish local-network TLS stratum on, using the self-signed certificate. A request, not a guarantee — see Pool Status for the port actually in use.',
|
||||
'Network port to publish local-network TLS stratum on, using the self-signed certificate. A request, not a guarantee, see Pool Status for the port actually in use.',
|
||||
),
|
||||
required: true,
|
||||
default: defaultStratumTlsPort,
|
||||
@@ -37,7 +37,7 @@ export const inputSpec = InputSpec.of({
|
||||
stratumPublicTlsPort: Value.number({
|
||||
name: i18n('Preferred Stratum TLS Port (Public Domain)'),
|
||||
description: i18n(
|
||||
'Network port to publish public-domain TLS stratum on. A domain attached to the Stratum (TLS, Public Domain) interface is published on THIS port, which can differ from the one the OS assigns for IP access, and StartOS issues a Let’s Encrypt certificate for it — miners validate it with nothing pasted in. See Pool Status for the ports and domains actually in use.',
|
||||
'Network port to publish public-domain TLS stratum on. A domain attached to the Stratum (TLS, Public Domain) interface is published on THIS port, which can differ from the one the OS assigns for IP access, and StartOS issues a Let’s Encrypt certificate for it, miners validate it with nothing pasted in. See Pool Status for the ports and domains actually in use.',
|
||||
),
|
||||
required: true,
|
||||
default: defaultStratumPublicTlsPort,
|
||||
@@ -63,7 +63,7 @@ export const inputSpec = InputSpec.of({
|
||||
}),
|
||||
// Storage key stays `tlsEnabled` so existing installs keep their setting;
|
||||
// only the scope it describes narrowed. TLS over a public domain is not
|
||||
// covered by this toggle — it follows the domains attached to the Stratum
|
||||
// covered by this toggle, it follows the domains attached to the Stratum
|
||||
// (TLS) interface and needs no configuration here.
|
||||
tlsEnabled: Value.toggle({
|
||||
name: i18n('Stratum TLS (Local Network)'),
|
||||
@@ -159,7 +159,7 @@ export const config = sdk.Action.withInput(
|
||||
async ({ effects, input }) => {
|
||||
// Refuse an unusable pair (both stratum ports set to the same number).
|
||||
// In-container ports are fixed constants, so the user can no longer create
|
||||
// a bind collision — only an ambiguous external-port request.
|
||||
// a bind collision, only an ambiguous external-port request.
|
||||
const conflict = validatePorts({
|
||||
stratumPort: input.stratumPort,
|
||||
stratumTlsPort: input.stratumTlsPort,
|
||||
|
||||
@@ -121,7 +121,7 @@ interface Snapshot {
|
||||
hash: string
|
||||
seen_at: string
|
||||
}
|
||||
// Log-derived (tailer) session stats — nonzero proves kamado-api is
|
||||
// Log-derived (tailer) session stats, nonzero proves kamado-api is
|
||||
// actually reading ckpool's log, as opposed to the socket-derived
|
||||
// share counters above.
|
||||
diff_dist_session: number[]
|
||||
@@ -256,13 +256,13 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
const sep = () => log('──────────────────────────────────────────')
|
||||
let allPass = true
|
||||
|
||||
log('Kamado Pool — Status')
|
||||
log('Kamado Pool, Status')
|
||||
sep()
|
||||
|
||||
// ── 1. Full snapshot ────────────────────────────────────────────────────
|
||||
log('● Pool & Bitcoin Core status')
|
||||
if (!snap) {
|
||||
log(' API unreachable — service may still be starting.')
|
||||
log(' API unreachable, service may still be starting.')
|
||||
allPass = false
|
||||
}
|
||||
|
||||
@@ -280,8 +280,8 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
log(
|
||||
` Sync: ${
|
||||
ibd
|
||||
? `IBD — ${syncPct}% (pool will not mine until synced)`
|
||||
: `${syncPct}% — fully synced`
|
||||
? `IBD, ${syncPct}% (pool will not mine until synced)`
|
||||
: `${syncPct}%, fully synced`
|
||||
}`,
|
||||
)
|
||||
log(` Block hash: ${chain.bestblockhash}`)
|
||||
@@ -304,9 +304,7 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
const age = snap.has_last_zmq_event
|
||||
? `last event ${snap.last_zmq_event_age.toFixed(0)}s ago`
|
||||
: 'no event yet since startup'
|
||||
log(
|
||||
` ZMQ: ${snap.zmq_stale ? 'STALE — ' : 'OK — '}${age}`,
|
||||
)
|
||||
log(` ZMQ: ${snap.zmq_stale ? 'STALE, ' : 'OK, '}${age}`)
|
||||
if (snap.zmq_stale) allPass = false
|
||||
} else {
|
||||
log(` ZMQ: disabled`)
|
||||
@@ -339,7 +337,7 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
` Submit attempts: ${snap.block_submit_attempts} confirmed: ${snap.block_submits_confirmed}`,
|
||||
)
|
||||
log(
|
||||
` Submit gap: ${gap > 0 ? `WARN — ${gap} unconfirmed` : 'OK (all confirmed)'}`,
|
||||
` Submit gap: ${gap > 0 ? `WARN, ${gap} unconfirmed` : 'OK (all confirmed)'}`,
|
||||
)
|
||||
if (gap > 0) allPass = false
|
||||
|
||||
@@ -361,7 +359,7 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
|
||||
if (snap.workers && snap.workers.length > 0) {
|
||||
log('')
|
||||
log('● Workers — best shares')
|
||||
log('● Workers, best shares')
|
||||
for (const w of snap.workers) {
|
||||
const ever = w.bestever > 0 ? w.bestever : w.bestdiff
|
||||
log(
|
||||
@@ -431,7 +429,7 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
log('')
|
||||
log('● PoW capture (best-share header inspector)')
|
||||
log(
|
||||
` ckpool binary: ${pow.binaryPatched ? 'patched (0008) ✓' : 'NOT PATCHED — image predates patch 0008'}`,
|
||||
` ckpool binary: ${pow.binaryPatched ? 'patched (0008) ✓' : 'NOT PATCHED, image predates patch 0008'}`,
|
||||
)
|
||||
log(
|
||||
` ckpool log: ${pow.logPowLines} PoW data line${pow.logPowLines === 1 ? '' : 's'}, ${pow.logAcceptedLines} accepted-share lines`,
|
||||
@@ -440,11 +438,11 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
log(
|
||||
` kamado-api: ${
|
||||
snapPow
|
||||
? `record held — diff ${fmtDiff(snapPow.sdiff)} at height ${snapPow.height} (${snapPow.seen_at.slice(0, 19)})`
|
||||
? `record held, diff ${fmtDiff(snapPow.sdiff)} at height ${snapPow.height} (${snapPow.seen_at.slice(0, 19)})`
|
||||
: 'no PoW record in snapshot'
|
||||
}`,
|
||||
)
|
||||
// Log-derived session stats prove the tailer reads the log at all —
|
||||
// Log-derived session stats prove the tailer reads the log at all,
|
||||
// the share counters above come from ckpool's socket instead.
|
||||
const tailerShares = (snap?.diff_dist_session ?? []).reduce(
|
||||
(a, b) => a + b,
|
||||
@@ -455,10 +453,13 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
)
|
||||
// Replay kamado-api's parse on the newest real PoW line: decode one
|
||||
// brace-balanced JSON object after the marker, ignoring any trailing
|
||||
// bytes — the same tolerance the Go parser applies.
|
||||
// bytes, the same tolerance the Go parser applies.
|
||||
if (pow.lastPowLine) {
|
||||
let parseVerdict: string
|
||||
const start = pow.lastPowLine.indexOf('{', pow.lastPowLine.indexOf('Best share PoW data'))
|
||||
const start = pow.lastPowLine.indexOf(
|
||||
'{',
|
||||
pow.lastPowLine.indexOf('Best share PoW data'),
|
||||
)
|
||||
if (start < 0) {
|
||||
parseVerdict = 'NO JSON OBJECT after marker'
|
||||
} else {
|
||||
@@ -481,7 +482,7 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
}
|
||||
}
|
||||
if (end < 0) {
|
||||
parseVerdict = 'UNTERMINATED JSON — line truncated mid-record'
|
||||
parseVerdict = 'UNTERMINATED JSON, line truncated mid-record'
|
||||
} else {
|
||||
try {
|
||||
const j = JSON.parse(pow.lastPowLine.slice(start, end + 1))
|
||||
@@ -490,7 +491,7 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
? `parses ✓ (sdiff ${fmtDiff(j.sdiff ?? 0)}, height ${j.height}, header 160 hex)`
|
||||
: `JSON ok but header field is ${typeof j.header === 'string' ? `${j.header.length} chars` : 'missing'}`
|
||||
} catch (e) {
|
||||
parseVerdict = `JSON PARSE FAILED — ${String(e).slice(0, 120)}`
|
||||
parseVerdict = `JSON PARSE FAILED, ${String(e).slice(0, 120)}`
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -505,17 +506,17 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
allPass = false
|
||||
} else if (pow.logAcceptedLines === 0) {
|
||||
log(
|
||||
' → verdict: no accepted shares in the current log file — ckpool logging problem or log freshly rotated. Wait for shares, then re-run.',
|
||||
' → verdict: no accepted shares in the current log file, ckpool logging problem or log freshly rotated. Wait for shares, then re-run.',
|
||||
)
|
||||
allPass = false
|
||||
} else if (pow.logPowLines === 0) {
|
||||
log(
|
||||
' → verdict: binary is patched but has never logged PoW data — the running ckpool process likely predates the update. Restart the service.',
|
||||
' → verdict: binary is patched but has never logged PoW data, the running ckpool process likely predates the update. Restart the service.',
|
||||
)
|
||||
allPass = false
|
||||
} else if (!snapPow) {
|
||||
log(
|
||||
' → verdict: ckpool logged PoW data but kamado-api holds no record — restart the service so the startup backfill adopts it from the log.',
|
||||
' → verdict: ckpool logged PoW data but kamado-api holds no record, restart the service so the startup backfill adopts it from the log.',
|
||||
)
|
||||
allPass = false
|
||||
} else {
|
||||
@@ -546,11 +547,11 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
log(`● Stratum (port ${stratumPort})`)
|
||||
if (snap?.ckpool_ok) {
|
||||
log(
|
||||
' ckpool process: healthy — stratum port is served by the same process',
|
||||
' ckpool process: healthy, stratum port is served by the same process',
|
||||
)
|
||||
} else {
|
||||
log(
|
||||
' FAIL — ckpool is not running, stratum port will not accept connections',
|
||||
' FAIL, ckpool is not running, stratum port will not accept connections',
|
||||
)
|
||||
}
|
||||
|
||||
@@ -559,8 +560,8 @@ export const poolStatus = sdk.Action.withoutInput(
|
||||
sep()
|
||||
const pass = allPass && (snap?.ckpool_ok ?? false)
|
||||
const summary = pass
|
||||
? i18n('PASS — pool is healthy')
|
||||
: i18n('FAIL — see details above')
|
||||
? i18n('PASS, pool is healthy')
|
||||
: i18n('FAIL, see details above')
|
||||
log(`Overall: ${summary}`)
|
||||
|
||||
return {
|
||||
|
||||
@@ -10,7 +10,7 @@ export const rebuildShareStats = sdk.Action.withoutInput(
|
||||
async ({ effects }) => ({
|
||||
name: i18n('Rebuild Share Statistics'),
|
||||
description: i18n(
|
||||
'Recounts the all-time share statistics — the difficulty distribution and rejection reasons on the Stats page — by rereading CKPool’s log from the beginning. Use this if those totals look wrong or reset. The stored totals are only replaced when the log accounts for more shares than they do, so this can add history back but never erase it.',
|
||||
'Recounts the all-time share statistics, the difficulty distribution and rejection reasons on the Stats page, by rereading CKPool’s log from the beginning. Use this if those totals look wrong or reset. The stored totals are only replaced when the log accounts for more shares than they do, so this can add history back but never erase it.',
|
||||
),
|
||||
warning: i18n(
|
||||
'On a pool with a long history this reads millions of log lines and can take a while. The pool keeps mining throughout.',
|
||||
@@ -43,7 +43,7 @@ export const rebuildShareStats = sdk.Action.withoutInput(
|
||||
version: '1',
|
||||
title: i18n('Rebuild Share Statistics'),
|
||||
message: i18n(
|
||||
'Failed to rebuild share statistics — the Kamado API did not respond',
|
||||
'Failed to rebuild share statistics, the Kamado API did not respond',
|
||||
),
|
||||
result: null,
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ export const regenTlsCert = sdk.Action.withoutInput(
|
||||
const hadCert = removed.length > 0
|
||||
const message = hadCert
|
||||
? i18n(
|
||||
'TLS certificate cleared — restart the service to generate a new one',
|
||||
'TLS certificate cleared, restart the service to generate a new one',
|
||||
)
|
||||
: i18n('No TLS certificate files found (TLS may not have been enabled)')
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ export const resetLatency = sdk.Action.withoutInput(
|
||||
version: '1',
|
||||
title: i18n('Reset Block Latency'),
|
||||
message: i18n(
|
||||
'Failed to reset latency stats — the Kamado API did not respond',
|
||||
'Failed to reset latency stats, the Kamado API did not respond',
|
||||
),
|
||||
result: null,
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ export const showTlsCert = sdk.Action.withoutInput(
|
||||
const tlsPort =
|
||||
(await storeJson.read((s) => s.stratumTlsPort).once()) ??
|
||||
defaultStratumTlsPort
|
||||
const notYet = i18n('(not yet generated — start the service once)')
|
||||
const notYet = i18n('(not yet generated, start the service once)')
|
||||
const fingerprint = await readFile(
|
||||
sdk.volumes.main.subpath('tls/fingerprint.txt'),
|
||||
'utf-8',
|
||||
@@ -51,7 +51,7 @@ export const showTlsCert = sdk.Action.withoutInput(
|
||||
version: '1',
|
||||
title: i18n('Stratum TLS Certificate'),
|
||||
message: i18n(
|
||||
'Connect miners with stratum+ssl:// to the Stratum (TLS, Local Network) interface. The certificate is self-signed: paste the PEM into firmware that accepts a custom root, pin the fingerprint, or disable verification. Miners connecting over a public domain do not need any of this — they use the Stratum (TLS, Public Domain) interface and its CA-issued certificate.',
|
||||
'Connect miners with stratum+ssl:// to the Stratum (TLS, Local Network) interface. The certificate is self-signed: paste the PEM into firmware that accepts a custom root, pin the fingerprint, or disable verification. Miners connecting over a public domain do not need any of this, they use the Stratum (TLS, Public Domain) interface and its CA-issued certificate.',
|
||||
),
|
||||
result: {
|
||||
type: 'group',
|
||||
|
||||
@@ -19,7 +19,7 @@ export const setDependencies = sdk.setupDependencies(async ({ effects }) => {
|
||||
},
|
||||
when: { condition: 'input-not-matches', once: false },
|
||||
reason: i18n(
|
||||
'Kamado Pool uses ZMQ block notifications for sub-second stale-work detection — every second of stale work in solo mode is hashrate burned on a dead block.',
|
||||
'Kamado Pool uses ZMQ block notifications for sub-second stale-work detection, every second of stale work in solo mode is hashrate burned on a dead block.',
|
||||
),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ export const storeJson = FileHelper.json(
|
||||
},
|
||||
z.object({
|
||||
/**
|
||||
* EXTERNAL port miners connect to for plaintext stratum — requested as the
|
||||
* EXTERNAL port miners connect to for plaintext stratum, requested as the
|
||||
* interface's `preferredExternalPort`. The in-container bind is a fixed
|
||||
* constant (see utils.ts), so changing this rebinds without restarting
|
||||
* ckpool and never orphans a binding.
|
||||
@@ -39,8 +39,8 @@ export const storeJson = FileHelper.json(
|
||||
/**
|
||||
* EXTERNAL port for TLS stratum with a CA-issued certificate, terminated
|
||||
* by StartOS. Separate from stratumTlsPort because the two endpoints are
|
||||
* terminated by different things — the OS owns this one, stunnel owns the
|
||||
* other — and a single external port cannot be handed to both.
|
||||
* terminated by different things, the OS owns this one, stunnel owns the
|
||||
* other, and a single external port cannot be handed to both.
|
||||
*/
|
||||
stratumPublicTlsPort: z
|
||||
.number()
|
||||
@@ -73,7 +73,7 @@ export const storeJson = FileHelper.json(
|
||||
* Internal state, not a config field: signature of the port assignment the
|
||||
* user was last warned about (see portAssignmentSignature). Lets main warn
|
||||
* once per distinct outcome instead of on every start, and re-warn if the
|
||||
* assignment later changes. main must never read this reactively — it is
|
||||
* assignment later changes. main must never read this reactively, it is
|
||||
* written from main, and a reactive read would restart the service in a
|
||||
* loop.
|
||||
*/
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
export const DEFAULT_LANG = 'en_US'
|
||||
|
||||
const dict = {
|
||||
'(not yet generated — start the service once)': 0,
|
||||
'(not yet generated, start the service once)': 0,
|
||||
'Serve the self-signed certificate on the TLS stratum port, for miners on your local network. Miners have to trust it (see the Stratum TLS Certificate action) or connect with verification disabled. You do NOT need this for miners connecting over a public domain: attach the domain to the Stratum (TLS) interface and StartOS issues a publicly trusted certificate automatically.': 1,
|
||||
'All block submissions confirmed': 2,
|
||||
'All latency counters (count, avg, last, wasted work) have been cleared. New measurements will accumulate from the next block.': 3,
|
||||
@@ -27,15 +27,15 @@ const dict = {
|
||||
'Drop Idle (seconds)': 23,
|
||||
'Enable Stratum TLS in Configure first': 24,
|
||||
Error: 25,
|
||||
'FAIL — see details above': 26,
|
||||
'Failed to reset latency stats — the Kamado API did not respond': 27,
|
||||
'FAIL, see details above': 26,
|
||||
'Failed to reset latency stats, the Kamado API did not respond': 27,
|
||||
'Fingerprint (SHA-256)': 28,
|
||||
'Floor for the vardiff algorithm.': 29,
|
||||
'Full self-signed certificate. Copy the whole block including the BEGIN/END CERTIFICATE markers.': 30,
|
||||
Info: 31,
|
||||
'Initial vardiff target for new miner connections. Bitaxe-class miners typically land around 16384.': 32,
|
||||
'Kamado API is unreachable — service may be down': 33,
|
||||
'Kamado Pool uses ZMQ block notifications for sub-second stale-work detection — every second of stale work in solo mode is hashrate burned on a dead block.': 34,
|
||||
'Kamado API is unreachable, service may be down': 33,
|
||||
'Kamado Pool uses ZMQ block notifications for sub-second stale-work detection, every second of stale work in solo mode is hashrate burned on a dead block.': 34,
|
||||
'Log Level': 35,
|
||||
'Maximum Difficulty': 36,
|
||||
'Miners connected via TLS will be disconnected on restart and will need to accept or re-pin the new certificate fingerprint.': 37,
|
||||
@@ -44,7 +44,7 @@ const dict = {
|
||||
'Next steps:': 40,
|
||||
'No TLS certificate files found (TLS may not have been enabled)': 41,
|
||||
'No certificate files were present.': 42,
|
||||
'PASS — pool is healthy': 43,
|
||||
'PASS, pool is healthy': 43,
|
||||
'Plaintext stratum endpoint. Point miners here with their Bitcoin payout address as the username': 44,
|
||||
'Pool Status': 45,
|
||||
'Provide the new fingerprint or PEM to miners that pin the certificate.': 46,
|
||||
@@ -64,7 +64,7 @@ const dict = {
|
||||
'Stratum TLS Certificate': 60,
|
||||
"Subscribe to Bitcoin Core's hashblock ZMQ topic for sub-second block detection. RPC polling remains active as a fallback either way.": 61,
|
||||
'TLS Port (internal)': 62,
|
||||
'TLS certificate cleared — restart the service to generate a new one': 63,
|
||||
'TLS certificate cleared, restart the service to generate a new one': 63,
|
||||
'TLS stratum is accepting connections': 64,
|
||||
'TLS stratum is not accepting connections': 65,
|
||||
'TLS-encrypted stratum endpoint. Miners on a public domain attached here get a CA-issued certificate automatically; on the local network the self-signed certificate is used (see the Stratum TLS Certificate action)': 66,
|
||||
@@ -78,44 +78,44 @@ const dict = {
|
||||
'Web Dashboard': 74,
|
||||
'ZMQ Block Feed': 75,
|
||||
'ZMQ Block Notifications': 76,
|
||||
'ZMQ block feed is stale — block notifications are falling back to RPC polling': 77,
|
||||
'ZMQ block feed is stale, block notifications are falling back to RPC polling': 77,
|
||||
'ZMQ block notifications are flowing': 78,
|
||||
'Zeroes the block-update latency counters (avg, last, wasted work, block count). Use this after tuning ZMQ or ckpool to start fresh measurements.': 79,
|
||||
'block(s) submitted to bitcoind but not confirmed — check Bitcoin Core logs': 80,
|
||||
'block(s) submitted to bitcoind but not confirmed, check Bitcoin Core logs': 80,
|
||||
seconds: 81,
|
||||
'Stratum Port': 82,
|
||||
'TCP port the plaintext stratum server listens on. StartOS also tries to publish the pool on this same port number on your network, so this is normally the port you give your miners — check the Stratum interface after saving, since the OS will pick a different external port if this one is already taken.': 83,
|
||||
'TCP port the plaintext stratum server listens on. StartOS also tries to publish the pool on this same port number on your network, so this is normally the port you give your miners, check the Stratum interface after saving, since the OS will pick a different external port if this one is already taken.': 83,
|
||||
'Stratum TLS Port': 84,
|
||||
'TCP port stunnel accepts TLS stratum connections on. Only used when Stratum TLS is enabled below.': 85,
|
||||
'Network port your miners connect to for plaintext stratum. StartOS publishes the pool on this port; if it is already claimed by another service the OS assigns a different one, so check the Stratum interface after saving. Changing this does not interrupt connected miners.': 86,
|
||||
'Network port your miners connect to for TLS stratum — both for the local self-signed certificate and for any public domain attached to the Stratum (TLS) interface.': 87,
|
||||
'Network port your miners connect to for TLS stratum, both for the local self-signed certificate and for any public domain attached to the Stratum (TLS) interface.': 87,
|
||||
'Stratum TLS (Local Network)': 88,
|
||||
'Stratum TLS Port (Local Network)': 89,
|
||||
'Network port for TLS stratum using the self-signed certificate, for miners on your local network.': 90,
|
||||
'Stratum TLS Port (Public Domain)': 91,
|
||||
'Network port for TLS stratum using a CA-issued certificate. Attach a domain to the Stratum (TLS, Public Domain) interface and StartOS issues a Let’s Encrypt certificate for it — miners validate it with no certificate pasted in.': 92,
|
||||
'Network port for TLS stratum using a CA-issued certificate. Attach a domain to the Stratum (TLS, Public Domain) interface and StartOS issues a Let’s Encrypt certificate for it, miners validate it with no certificate pasted in.': 92,
|
||||
'Stratum (TLS, Public Domain)': 93,
|
||||
'TLS-encrypted stratum endpoint for miners connecting over the internet. Attach a domain here and StartOS issues a Let’s Encrypt certificate for it, which any miner validates with nothing pasted in': 94,
|
||||
'Stratum (TLS, Local Network)': 95,
|
||||
'TLS-encrypted stratum endpoint for miners on your local network, using the self-signed certificate (see the Stratum TLS Certificate action). Do not attach a public domain here — StartOS cannot issue a certificate for this endpoint; use Stratum (TLS, Public Domain) instead': 96,
|
||||
'Connect miners with stratum+ssl:// to the Stratum (TLS, Local Network) interface. The certificate is self-signed: paste the PEM into firmware that accepts a custom root, pin the fingerprint, or disable verification. Miners connecting over a public domain do not need any of this — they use the Stratum (TLS, Public Domain) interface and its CA-issued certificate.': 97,
|
||||
'TLS-encrypted stratum endpoint for miners on your local network, using the self-signed certificate (see the Stratum TLS Certificate action). Do not attach a public domain here, StartOS cannot issue a certificate for this endpoint; use Stratum (TLS, Public Domain) instead': 96,
|
||||
'Connect miners with stratum+ssl:// to the Stratum (TLS, Local Network) interface. The certificate is self-signed: paste the PEM into firmware that accepts a custom root, pin the fingerprint, or disable verification. Miners connecting over a public domain do not need any of this, they use the Stratum (TLS, Public Domain) interface and its CA-issued certificate.': 97,
|
||||
'Container-side TLS stratum port. The externally reachable port is shown on the Stratum (TLS, Local Network) interface.': 98,
|
||||
'Serve the self-signed certificate on the local-network TLS port. Miners have to trust it (see the Stratum TLS Certificate action) or connect with verification disabled. You do NOT need this for miners connecting over a public domain: attach the domain to the Stratum (TLS, Public Domain) interface instead, and StartOS issues a publicly trusted certificate for it automatically.': 99,
|
||||
'Preferred Stratum Port': 100,
|
||||
'Preferred Stratum TLS Port (Local Network)': 101,
|
||||
'Preferred Stratum TLS Port (Public Domain)': 102,
|
||||
'Network port to publish plaintext stratum on. This is a request, not a guarantee: if the port is already claimed the OS assigns a different one and warns you. Run the Pool Status action to see the ports actually in use. Changing this does not interrupt connected miners.': 103,
|
||||
'Network port to publish local-network TLS stratum on, using the self-signed certificate. A request, not a guarantee — see Pool Status for the port actually in use.': 104,
|
||||
'Network port to publish public-domain TLS stratum on. Attach a domain to the Stratum (TLS, Public Domain) interface and StartOS issues a Let’s Encrypt certificate for it — miners validate it with no certificate pasted in. A request, not a guarantee — see Pool Status for the port actually in use.': 105,
|
||||
'Network port to publish local-network TLS stratum on, using the self-signed certificate. A request, not a guarantee, see Pool Status for the port actually in use.': 104,
|
||||
'Network port to publish public-domain TLS stratum on. Attach a domain to the Stratum (TLS, Public Domain) interface and StartOS issues a Let’s Encrypt certificate for it, miners validate it with no certificate pasted in. A request, not a guarantee, see Pool Status for the port actually in use.': 105,
|
||||
'Stratum port changed by StartOS': 106,
|
||||
'{label}: requested {requested}, assigned {assigned}': 107,
|
||||
'The port you asked for was already in use, so StartOS assigned another one. Point your miners at the assigned port, or pick a free one in Configure.': 108,
|
||||
'Network port to publish public-domain TLS stratum on. A domain attached to the Stratum (TLS, Public Domain) interface is published on THIS port (not the one the OS assigns for IP access), and StartOS issues a Let’s Encrypt certificate for it — miners validate it with nothing pasted in. Reaching it from the internet also requires enabling that interface’s public address, which is off by default. See Pool Status for the ports and domains actually in use.': 109,
|
||||
'Network port to publish public-domain TLS stratum on. A domain attached to the Stratum (TLS, Public Domain) interface is published on THIS port, which can differ from the one the OS assigns for IP access, and StartOS issues a Let’s Encrypt certificate for it — miners validate it with nothing pasted in. See Pool Status for the ports and domains actually in use.': 110,
|
||||
'Network port to publish public-domain TLS stratum on. A domain attached to the Stratum (TLS, Public Domain) interface is published on THIS port (not the one the OS assigns for IP access), and StartOS issues a Let’s Encrypt certificate for it, miners validate it with nothing pasted in. Reaching it from the internet also requires enabling that interface’s public address, which is off by default. See Pool Status for the ports and domains actually in use.': 109,
|
||||
'Network port to publish public-domain TLS stratum on. A domain attached to the Stratum (TLS, Public Domain) interface is published on THIS port, which can differ from the one the OS assigns for IP access, and StartOS issues a Let’s Encrypt certificate for it, miners validate it with nothing pasted in. See Pool Status for the ports and domains actually in use.': 110,
|
||||
'Rebuild Share Statistics': 111,
|
||||
'Recounts the all-time share statistics — the difficulty distribution and rejection reasons on the Stats page — by rereading CKPool’s log from the beginning. Use this if those totals look wrong or reset. The stored totals are only replaced when the log accounts for more shares than they do, so this can add history back but never erase it.': 112,
|
||||
'Recounts the all-time share statistics, the difficulty distribution and rejection reasons on the Stats page, by rereading CKPool’s log from the beginning. Use this if those totals look wrong or reset. The stored totals are only replaced when the log accounts for more shares than they do, so this can add history back but never erase it.': 112,
|
||||
'On a pool with a long history this reads millions of log lines and can take a while. The pool keeps mining throughout.': 113,
|
||||
'Failed to rebuild share statistics — the Kamado API did not respond': 114,
|
||||
'Failed to rebuild share statistics, the Kamado API did not respond': 114,
|
||||
'Share statistics rebuilt from the CKPool log': 115,
|
||||
'Share statistics left unchanged': 116,
|
||||
} as const
|
||||
|
||||
@@ -2,7 +2,7 @@ import { LangDict } from './default'
|
||||
|
||||
export default {
|
||||
es_ES: {
|
||||
0: '(aún no generado — inicie el servicio una vez)',
|
||||
0: '(aún no generado, inicie el servicio una vez)',
|
||||
1: 'Sirve el certificado autofirmado en el puerto stratum TLS, para mineros de su red local. Los mineros deben confiar en él (vea la acción Certificado TLS de Stratum) o conectarse con la verificación desactivada. NO lo necesita para mineros que se conecten mediante un dominio público: adjunte el dominio a la interfaz Stratum (TLS) y StartOS emitirá automáticamente un certificado de confianza pública.',
|
||||
2: 'Todos los envíos de bloques confirmados',
|
||||
3: 'Todos los contadores de latencia (conteo, promedio, último, trabajo desperdiciado) se han restablecido. Las nuevas mediciones se acumularán a partir del próximo bloque.',
|
||||
@@ -28,15 +28,15 @@ export default {
|
||||
23: 'Desconexión por inactividad (segundos)',
|
||||
24: 'Active primero Stratum TLS en Configurar',
|
||||
25: 'Error',
|
||||
26: 'FALLO — vea los detalles arriba',
|
||||
27: 'No se pudieron restablecer las estadísticas de latencia — la API de Kamado no respondió',
|
||||
26: 'FALLO, vea los detalles arriba',
|
||||
27: 'No se pudieron restablecer las estadísticas de latencia, la API de Kamado no respondió',
|
||||
28: 'Huella digital (SHA-256)',
|
||||
29: 'Suelo del algoritmo vardiff.',
|
||||
30: 'Certificado autofirmado completo. Copie todo el bloque incluidos los marcadores BEGIN/END CERTIFICATE.',
|
||||
31: 'Información',
|
||||
32: 'Objetivo vardiff inicial para nuevas conexiones de mineros. Los mineros tipo Bitaxe suelen quedar en torno a 16384.',
|
||||
33: 'No se puede acceder a la API de Kamado — el servicio puede estar caído',
|
||||
34: 'Kamado Pool usa notificaciones ZMQ de bloques para detectar trabajo obsoleto en menos de un segundo — cada segundo de trabajo obsoleto en modo solo es hashrate quemado en un bloque muerto.',
|
||||
33: 'No se puede acceder a la API de Kamado, el servicio puede estar caído',
|
||||
34: 'Kamado Pool usa notificaciones ZMQ de bloques para detectar trabajo obsoleto en menos de un segundo, cada segundo de trabajo obsoleto en modo solo es hashrate quemado en un bloque muerto.',
|
||||
35: 'Nivel de registro',
|
||||
36: 'Dificultad máxima',
|
||||
37: 'Los mineros conectados por TLS se desconectarán al reiniciar y deberán aceptar o volver a fijar la huella del nuevo certificado.',
|
||||
@@ -45,7 +45,7 @@ export default {
|
||||
40: 'Próximos pasos:',
|
||||
41: 'No se encontraron archivos de certificado TLS (puede que TLS no esté activado)',
|
||||
42: 'No había archivos de certificado.',
|
||||
43: 'CORRECTO — el pool está en buen estado',
|
||||
43: 'CORRECTO, el pool está en buen estado',
|
||||
44: 'Punto de acceso stratum sin cifrar. Apunte aquí a los mineros con su dirección de pago de Bitcoin como nombre de usuario',
|
||||
45: 'Estado del pool',
|
||||
46: 'Proporcione la nueva huella o el PEM a los mineros que fijan el certificado.',
|
||||
@@ -65,7 +65,7 @@ export default {
|
||||
60: 'Certificado TLS de Stratum',
|
||||
61: 'Suscribirse al tema ZMQ hashblock de Bitcoin Core para detectar bloques en menos de un segundo. El sondeo RPC permanece activo como respaldo en cualquier caso.',
|
||||
62: 'Puerto TLS (interno)',
|
||||
63: 'Certificado TLS eliminado — reinicie el servicio para generar uno nuevo',
|
||||
63: 'Certificado TLS eliminado, reinicie el servicio para generar uno nuevo',
|
||||
64: 'El stratum TLS acepta conexiones',
|
||||
65: 'El stratum TLS no acepta conexiones',
|
||||
66: 'Punto de acceso stratum cifrado con TLS. Los mineros que usen un dominio público adjunto aquí reciben automáticamente un certificado emitido por una CA; en la red local se usa el certificado autofirmado (vea la acción Certificado TLS de Stratum)',
|
||||
@@ -79,10 +79,10 @@ export default {
|
||||
74: 'Panel web',
|
||||
75: 'Flujo de bloques ZMQ',
|
||||
76: 'Notificaciones de bloques ZMQ',
|
||||
77: 'El flujo de bloques ZMQ está obsoleto — las notificaciones de bloques recurren al sondeo RPC',
|
||||
77: 'El flujo de bloques ZMQ está obsoleto, las notificaciones de bloques recurren al sondeo RPC',
|
||||
78: 'Las notificaciones de bloques ZMQ fluyen correctamente',
|
||||
79: 'Pone a cero los contadores de latencia de actualización de bloques (promedio, último, trabajo desperdiciado, conteo). Úselo tras ajustar ZMQ o ckpool para empezar mediciones nuevas.',
|
||||
80: 'bloque(s) enviados a bitcoind pero no confirmados — revise los registros de Bitcoin Core',
|
||||
80: 'bloque(s) enviados a bitcoind pero no confirmados, revise los registros de Bitcoin Core',
|
||||
81: 'segundos',
|
||||
82: 'Puerto stratum',
|
||||
83: 'Puerto TCP en el que escucha el servidor stratum sin cifrar. StartOS también intenta publicar el pool en ese mismo número de puerto en su red, por lo que normalmente es el puerto que dará a sus mineros: revise la interfaz Stratum después de guardar, ya que el sistema elegirá otro puerto externo si este ya está ocupado.',
|
||||
@@ -114,14 +114,14 @@ export default {
|
||||
109: 'Puerto de red en el que publicar el stratum TLS de dominio público. El dominio adjuntado a la interfaz Stratum (TLS, dominio público) se publica en ESTE puerto (no en el que el sistema asigna para el acceso por IP), y StartOS emite un certificado de Let’s Encrypt para él: los mineros lo validan sin pegar nada. Para alcanzarlo desde internet también hay que habilitar la dirección pública de esa interfaz, que está desactivada por defecto. Consulte Estado del pool para ver los puertos y dominios realmente en uso.',
|
||||
110: 'Puerto de red en el que publicar el stratum TLS de dominio público. El dominio adjuntado a la interfaz Stratum (TLS, dominio público) se publica en ESTE puerto, que puede diferir del que el sistema asigna para el acceso por IP, y StartOS emite un certificado de Let’s Encrypt para él: los mineros lo validan sin pegar nada. Consulte Estado del pool para ver los puertos y dominios realmente en uso.',
|
||||
111: 'Reconstruir estadísticas de participaciones',
|
||||
112: 'Vuelve a contar las estadísticas históricas de participaciones —la distribución de dificultad y los motivos de rechazo de la página Estadísticas— releyendo el registro de CKPool desde el principio. Úselo si esos totales parecen incorrectos o se han reiniciado. Los totales almacenados solo se sustituyen cuando el registro contabiliza más participaciones que ellos, así que esto puede recuperar historial pero nunca borrarlo.',
|
||||
112: 'Vuelve a contar las estadísticas históricas de participaciones, la distribución de dificultad y los motivos de rechazo de la página Estadísticas, releyendo el registro de CKPool desde el principio. Úselo si esos totales parecen incorrectos o se han reiniciado. Los totales almacenados solo se sustituyen cuando el registro contabiliza más participaciones que ellos, así que esto puede recuperar historial pero nunca borrarlo.',
|
||||
113: 'En un pool con un historial largo, esto lee millones de líneas de registro y puede tardar. El pool sigue minando mientras tanto.',
|
||||
114: 'No se pudieron reconstruir las estadísticas: la API de Kamado no respondió',
|
||||
115: 'Estadísticas de participaciones reconstruidas a partir del registro de CKPool',
|
||||
116: 'Estadísticas de participaciones sin cambios',
|
||||
},
|
||||
de_DE: {
|
||||
0: '(noch nicht erzeugt — starten Sie den Dienst einmal)',
|
||||
0: '(noch nicht erzeugt, starten Sie den Dienst einmal)',
|
||||
1: 'Stellt das selbstsignierte Zertifikat auf dem TLS-Stratum-Port bereit, für Miner in Ihrem lokalen Netzwerk. Miner müssen ihm vertrauen (siehe Aktion „Stratum-TLS-Zertifikat“) oder ohne Verifizierung verbinden. Für Miner, die über eine öffentliche Domain verbinden, wird dies NICHT benötigt: Hängen Sie die Domain an die Schnittstelle Stratum (TLS) an, und StartOS stellt automatisch ein öffentlich vertrauenswürdiges Zertifikat aus.',
|
||||
2: 'Alle Blockeinreichungen bestätigt',
|
||||
3: 'Alle Latenzzähler (Anzahl, Durchschnitt, letzter, verschwendete Arbeit) wurden zurückgesetzt. Neue Messungen sammeln sich ab dem nächsten Block.',
|
||||
@@ -147,15 +147,15 @@ export default {
|
||||
23: 'Leerlauf-Trennung (Sekunden)',
|
||||
24: 'Aktivieren Sie zuerst Stratum-TLS unter Konfigurieren',
|
||||
25: 'Fehler',
|
||||
26: 'FEHLER — siehe Details oben',
|
||||
27: 'Latenzstatistiken konnten nicht zurückgesetzt werden — die Kamado-API hat nicht geantwortet',
|
||||
26: 'FEHLER, siehe Details oben',
|
||||
27: 'Latenzstatistiken konnten nicht zurückgesetzt werden, die Kamado-API hat nicht geantwortet',
|
||||
28: 'Fingerabdruck (SHA-256)',
|
||||
29: 'Untergrenze für den Vardiff-Algorithmus.',
|
||||
30: 'Vollständiges selbstsigniertes Zertifikat. Kopieren Sie den gesamten Block einschließlich der BEGIN/END-CERTIFICATE-Markierungen.',
|
||||
31: 'Info',
|
||||
32: 'Anfängliches Vardiff-Ziel für neue Miner-Verbindungen. Miner der Bitaxe-Klasse landen typischerweise bei etwa 16384.',
|
||||
33: 'Kamado-API ist nicht erreichbar — der Dienst ist möglicherweise ausgefallen',
|
||||
34: 'Kamado Pool nutzt ZMQ-Blockbenachrichtigungen zur Erkennung veralteter Arbeit im Subsekundenbereich — jede Sekunde veralteter Arbeit im Solo-Modus ist auf einem toten Block verbrannte Hashrate.',
|
||||
33: 'Kamado-API ist nicht erreichbar, der Dienst ist möglicherweise ausgefallen',
|
||||
34: 'Kamado Pool nutzt ZMQ-Blockbenachrichtigungen zur Erkennung veralteter Arbeit im Subsekundenbereich, jede Sekunde veralteter Arbeit im Solo-Modus ist auf einem toten Block verbrannte Hashrate.',
|
||||
35: 'Protokollstufe',
|
||||
36: 'Maximale Schwierigkeit',
|
||||
37: 'Über TLS verbundene Miner werden beim Neustart getrennt und müssen den neuen Zertifikat-Fingerabdruck akzeptieren oder neu pinnen.',
|
||||
@@ -164,7 +164,7 @@ export default {
|
||||
40: 'Nächste Schritte:',
|
||||
41: 'Keine TLS-Zertifikatsdateien gefunden (TLS wurde möglicherweise nicht aktiviert)',
|
||||
42: 'Es waren keine Zertifikatsdateien vorhanden.',
|
||||
43: 'OK — der Pool ist gesund',
|
||||
43: 'OK, der Pool ist gesund',
|
||||
44: 'Unverschlüsselter Stratum-Endpunkt. Verbinden Sie Miner hierhin mit ihrer Bitcoin-Auszahlungsadresse als Benutzername',
|
||||
45: 'Pool-Status',
|
||||
46: 'Geben Sie den neuen Fingerabdruck oder das PEM an Miner weiter, die das Zertifikat pinnen.',
|
||||
@@ -184,7 +184,7 @@ export default {
|
||||
60: 'Stratum-TLS-Zertifikat',
|
||||
61: 'Abonniert das hashblock-ZMQ-Thema von Bitcoin Core zur Blockerkennung im Subsekundenbereich. RPC-Polling bleibt in jedem Fall als Fallback aktiv.',
|
||||
62: 'TLS-Port (intern)',
|
||||
63: 'TLS-Zertifikat gelöscht — starten Sie den Dienst neu, um ein neues zu erzeugen',
|
||||
63: 'TLS-Zertifikat gelöscht, starten Sie den Dienst neu, um ein neues zu erzeugen',
|
||||
64: 'TLS-Stratum akzeptiert Verbindungen',
|
||||
65: 'TLS-Stratum akzeptiert keine Verbindungen',
|
||||
66: 'TLS-verschlüsselter Stratum-Endpunkt. Miner über eine hier angehängte öffentliche Domain erhalten automatisch ein CA-signiertes Zertifikat; im lokalen Netzwerk wird das selbstsignierte Zertifikat verwendet (siehe Aktion „Stratum-TLS-Zertifikat“)',
|
||||
@@ -198,49 +198,49 @@ export default {
|
||||
74: 'Web-Dashboard',
|
||||
75: 'ZMQ-Block-Feed',
|
||||
76: 'ZMQ-Blockbenachrichtigungen',
|
||||
77: 'ZMQ-Block-Feed ist veraltet — Blockbenachrichtigungen fallen auf RPC-Polling zurück',
|
||||
77: 'ZMQ-Block-Feed ist veraltet, Blockbenachrichtigungen fallen auf RPC-Polling zurück',
|
||||
78: 'ZMQ-Blockbenachrichtigungen fließen',
|
||||
79: 'Setzt die Latenzzähler für Blockaktualisierungen auf null (Durchschnitt, letzter, verschwendete Arbeit, Blockanzahl). Verwenden Sie dies nach dem Tuning von ZMQ oder ckpool für frische Messungen.',
|
||||
80: 'Block/Blöcke an bitcoind übermittelt, aber nicht bestätigt — prüfen Sie die Bitcoin-Core-Protokolle',
|
||||
80: 'Block/Blöcke an bitcoind übermittelt, aber nicht bestätigt, prüfen Sie die Bitcoin-Core-Protokolle',
|
||||
81: 'Sekunden',
|
||||
82: 'Stratum-Port',
|
||||
83: 'TCP-Port, auf dem der unverschlüsselte Stratum-Server lauscht. StartOS versucht außerdem, den Pool unter derselben Portnummer im Netzwerk zu veröffentlichen — normalerweise ist dies also der Port für Ihre Miner. Prüfen Sie nach dem Speichern die Stratum-Schnittstelle, denn das System wählt einen anderen externen Port, falls dieser belegt ist.',
|
||||
83: 'TCP-Port, auf dem der unverschlüsselte Stratum-Server lauscht. StartOS versucht außerdem, den Pool unter derselben Portnummer im Netzwerk zu veröffentlichen, normalerweise ist dies also der Port für Ihre Miner. Prüfen Sie nach dem Speichern die Stratum-Schnittstelle, denn das System wählt einen anderen externen Port, falls dieser belegt ist.',
|
||||
84: 'Stratum-TLS-Port',
|
||||
85: 'TCP-Port, auf dem stunnel TLS-Stratum-Verbindungen annimmt. Wird nur verwendet, wenn Stratum-TLS unten aktiviert ist.',
|
||||
86: 'Netzwerk-Port, über den sich Ihre Miner für unverschlüsseltes Stratum verbinden. StartOS veröffentlicht den Pool auf diesem Port; ist er bereits von einem anderen Dienst belegt, weist das System einen anderen zu — prüfen Sie daher nach dem Speichern die Stratum-Schnittstelle. Eine Änderung unterbricht verbundene Miner nicht.',
|
||||
87: 'Netzwerk-Port, über den sich Ihre Miner für TLS-Stratum verbinden — sowohl für das lokale selbstsignierte Zertifikat als auch für jede an die Schnittstelle Stratum (TLS) angehängte öffentliche Domain.',
|
||||
86: 'Netzwerk-Port, über den sich Ihre Miner für unverschlüsseltes Stratum verbinden. StartOS veröffentlicht den Pool auf diesem Port; ist er bereits von einem anderen Dienst belegt, weist das System einen anderen zu, prüfen Sie daher nach dem Speichern die Stratum-Schnittstelle. Eine Änderung unterbricht verbundene Miner nicht.',
|
||||
87: 'Netzwerk-Port, über den sich Ihre Miner für TLS-Stratum verbinden, sowohl für das lokale selbstsignierte Zertifikat als auch für jede an die Schnittstelle Stratum (TLS) angehängte öffentliche Domain.',
|
||||
88: 'Stratum-TLS (lokales Netzwerk)',
|
||||
89: 'Stratum-TLS-Port (lokales Netzwerk)',
|
||||
90: 'Netzwerk-Port für TLS-Stratum mit dem selbstsignierten Zertifikat, für Miner in Ihrem lokalen Netzwerk.',
|
||||
91: 'Stratum-TLS-Port (öffentliche Domain)',
|
||||
92: 'Netzwerk-Port für TLS-Stratum mit einem CA-ausgestellten Zertifikat. Hängen Sie eine Domain an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ an, und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus — Miner validieren es, ohne ein Zertifikat einzufügen.',
|
||||
92: 'Netzwerk-Port für TLS-Stratum mit einem CA-ausgestellten Zertifikat. Hängen Sie eine Domain an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ an, und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus, Miner validieren es, ohne ein Zertifikat einzufügen.',
|
||||
93: 'Stratum (TLS, öffentliche Domain)',
|
||||
94: 'TLS-verschlüsselter Stratum-Endpunkt für Miner, die sich über das Internet verbinden. Hängen Sie hier eine Domain an, und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus, das jeder Miner ohne Einfügen validiert',
|
||||
95: 'Stratum (TLS, lokales Netzwerk)',
|
||||
96: 'TLS-verschlüsselter Stratum-Endpunkt für Miner in Ihrem lokalen Netzwerk, mit dem selbstsignierten Zertifikat (siehe Aktion „Stratum-TLS-Zertifikat“). Hängen Sie hier keine öffentliche Domain an — StartOS kann für diesen Endpunkt kein Zertifikat ausstellen; verwenden Sie stattdessen „Stratum (TLS, öffentliche Domain)“',
|
||||
97: 'Verbinden Sie Miner mit stratum+ssl:// mit der Schnittstelle „Stratum (TLS, lokales Netzwerk)“. Das Zertifikat ist selbstsigniert: Fügen Sie das PEM in Firmware ein, die eine eigene Root akzeptiert, pinnen Sie den Fingerabdruck oder deaktivieren Sie die Verifizierung. Miner, die über eine öffentliche Domain verbinden, brauchen nichts davon — sie nutzen „Stratum (TLS, öffentliche Domain)“ und dessen CA-ausgestelltes Zertifikat.',
|
||||
96: 'TLS-verschlüsselter Stratum-Endpunkt für Miner in Ihrem lokalen Netzwerk, mit dem selbstsignierten Zertifikat (siehe Aktion „Stratum-TLS-Zertifikat“). Hängen Sie hier keine öffentliche Domain an, StartOS kann für diesen Endpunkt kein Zertifikat ausstellen; verwenden Sie stattdessen „Stratum (TLS, öffentliche Domain)“',
|
||||
97: 'Verbinden Sie Miner mit stratum+ssl:// mit der Schnittstelle „Stratum (TLS, lokales Netzwerk)“. Das Zertifikat ist selbstsigniert: Fügen Sie das PEM in Firmware ein, die eine eigene Root akzeptiert, pinnen Sie den Fingerabdruck oder deaktivieren Sie die Verifizierung. Miner, die über eine öffentliche Domain verbinden, brauchen nichts davon, sie nutzen „Stratum (TLS, öffentliche Domain)“ und dessen CA-ausgestelltes Zertifikat.',
|
||||
98: 'Containerseitiger TLS-Stratum-Port. Der extern erreichbare Port wird auf der Schnittstelle „Stratum (TLS, lokales Netzwerk)“ angezeigt.',
|
||||
99: 'Stellt das selbstsignierte Zertifikat auf dem TLS-Port für das lokale Netzwerk bereit. Miner müssen ihm vertrauen (siehe Aktion „Stratum-TLS-Zertifikat“) oder ohne Verifizierung verbinden. Für Miner, die über eine öffentliche Domain verbinden, brauchen Sie das NICHT: Hängen Sie die Domain stattdessen an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ an, und StartOS stellt dafür automatisch ein öffentlich vertrauenswürdiges Zertifikat aus.',
|
||||
100: 'Bevorzugter Stratum-Port',
|
||||
101: 'Bevorzugter Stratum-TLS-Port (lokales Netzwerk)',
|
||||
102: 'Bevorzugter Stratum-TLS-Port (öffentliche Domain)',
|
||||
103: 'Netzwerk-Port, auf dem unverschlüsseltes Stratum veröffentlicht wird. Dies ist eine Anfrage, keine Garantie: Ist der Port bereits belegt, weist das System einen anderen zu und warnt Sie. Führen Sie die Aktion „Pool-Status“ aus, um die tatsächlich verwendeten Ports zu sehen. Eine Änderung unterbricht verbundene Miner nicht.',
|
||||
104: 'Netzwerk-Port, auf dem TLS-Stratum für das lokale Netzwerk mit dem selbstsignierten Zertifikat veröffentlicht wird. Eine Anfrage, keine Garantie — siehe „Pool-Status“ für den tatsächlich verwendeten Port.',
|
||||
105: 'Netzwerk-Port, auf dem TLS-Stratum für eine öffentliche Domain veröffentlicht wird. Hängen Sie eine Domain an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ an, und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus — Miner validieren es ohne eingefügtes Zertifikat. Eine Anfrage, keine Garantie — siehe „Pool-Status“ für den tatsächlich verwendeten Port.',
|
||||
104: 'Netzwerk-Port, auf dem TLS-Stratum für das lokale Netzwerk mit dem selbstsignierten Zertifikat veröffentlicht wird. Eine Anfrage, keine Garantie, siehe „Pool-Status“ für den tatsächlich verwendeten Port.',
|
||||
105: 'Netzwerk-Port, auf dem TLS-Stratum für eine öffentliche Domain veröffentlicht wird. Hängen Sie eine Domain an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ an, und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus, Miner validieren es ohne eingefügtes Zertifikat. Eine Anfrage, keine Garantie, siehe „Pool-Status“ für den tatsächlich verwendeten Port.',
|
||||
106: 'Stratum-Port von StartOS geändert',
|
||||
107: '{label}: angefordert {requested}, zugewiesen {assigned}',
|
||||
108: 'Der angeforderte Port war bereits belegt, daher hat StartOS einen anderen zugewiesen. Richten Sie Ihre Miner auf den zugewiesenen Port aus, oder wählen Sie unter „Konfigurieren“ einen freien Port.',
|
||||
109: 'Netzwerk-Port, auf dem TLS-Stratum für eine öffentliche Domain veröffentlicht wird. Eine an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ angehängte Domain wird auf DIESEM Port veröffentlicht (nicht auf dem, den das System für den IP-Zugriff zuweist), und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus — Miner validieren es ohne eingefügtes Zertifikat. Für die Erreichbarkeit aus dem Internet muss zusätzlich die öffentliche Adresse dieser Schnittstelle aktiviert werden, die standardmäßig deaktiviert ist. Siehe „Pool-Status“ für die tatsächlich verwendeten Ports und Domains.',
|
||||
110: 'Netzwerk-Port, auf dem TLS-Stratum für eine öffentliche Domain veröffentlicht wird. Eine an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ angehängte Domain wird auf DIESEM Port veröffentlicht, der sich von dem für den IP-Zugriff zugewiesenen unterscheiden kann, und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus — Miner validieren es ohne eingefügtes Zertifikat. Siehe „Pool-Status“ für die tatsächlich verwendeten Ports und Domains.',
|
||||
109: 'Netzwerk-Port, auf dem TLS-Stratum für eine öffentliche Domain veröffentlicht wird. Eine an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ angehängte Domain wird auf DIESEM Port veröffentlicht (nicht auf dem, den das System für den IP-Zugriff zuweist), und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus, Miner validieren es ohne eingefügtes Zertifikat. Für die Erreichbarkeit aus dem Internet muss zusätzlich die öffentliche Adresse dieser Schnittstelle aktiviert werden, die standardmäßig deaktiviert ist. Siehe „Pool-Status“ für die tatsächlich verwendeten Ports und Domains.',
|
||||
110: 'Netzwerk-Port, auf dem TLS-Stratum für eine öffentliche Domain veröffentlicht wird. Eine an die Schnittstelle „Stratum (TLS, öffentliche Domain)“ angehängte Domain wird auf DIESEM Port veröffentlicht, der sich von dem für den IP-Zugriff zugewiesenen unterscheiden kann, und StartOS stellt dafür ein Let’s-Encrypt-Zertifikat aus, Miner validieren es ohne eingefügtes Zertifikat. Siehe „Pool-Status“ für die tatsächlich verwendeten Ports und Domains.',
|
||||
111: 'Share-Statistiken neu aufbauen',
|
||||
112: 'Zählt die Allzeit-Share-Statistiken — die Schwierigkeitsverteilung und die Ablehnungsgründe auf der Statistikseite — neu, indem das CKPool-Protokoll von Anfang an erneut gelesen wird. Verwenden Sie dies, wenn diese Summen falsch aussehen oder zurückgesetzt wurden. Die gespeicherten Summen werden nur ersetzt, wenn das Protokoll mehr Shares ausweist als sie — es kann also Verlauf zurückholen, aber niemals löschen.',
|
||||
112: 'Zählt die Allzeit-Share-Statistiken, die Schwierigkeitsverteilung und die Ablehnungsgründe auf der Statistikseite, neu, indem das CKPool-Protokoll von Anfang an erneut gelesen wird. Verwenden Sie dies, wenn diese Summen falsch aussehen oder zurückgesetzt wurden. Die gespeicherten Summen werden nur ersetzt, wenn das Protokoll mehr Shares ausweist als sie, es kann also Verlauf zurückholen, aber niemals löschen.',
|
||||
113: 'Bei einem Pool mit langer Historie werden dabei Millionen Protokollzeilen gelesen, was eine Weile dauern kann. Der Pool mint währenddessen weiter.',
|
||||
114: 'Share-Statistiken konnten nicht neu aufgebaut werden — die Kamado-API antwortete nicht',
|
||||
114: 'Share-Statistiken konnten nicht neu aufgebaut werden, die Kamado-API antwortete nicht',
|
||||
115: 'Share-Statistiken aus dem CKPool-Protokoll neu aufgebaut',
|
||||
116: 'Share-Statistiken unverändert',
|
||||
},
|
||||
pl_PL: {
|
||||
0: '(jeszcze nie wygenerowano — uruchom usługę raz)',
|
||||
0: '(jeszcze nie wygenerowano, uruchom usługę raz)',
|
||||
1: 'Udostępnia certyfikat samopodpisany na porcie stratum TLS, dla górników w sieci lokalnej. Górnicy muszą mu zaufać (zobacz akcję Certyfikat TLS Stratum) lub łączyć się z wyłączoną weryfikacją. NIE jest to potrzebne dla górników łączących się przez domenę publiczną: podłącz domenę do interfejsu Stratum (TLS), a StartOS automatycznie wystawi publicznie zaufany certyfikat.',
|
||||
2: 'Wszystkie przesłane bloki potwierdzone',
|
||||
3: 'Wszystkie liczniki opóźnień (liczba, średnia, ostatni, zmarnowana praca) zostały wyzerowane. Nowe pomiary będą gromadzone od następnego bloku.',
|
||||
@@ -266,15 +266,15 @@ export default {
|
||||
23: 'Rozłączanie bezczynnych (sekundy)',
|
||||
24: 'Najpierw włącz Stratum TLS w Konfiguruj',
|
||||
25: 'Błąd',
|
||||
26: 'BŁĄD — szczegóły powyżej',
|
||||
27: 'Nie udało się wyzerować statystyk opóźnień — API Kamado nie odpowiedziało',
|
||||
26: 'BŁĄD, szczegóły powyżej',
|
||||
27: 'Nie udało się wyzerować statystyk opóźnień, API Kamado nie odpowiedziało',
|
||||
28: 'Odcisk (SHA-256)',
|
||||
29: 'Dolny limit algorytmu vardiff.',
|
||||
30: 'Pełny certyfikat samopodpisany. Skopiuj cały blok wraz ze znacznikami BEGIN/END CERTIFICATE.',
|
||||
31: 'Informacja',
|
||||
32: 'Początkowy cel vardiff dla nowych połączeń górników. Górnicy klasy Bitaxe zwykle osiągają około 16384.',
|
||||
33: 'API Kamado jest nieosiągalne — usługa może nie działać',
|
||||
34: 'Kamado Pool używa powiadomień ZMQ o blokach do wykrywania przestarzałej pracy w ułamku sekundy — każda sekunda przestarzałej pracy w trybie solo to hashrate spalony na martwym bloku.',
|
||||
33: 'API Kamado jest nieosiągalne, usługa może nie działać',
|
||||
34: 'Kamado Pool używa powiadomień ZMQ o blokach do wykrywania przestarzałej pracy w ułamku sekundy, każda sekunda przestarzałej pracy w trybie solo to hashrate spalony na martwym bloku.',
|
||||
35: 'Poziom logowania',
|
||||
36: 'Maksymalna trudność',
|
||||
37: 'Górnicy połączeni przez TLS zostaną rozłączeni przy restarcie i będą musieli zaakceptować lub ponownie przypiąć odcisk nowego certyfikatu.',
|
||||
@@ -283,7 +283,7 @@ export default {
|
||||
40: 'Następne kroki:',
|
||||
41: 'Nie znaleziono plików certyfikatu TLS (TLS mógł nie być włączony)',
|
||||
42: 'Nie było plików certyfikatu.',
|
||||
43: 'OK — pula działa prawidłowo',
|
||||
43: 'OK, pula działa prawidłowo',
|
||||
44: 'Nieszyfrowany punkt końcowy stratum. Skieruj tu górników z ich adresem wypłaty Bitcoin jako nazwą użytkownika',
|
||||
45: 'Stan puli',
|
||||
46: 'Przekaż nowy odcisk lub PEM górnikom przypinającym certyfikat.',
|
||||
@@ -303,7 +303,7 @@ export default {
|
||||
60: 'Certyfikat TLS Stratum',
|
||||
61: 'Subskrybuje temat ZMQ hashblock Bitcoin Core w celu wykrywania bloków w ułamku sekundy. Odpytywanie RPC pozostaje aktywne jako rezerwa.',
|
||||
62: 'Port TLS (wewnętrzny)',
|
||||
63: 'Certyfikat TLS usunięty — uruchom ponownie usługę, aby wygenerować nowy',
|
||||
63: 'Certyfikat TLS usunięty, uruchom ponownie usługę, aby wygenerować nowy',
|
||||
64: 'Stratum TLS przyjmuje połączenia',
|
||||
65: 'Stratum TLS nie przyjmuje połączeń',
|
||||
66: 'Szyfrowany TLS punkt końcowy stratum. Górnicy korzystający z podłączonej tu domeny publicznej automatycznie otrzymują certyfikat wystawiony przez CA; w sieci lokalnej używany jest certyfikat samopodpisany (zobacz akcję Certyfikat TLS Stratum)',
|
||||
@@ -317,49 +317,49 @@ export default {
|
||||
74: 'Panel WWW',
|
||||
75: 'Kanał bloków ZMQ',
|
||||
76: 'Powiadomienia ZMQ o blokach',
|
||||
77: 'Kanał bloków ZMQ jest nieaktualny — powiadomienia o blokach wracają do odpytywania RPC',
|
||||
77: 'Kanał bloków ZMQ jest nieaktualny, powiadomienia o blokach wracają do odpytywania RPC',
|
||||
78: 'Powiadomienia ZMQ o blokach napływają',
|
||||
79: 'Zeruje liczniki opóźnień aktualizacji bloków (średnia, ostatni, zmarnowana praca, liczba bloków). Użyj po dostrojeniu ZMQ lub ckpool, aby rozpocząć nowe pomiary.',
|
||||
80: 'blok(i) przesłane do bitcoind, ale niepotwierdzone — sprawdź logi Bitcoin Core',
|
||||
80: 'blok(i) przesłane do bitcoind, ale niepotwierdzone, sprawdź logi Bitcoin Core',
|
||||
81: 'sekundy',
|
||||
82: 'Port stratum',
|
||||
83: 'Port TCP, na którym nasłuchuje nieszyfrowany serwer stratum. StartOS próbuje również udostępnić pulę pod tym samym numerem portu w sieci, więc zwykle jest to port podawany górnikom — po zapisaniu sprawdź interfejs Stratum, ponieważ system wybierze inny port zewnętrzny, jeśli ten jest zajęty.',
|
||||
83: 'Port TCP, na którym nasłuchuje nieszyfrowany serwer stratum. StartOS próbuje również udostępnić pulę pod tym samym numerem portu w sieci, więc zwykle jest to port podawany górnikom, po zapisaniu sprawdź interfejs Stratum, ponieważ system wybierze inny port zewnętrzny, jeśli ten jest zajęty.',
|
||||
84: 'Port TLS stratum',
|
||||
85: 'Port TCP, na którym stunnel przyjmuje połączenia stratum TLS. Używany tylko, gdy Stratum TLS jest włączone poniżej.',
|
||||
86: 'Port sieciowy, na który łączą się górnicy dla nieszyfrowanego stratum. StartOS udostępnia pulę na tym porcie; jeśli jest już zajęty przez inną usługę, system przydzieli inny — sprawdź interfejs Stratum po zapisaniu. Zmiana nie przerywa połączeń górników.',
|
||||
87: 'Port sieciowy, na który łączą się górnicy dla stratum TLS — zarówno dla lokalnego certyfikatu samopodpisanego, jak i dla dowolnej domeny publicznej podłączonej do interfejsu Stratum (TLS).',
|
||||
86: 'Port sieciowy, na który łączą się górnicy dla nieszyfrowanego stratum. StartOS udostępnia pulę na tym porcie; jeśli jest już zajęty przez inną usługę, system przydzieli inny, sprawdź interfejs Stratum po zapisaniu. Zmiana nie przerywa połączeń górników.',
|
||||
87: 'Port sieciowy, na który łączą się górnicy dla stratum TLS, zarówno dla lokalnego certyfikatu samopodpisanego, jak i dla dowolnej domeny publicznej podłączonej do interfejsu Stratum (TLS).',
|
||||
88: 'Stratum TLS (sieć lokalna)',
|
||||
89: 'Port TLS stratum (sieć lokalna)',
|
||||
90: 'Port sieciowy dla stratum TLS z certyfikatem samopodpisanym, dla górników w sieci lokalnej.',
|
||||
91: 'Port TLS stratum (domena publiczna)',
|
||||
92: 'Port sieciowy dla stratum TLS z certyfikatem wystawionym przez CA. Podłącz domenę do interfejsu Stratum (TLS, domena publiczna), a StartOS wystawi dla niej certyfikat Let’s Encrypt — górnicy weryfikują go bez wklejania certyfikatu.',
|
||||
92: 'Port sieciowy dla stratum TLS z certyfikatem wystawionym przez CA. Podłącz domenę do interfejsu Stratum (TLS, domena publiczna), a StartOS wystawi dla niej certyfikat Let’s Encrypt, górnicy weryfikują go bez wklejania certyfikatu.',
|
||||
93: 'Stratum (TLS, domena publiczna)',
|
||||
94: 'Szyfrowany TLS punkt końcowy stratum dla górników łączących się przez internet. Podłącz tu domenę, a StartOS wystawi dla niej certyfikat Let’s Encrypt, który każdy górnik weryfikuje bez wklejania czegokolwiek',
|
||||
95: 'Stratum (TLS, sieć lokalna)',
|
||||
96: 'Szyfrowany TLS punkt końcowy stratum dla górników w sieci lokalnej, z certyfikatem samopodpisanym (zobacz akcję Certyfikat TLS Stratum). Nie podłączaj tu domeny publicznej — StartOS nie może wystawić certyfikatu dla tego punktu; użyj Stratum (TLS, domena publiczna)',
|
||||
97: 'Podłącz górników przez stratum+ssl:// do interfejsu Stratum (TLS, sieć lokalna). Certyfikat jest samopodpisany: wklej PEM do firmware akceptującego własny certyfikat główny, przypnij odcisk lub wyłącz weryfikację. Górnicy łączący się przez domenę publiczną nie potrzebują tego wszystkiego — używają interfejsu Stratum (TLS, domena publiczna) i jego certyfikatu wystawionego przez CA.',
|
||||
96: 'Szyfrowany TLS punkt końcowy stratum dla górników w sieci lokalnej, z certyfikatem samopodpisanym (zobacz akcję Certyfikat TLS Stratum). Nie podłączaj tu domeny publicznej, StartOS nie może wystawić certyfikatu dla tego punktu; użyj Stratum (TLS, domena publiczna)',
|
||||
97: 'Podłącz górników przez stratum+ssl:// do interfejsu Stratum (TLS, sieć lokalna). Certyfikat jest samopodpisany: wklej PEM do firmware akceptującego własny certyfikat główny, przypnij odcisk lub wyłącz weryfikację. Górnicy łączący się przez domenę publiczną nie potrzebują tego wszystkiego, używają interfejsu Stratum (TLS, domena publiczna) i jego certyfikatu wystawionego przez CA.',
|
||||
98: 'Port TLS stratum po stronie kontenera. Port osiągalny z zewnątrz jest widoczny w interfejsie Stratum (TLS, sieć lokalna).',
|
||||
99: 'Udostępnia certyfikat samopodpisany na porcie TLS sieci lokalnej. Górnicy muszą mu zaufać (zobacz akcję Certyfikat TLS Stratum) lub łączyć się z wyłączoną weryfikacją. NIE jest to potrzebne górnikom łączącym się przez domenę publiczną: podłącz domenę do interfejsu Stratum (TLS, domena publiczna), a StartOS automatycznie wystawi dla niej publicznie zaufany certyfikat.',
|
||||
100: 'Preferowany port stratum',
|
||||
101: 'Preferowany port TLS stratum (sieć lokalna)',
|
||||
102: 'Preferowany port TLS stratum (domena publiczna)',
|
||||
103: 'Port sieciowy, na którym publikowane jest nieszyfrowane stratum. To prośba, nie gwarancja: jeśli port jest już zajęty, system przydzieli inny i ostrzeże Cię. Uruchom akcję Stan puli, aby zobaczyć faktycznie używane porty. Zmiana nie przerywa połączeń górników.',
|
||||
104: 'Port sieciowy, na którym publikowane jest stratum TLS sieci lokalnej z certyfikatem samopodpisanym. Prośba, nie gwarancja — zobacz Stan puli, aby poznać faktycznie używany port.',
|
||||
105: 'Port sieciowy, na którym publikowane jest stratum TLS domeny publicznej. Podłącz domenę do interfejsu Stratum (TLS, domena publiczna), a StartOS wystawi dla niej certyfikat Let’s Encrypt — górnicy weryfikują go bez wklejania certyfikatu. Prośba, nie gwarancja — zobacz Stan puli, aby poznać faktycznie używany port.',
|
||||
104: 'Port sieciowy, na którym publikowane jest stratum TLS sieci lokalnej z certyfikatem samopodpisanym. Prośba, nie gwarancja, zobacz Stan puli, aby poznać faktycznie używany port.',
|
||||
105: 'Port sieciowy, na którym publikowane jest stratum TLS domeny publicznej. Podłącz domenę do interfejsu Stratum (TLS, domena publiczna), a StartOS wystawi dla niej certyfikat Let’s Encrypt, górnicy weryfikują go bez wklejania certyfikatu. Prośba, nie gwarancja, zobacz Stan puli, aby poznać faktycznie używany port.',
|
||||
106: 'StartOS zmienił port stratum',
|
||||
107: '{label}: żądano {requested}, przydzielono {assigned}',
|
||||
108: 'Żądany port był już zajęty, więc StartOS przydzielił inny. Skieruj górników na przydzielony port lub wybierz wolny w akcji Konfiguruj.',
|
||||
109: 'Port sieciowy, na którym publikowane jest stratum TLS domeny publicznej. Domena podłączona do interfejsu Stratum (TLS, domena publiczna) jest publikowana na TYM porcie (nie na tym, który system przydziela dla dostępu po IP), a StartOS wystawia dla niej certyfikat Let’s Encrypt — górnicy weryfikują go bez wklejania czegokolwiek. Aby był osiągalny z internetu, trzeba też włączyć publiczny adres tego interfejsu, domyślnie wyłączony. Zobacz Stan puli, aby poznać faktycznie używane porty i domeny.',
|
||||
110: 'Port sieciowy, na którym publikowane jest stratum TLS domeny publicznej. Domena podłączona do interfejsu Stratum (TLS, domena publiczna) jest publikowana na TYM porcie, który może różnić się od przydzielonego dla dostępu po IP, a StartOS wystawia dla niej certyfikat Let’s Encrypt — górnicy weryfikują go bez wklejania czegokolwiek. Zobacz Stan puli, aby poznać faktycznie używane porty i domeny.',
|
||||
109: 'Port sieciowy, na którym publikowane jest stratum TLS domeny publicznej. Domena podłączona do interfejsu Stratum (TLS, domena publiczna) jest publikowana na TYM porcie (nie na tym, który system przydziela dla dostępu po IP), a StartOS wystawia dla niej certyfikat Let’s Encrypt, górnicy weryfikują go bez wklejania czegokolwiek. Aby był osiągalny z internetu, trzeba też włączyć publiczny adres tego interfejsu, domyślnie wyłączony. Zobacz Stan puli, aby poznać faktycznie używane porty i domeny.',
|
||||
110: 'Port sieciowy, na którym publikowane jest stratum TLS domeny publicznej. Domena podłączona do interfejsu Stratum (TLS, domena publiczna) jest publikowana na TYM porcie, który może różnić się od przydzielonego dla dostępu po IP, a StartOS wystawia dla niej certyfikat Let’s Encrypt, górnicy weryfikują go bez wklejania czegokolwiek. Zobacz Stan puli, aby poznać faktycznie używane porty i domeny.',
|
||||
111: 'Odbuduj statystyki udziałów',
|
||||
112: 'Ponownie zlicza statystyki udziałów od początku istnienia puli — rozkład trudności i powody odrzuceń na stronie Statystyki — czytając dziennik CKPool od początku. Użyj tego, jeśli te sumy wyglądają błędnie lub zostały wyzerowane. Zapisane sumy są zastępowane tylko wtedy, gdy dziennik obejmuje więcej udziałów niż one, więc ta operacja może przywrócić historię, ale nigdy jej nie usunie.',
|
||||
112: 'Ponownie zlicza statystyki udziałów od początku istnienia puli, rozkład trudności i powody odrzuceń na stronie Statystyki, czytając dziennik CKPool od początku. Użyj tego, jeśli te sumy wyglądają błędnie lub zostały wyzerowane. Zapisane sumy są zastępowane tylko wtedy, gdy dziennik obejmuje więcej udziałów niż one, więc ta operacja może przywrócić historię, ale nigdy jej nie usunie.',
|
||||
113: 'W puli z długą historią oznacza to odczyt milionów wierszy dziennika i może chwilę potrwać. Pula przez cały czas kopie dalej.',
|
||||
114: 'Nie udało się odbudować statystyk udziałów — API Kamado nie odpowiedziało',
|
||||
114: 'Nie udało się odbudować statystyk udziałów, API Kamado nie odpowiedziało',
|
||||
115: 'Statystyki udziałów odbudowane z dziennika CKPool',
|
||||
116: 'Statystyki udziałów bez zmian',
|
||||
},
|
||||
fr_FR: {
|
||||
0: '(pas encore généré — démarrez le service une fois)',
|
||||
0: '(pas encore généré, démarrez le service une fois)',
|
||||
1: 'Présente le certificat auto-signé sur le port stratum TLS, pour les mineurs de votre réseau local. Les mineurs doivent lui faire confiance (voir l’action Certificat TLS Stratum) ou se connecter sans vérification. Ceci n’est PAS nécessaire pour les mineurs qui se connectent via un domaine public : rattachez le domaine à l’interface Stratum (TLS) et StartOS émet automatiquement un certificat publiquement approuvé.',
|
||||
2: 'Toutes les soumissions de blocs confirmées',
|
||||
3: 'Tous les compteurs de latence (nombre, moyenne, dernier, travail gaspillé) ont été remis à zéro. Les nouvelles mesures s’accumuleront à partir du prochain bloc.',
|
||||
@@ -385,15 +385,15 @@ export default {
|
||||
23: 'Déconnexion inactifs (secondes)',
|
||||
24: 'Activez d’abord Stratum TLS dans Configurer',
|
||||
25: 'Erreur',
|
||||
26: 'ÉCHEC — voir les détails ci-dessus',
|
||||
27: 'Impossible de réinitialiser les statistiques de latence — l’API Kamado n’a pas répondu',
|
||||
26: 'ÉCHEC, voir les détails ci-dessus',
|
||||
27: 'Impossible de réinitialiser les statistiques de latence, l’API Kamado n’a pas répondu',
|
||||
28: 'Empreinte (SHA-256)',
|
||||
29: 'Plancher de l’algorithme vardiff.',
|
||||
30: 'Certificat auto-signé complet. Copiez tout le bloc, y compris les marqueurs BEGIN/END CERTIFICATE.',
|
||||
31: 'Info',
|
||||
32: 'Cible vardiff initiale pour les nouvelles connexions. Les mineurs de classe Bitaxe se situent généralement autour de 16384.',
|
||||
33: 'L’API Kamado est injoignable — le service est peut-être arrêté',
|
||||
34: 'Kamado Pool utilise les notifications de blocs ZMQ pour détecter le travail obsolète en moins d’une seconde — chaque seconde de travail obsolète en mode solo est du hashrate brûlé sur un bloc mort.',
|
||||
33: 'L’API Kamado est injoignable, le service est peut-être arrêté',
|
||||
34: 'Kamado Pool utilise les notifications de blocs ZMQ pour détecter le travail obsolète en moins d’une seconde, chaque seconde de travail obsolète en mode solo est du hashrate brûlé sur un bloc mort.',
|
||||
35: 'Niveau de journalisation',
|
||||
36: 'Difficulté maximale',
|
||||
37: 'Les mineurs connectés en TLS seront déconnectés au redémarrage et devront accepter ou ré-épingler l’empreinte du nouveau certificat.',
|
||||
@@ -402,7 +402,7 @@ export default {
|
||||
40: 'Étapes suivantes :',
|
||||
41: 'Aucun fichier de certificat TLS trouvé (TLS n’a peut-être pas été activé)',
|
||||
42: 'Aucun fichier de certificat n’était présent.',
|
||||
43: 'OK — le pool est en bonne santé',
|
||||
43: 'OK, le pool est en bonne santé',
|
||||
44: 'Point de terminaison stratum en clair. Pointez les mineurs ici avec leur adresse de paiement Bitcoin comme nom d’utilisateur',
|
||||
45: 'État du pool',
|
||||
46: 'Fournissez la nouvelle empreinte ou le PEM aux mineurs qui épinglent le certificat.',
|
||||
@@ -422,7 +422,7 @@ export default {
|
||||
60: 'Certificat TLS Stratum',
|
||||
61: 'S’abonne au sujet ZMQ hashblock de Bitcoin Core pour détecter les blocs en moins d’une seconde. Le sondage RPC reste actif en secours dans tous les cas.',
|
||||
62: 'Port TLS (interne)',
|
||||
63: 'Certificat TLS supprimé — redémarrez le service pour en générer un nouveau',
|
||||
63: 'Certificat TLS supprimé, redémarrez le service pour en générer un nouveau',
|
||||
64: 'Le stratum TLS accepte les connexions',
|
||||
65: 'Le stratum TLS n’accepte pas les connexions',
|
||||
66: 'Point de terminaison stratum chiffré en TLS. Les mineurs passant par un domaine public rattaché ici reçoivent automatiquement un certificat émis par une AC ; sur le réseau local, le certificat auto-signé est utilisé (voir l’action Certificat TLS Stratum)',
|
||||
@@ -436,44 +436,44 @@ export default {
|
||||
74: 'Tableau de bord web',
|
||||
75: 'Flux de blocs ZMQ',
|
||||
76: 'Notifications de blocs ZMQ',
|
||||
77: 'Le flux de blocs ZMQ est périmé — les notifications de blocs se rabattent sur le sondage RPC',
|
||||
77: 'Le flux de blocs ZMQ est périmé, les notifications de blocs se rabattent sur le sondage RPC',
|
||||
78: 'Les notifications de blocs ZMQ arrivent',
|
||||
79: 'Remet à zéro les compteurs de latence de mise à jour des blocs (moyenne, dernier, travail gaspillé, nombre). Utilisez ceci après avoir réglé ZMQ ou ckpool pour repartir sur des mesures neuves.',
|
||||
80: 'bloc(s) soumis à bitcoind mais non confirmés — vérifiez les journaux de Bitcoin Core',
|
||||
80: 'bloc(s) soumis à bitcoind mais non confirmés, vérifiez les journaux de Bitcoin Core',
|
||||
81: 'secondes',
|
||||
82: 'Port stratum',
|
||||
83: 'Port TCP sur lequel le serveur stratum en clair écoute. StartOS tente également de publier le pool sur ce même numéro de port sur votre réseau : c’est donc normalement le port à donner à vos mineurs. Vérifiez l’interface Stratum après enregistrement, car le système choisira un autre port externe si celui-ci est déjà pris.',
|
||||
84: 'Port TLS stratum',
|
||||
85: 'Port TCP sur lequel stunnel accepte les connexions stratum TLS. Utilisé uniquement lorsque Stratum TLS est activé ci-dessous.',
|
||||
86: 'Port réseau auquel vos mineurs se connectent pour le stratum en clair. StartOS publie le pool sur ce port ; s’il est déjà pris par un autre service, le système en attribue un autre — vérifiez donc l’interface Stratum après enregistrement. Le modifier n’interrompt pas les mineurs connectés.',
|
||||
87: 'Port réseau auquel vos mineurs se connectent pour le stratum TLS — aussi bien pour le certificat auto-signé local que pour tout domaine public rattaché à l’interface Stratum (TLS).',
|
||||
86: 'Port réseau auquel vos mineurs se connectent pour le stratum en clair. StartOS publie le pool sur ce port ; s’il est déjà pris par un autre service, le système en attribue un autre, vérifiez donc l’interface Stratum après enregistrement. Le modifier n’interrompt pas les mineurs connectés.',
|
||||
87: 'Port réseau auquel vos mineurs se connectent pour le stratum TLS, aussi bien pour le certificat auto-signé local que pour tout domaine public rattaché à l’interface Stratum (TLS).',
|
||||
88: 'Stratum TLS (réseau local)',
|
||||
89: 'Port TLS stratum (réseau local)',
|
||||
90: 'Port réseau pour le stratum TLS avec le certificat auto-signé, pour les mineurs de votre réseau local.',
|
||||
91: 'Port TLS stratum (domaine public)',
|
||||
92: 'Port réseau pour le stratum TLS avec un certificat émis par une AC. Rattachez un domaine à l’interface Stratum (TLS, domaine public) et StartOS émet un certificat Let’s Encrypt pour celui-ci — les mineurs le valident sans coller aucun certificat.',
|
||||
92: 'Port réseau pour le stratum TLS avec un certificat émis par une AC. Rattachez un domaine à l’interface Stratum (TLS, domaine public) et StartOS émet un certificat Let’s Encrypt pour celui-ci, les mineurs le valident sans coller aucun certificat.',
|
||||
93: 'Stratum (TLS, domaine public)',
|
||||
94: 'Point de terminaison stratum chiffré en TLS pour les mineurs se connectant via internet. Rattachez-y un domaine et StartOS émet un certificat Let’s Encrypt que tout mineur valide sans rien coller',
|
||||
95: 'Stratum (TLS, réseau local)',
|
||||
96: 'Point de terminaison stratum chiffré en TLS pour les mineurs de votre réseau local, avec le certificat auto-signé (voir l’action Certificat TLS Stratum). N’y rattachez pas de domaine public — StartOS ne peut pas émettre de certificat pour ce point de terminaison ; utilisez plutôt Stratum (TLS, domaine public)',
|
||||
97: 'Connectez les mineurs avec stratum+ssl:// à l’interface Stratum (TLS, réseau local). Le certificat est auto-signé : collez le PEM dans un firmware acceptant une racine personnalisée, épinglez l’empreinte ou désactivez la vérification. Les mineurs passant par un domaine public n’ont besoin de rien de tout cela — ils utilisent l’interface Stratum (TLS, domaine public) et son certificat émis par une AC.',
|
||||
96: 'Point de terminaison stratum chiffré en TLS pour les mineurs de votre réseau local, avec le certificat auto-signé (voir l’action Certificat TLS Stratum). N’y rattachez pas de domaine public, StartOS ne peut pas émettre de certificat pour ce point de terminaison ; utilisez plutôt Stratum (TLS, domaine public)',
|
||||
97: 'Connectez les mineurs avec stratum+ssl:// à l’interface Stratum (TLS, réseau local). Le certificat est auto-signé : collez le PEM dans un firmware acceptant une racine personnalisée, épinglez l’empreinte ou désactivez la vérification. Les mineurs passant par un domaine public n’ont besoin de rien de tout cela, ils utilisent l’interface Stratum (TLS, domaine public) et son certificat émis par une AC.',
|
||||
98: 'Port stratum TLS côté conteneur. Le port accessible de l’extérieur est indiqué sur l’interface Stratum (TLS, réseau local).',
|
||||
99: 'Présente le certificat auto-signé sur le port TLS du réseau local. Les mineurs doivent lui faire confiance (voir l’action Certificat TLS Stratum) ou se connecter sans vérification. Ce n’est PAS nécessaire pour les mineurs passant par un domaine public : rattachez plutôt le domaine à l’interface Stratum (TLS, domaine public), et StartOS émet automatiquement un certificat publiquement approuvé.',
|
||||
100: 'Port stratum préféré',
|
||||
101: 'Port TLS stratum préféré (réseau local)',
|
||||
102: 'Port TLS stratum préféré (domaine public)',
|
||||
103: 'Port réseau sur lequel publier le stratum en clair. C’est une demande, pas une garantie : si le port est déjà pris, le système en attribue un autre et vous avertit. Exécutez l’action État du pool pour voir les ports réellement utilisés. Le modifier n’interrompt pas les mineurs connectés.',
|
||||
104: 'Port réseau sur lequel publier le stratum TLS du réseau local, avec le certificat auto-signé. Une demande, pas une garantie — voir État du pool pour le port réellement utilisé.',
|
||||
105: 'Port réseau sur lequel publier le stratum TLS pour domaine public. Rattachez un domaine à l’interface Stratum (TLS, domaine public) et StartOS émet un certificat Let’s Encrypt — les mineurs le valident sans coller de certificat. Une demande, pas une garantie — voir État du pool pour le port réellement utilisé.',
|
||||
104: 'Port réseau sur lequel publier le stratum TLS du réseau local, avec le certificat auto-signé. Une demande, pas une garantie, voir État du pool pour le port réellement utilisé.',
|
||||
105: 'Port réseau sur lequel publier le stratum TLS pour domaine public. Rattachez un domaine à l’interface Stratum (TLS, domaine public) et StartOS émet un certificat Let’s Encrypt, les mineurs le valident sans coller de certificat. Une demande, pas une garantie, voir État du pool pour le port réellement utilisé.',
|
||||
106: 'Port stratum modifié par StartOS',
|
||||
107: '{label} : demandé {requested}, attribué {assigned}',
|
||||
108: 'Le port demandé était déjà utilisé, StartOS en a donc attribué un autre. Pointez vos mineurs vers le port attribué, ou choisissez-en un libre dans Configurer.',
|
||||
109: 'Port réseau sur lequel publier le stratum TLS pour domaine public. Un domaine rattaché à l’interface Stratum (TLS, domaine public) est publié sur CE port (et non sur celui que le système attribue pour l’accès par IP), et StartOS émet un certificat Let’s Encrypt — les mineurs le valident sans rien coller. Pour y accéder depuis internet, il faut également activer l’adresse publique de cette interface, désactivée par défaut. Voir État du pool pour les ports et domaines réellement utilisés.',
|
||||
110: 'Port réseau sur lequel publier le stratum TLS pour domaine public. Un domaine rattaché à l’interface Stratum (TLS, domaine public) est publié sur CE port, qui peut différer de celui attribué par le système pour l’accès par IP, et StartOS émet un certificat Let’s Encrypt — les mineurs le valident sans rien coller. Voir État du pool pour les ports et domaines réellement utilisés.',
|
||||
109: 'Port réseau sur lequel publier le stratum TLS pour domaine public. Un domaine rattaché à l’interface Stratum (TLS, domaine public) est publié sur CE port (et non sur celui que le système attribue pour l’accès par IP), et StartOS émet un certificat Let’s Encrypt, les mineurs le valident sans rien coller. Pour y accéder depuis internet, il faut également activer l’adresse publique de cette interface, désactivée par défaut. Voir État du pool pour les ports et domaines réellement utilisés.',
|
||||
110: 'Port réseau sur lequel publier le stratum TLS pour domaine public. Un domaine rattaché à l’interface Stratum (TLS, domaine public) est publié sur CE port, qui peut différer de celui attribué par le système pour l’accès par IP, et StartOS émet un certificat Let’s Encrypt, les mineurs le valident sans rien coller. Voir État du pool pour les ports et domaines réellement utilisés.',
|
||||
111: 'Reconstruire les statistiques de parts',
|
||||
112: 'Recompte les statistiques de parts depuis toujours — la répartition des difficultés et les motifs de rejet de la page Statistiques — en relisant le journal de CKPool depuis le début. À utiliser si ces totaux semblent erronés ou remis à zéro. Les totaux enregistrés ne sont remplacés que si le journal comptabilise davantage de parts qu’eux : cette action peut donc restaurer de l’historique, jamais l’effacer.',
|
||||
112: 'Recompte les statistiques de parts depuis toujours, la répartition des difficultés et les motifs de rejet de la page Statistiques, en relisant le journal de CKPool depuis le début. À utiliser si ces totaux semblent erronés ou remis à zéro. Les totaux enregistrés ne sont remplacés que si le journal comptabilise davantage de parts qu’eux : cette action peut donc restaurer de l’historique, jamais l’effacer.',
|
||||
113: 'Sur un pool à longue histoire, cela lit des millions de lignes de journal et peut prendre un certain temps. Le pool continue de miner pendant ce temps.',
|
||||
114: 'Échec de la reconstruction des statistiques de parts — l’API Kamado n’a pas répondu',
|
||||
114: 'Échec de la reconstruction des statistiques de parts, l’API Kamado n’a pas répondu',
|
||||
115: 'Statistiques de parts reconstruites à partir du journal de CKPool',
|
||||
116: 'Statistiques de parts inchangées',
|
||||
},
|
||||
|
||||
@@ -22,7 +22,7 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
||||
// updates the existing binding rather than orphaning it.
|
||||
//
|
||||
// The TLS toggle is deliberately NOT read here: both stratum interfaces now
|
||||
// exist unconditionally, so toggling it no longer rebinds anything — it
|
||||
// exist unconditionally, so toggling it no longer rebinds anything, it
|
||||
// only changes which certificates stunnel serves, which is main.ts's job.
|
||||
const ports = await storeJson
|
||||
.read((s) => ({
|
||||
@@ -57,7 +57,7 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
||||
const uiReceipt = await uiMultiOrigin.export([ui])
|
||||
const receipts = [uiReceipt]
|
||||
|
||||
// Plaintext stratum — a raw TCP interface. Unlike StartOS 0.3.x, 0.4.0
|
||||
// Plaintext stratum, a raw TCP interface. Unlike StartOS 0.3.x, 0.4.0
|
||||
// forwards raw TCP on the LAN, so miners connect directly to the host at
|
||||
// the assigned external port; no router forward or simpleproxy needed.
|
||||
const stratumMulti = sdk.MultiHost.of(effects, stratumHostId)
|
||||
@@ -82,7 +82,7 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
||||
})
|
||||
receipts.push(await stratumOrigin.export([stratum]))
|
||||
|
||||
// TLS stratum — stunnel terminates TLS and forwards to one of ckpool's
|
||||
// TLS stratum, stunnel terminates TLS and forwards to one of ckpool's
|
||||
// loopback-only binds. The OS sees a raw TCP port; TLS lives at the app
|
||||
// layer, so the noSsl scheme is deliberately stratum+ssl.
|
||||
//
|
||||
@@ -90,7 +90,7 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
||||
// that used to gate it. A public domain is attached to an interface in the
|
||||
// StartOS UI, so gating the interface on the toggle made the Let's Encrypt
|
||||
// path unreachable for anyone who had not first enabled the self-signed
|
||||
// one — there was nothing to attach the domain to. main.ts decides whether
|
||||
// one, there was nothing to attach the domain to. main.ts decides whether
|
||||
// stunnel actually runs; when neither a certificate nor a domain is
|
||||
// configured the port simply doesn't answer, and the Stratum TLS health
|
||||
// check says so.
|
||||
@@ -105,7 +105,7 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
||||
name: i18n('Stratum (TLS, Local Network)'),
|
||||
id: 'stratum-tls',
|
||||
description: i18n(
|
||||
'TLS-encrypted stratum endpoint for miners on your local network, using the self-signed certificate (see the Stratum TLS Certificate action). Do not attach a public domain here — StartOS cannot issue a certificate for this endpoint; use Stratum (TLS, Public Domain) instead',
|
||||
'TLS-encrypted stratum endpoint for miners on your local network, using the self-signed certificate (see the Stratum TLS Certificate action). Do not attach a public domain here, StartOS cannot issue a certificate for this endpoint; use Stratum (TLS, Public Domain) instead',
|
||||
),
|
||||
type: 'api',
|
||||
masked: false,
|
||||
@@ -116,12 +116,12 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
||||
})
|
||||
receipts.push(await tlsOrigin.export([stratumTls]))
|
||||
|
||||
// TLS stratum over a public domain — terminated by StartOS, not by us.
|
||||
// TLS stratum over a public domain, terminated by StartOS, not by us.
|
||||
//
|
||||
// This is the only way to get a publicly-trusted certificate: StartOS
|
||||
// provisions ACME certificates solely for bindings it terminates TLS for,
|
||||
// so a raw TCP binding (the two above) is offered no certificate authority
|
||||
// at all when you attach a domain to it — no Let's Encrypt, not even the
|
||||
// at all when you attach a domain to it, no Let's Encrypt, not even the
|
||||
// StartOS root CA. Declaring `addSsl` hands the OS the TLS layer, which is
|
||||
// what makes the LE option appear in the domain dialog.
|
||||
//
|
||||
@@ -157,7 +157,7 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
||||
receipts.push(await publicTlsOrigin.export([stratumPublicTls]))
|
||||
|
||||
// Drop bindings we no longer use. With fixed internal ports and
|
||||
// unconditional TLS bindings, all four are now permanent — this only
|
||||
// unconditional TLS bindings, all four are now permanent, this only
|
||||
// clears orphans left by older versions of this package, which did move the
|
||||
// internal port and did drop the TLS binding when the toggle was off.
|
||||
await sdk.clearBindings(effects, {
|
||||
@@ -171,7 +171,7 @@ export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => {
|
||||
|
||||
// Exported service interfaces are a SECOND registry, independent of the
|
||||
// bindings above and with its own cleanup effect. Clearing bindings alone
|
||||
// leaves an orphaned interface record behind, which the UI still lists — so
|
||||
// leaves an orphaned interface record behind, which the UI still lists, so
|
||||
// a port change can produce two identical "Stratum" rows.
|
||||
await effects.clearServiceInterfaces({
|
||||
except: ['ui', 'stratum', 'stratum-tls', 'stratum-tls-public'],
|
||||
|
||||
+13
-13
@@ -63,7 +63,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
// bitcoind's RPC + ZMQ endpoints over the LXC bridge (see bitcoindBridge in
|
||||
// utils.ts). Each resolves null while bitcoind is absent; the .const()
|
||||
// watches heal main with a restart when bitcoind appears, disappears, or
|
||||
// changes ports — and never on a routine bitcoind update.
|
||||
// changes ports, and never on a routine bitcoind update.
|
||||
const bitcoind = await bitcoindBridge(effects)
|
||||
|
||||
// Clearnet domains attached to the Stratum (TLS, Public Domain) interface.
|
||||
@@ -71,7 +71,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
// interface UI, and attaching or removing one restarts main through the same
|
||||
// reactive mechanism as everything else above.
|
||||
//
|
||||
// Used only to label the connection in the dashboard — the certificates
|
||||
// Used only to label the connection in the dashboard, the certificates
|
||||
// themselves are the OS's concern now, so this never gates anything starting.
|
||||
const tlsDomains = await publicDomains(
|
||||
effects,
|
||||
@@ -181,7 +181,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
// we're never blind to a tip change (every second of stale work in solo
|
||||
// mode is hashrate burned on a dead block):
|
||||
// 1. Blockpoll thread: polls getbestblockhash every `blockpoll` ms. Only
|
||||
// runs when notify=false — so keep notify=false.
|
||||
// runs when notify=false, so keep notify=false.
|
||||
// 2. ZMQ hashblock subscriber: instant push from bitcoind. Point it at
|
||||
// the real bridge endpoint; fall back to ckpool's (dead, harmless)
|
||||
// loopback default while bitcoind's ZMQ interface is unavailable.
|
||||
@@ -229,7 +229,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
ckpoolConfTemplate,
|
||||
)
|
||||
|
||||
// Public-domain TLS is StartOS's job, not ours — see the stratum-tls-public
|
||||
// Public-domain TLS is StartOS's job, not ours, see the stratum-tls-public
|
||||
// interface in interfaces.ts. The OS terminates ACME-backed TLS and forwards
|
||||
// plaintext into ckpool's third bind, so nothing here fetches, writes or
|
||||
// serves a certificate for a public domain.
|
||||
@@ -251,7 +251,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
//
|
||||
// Certificate selection is by SNI, and it degrades in exactly the direction
|
||||
// we need. The primary service's certificate is what a client gets when it
|
||||
// sends no SNI or an unrecognised one — which is precisely the miner that
|
||||
// sends no SNI or an unrecognised one, which is precisely the miner that
|
||||
// connected to a bare LAN IP and therefore cannot use a public certificate
|
||||
// anyway. A miner that connected by domain name sends SNI, matches a
|
||||
// secondary service, and gets the CA-issued certificate for that name.
|
||||
@@ -282,7 +282,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
`accept = 0.0.0.0:${stratumTlsInternalPort}`,
|
||||
`connect = 127.0.0.1:${ckpoolTlsLoopbackPort}`,
|
||||
`cert = ${tlsDir}/stratum.pem`,
|
||||
// No client-cert auth — stratum over TLS is opportunistic encryption;
|
||||
// No client-cert auth, stratum over TLS is opportunistic encryption;
|
||||
// the stratum protocol layer handles miner auth via username.
|
||||
'verify = 0',
|
||||
'',
|
||||
@@ -359,7 +359,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
// network-correct self-test address, renders the final ckpool.conf,
|
||||
// then execs ckpool. When kamado-api kills ckpool on bitcoind
|
||||
// failure (so miners can fail over), StartOS restarts the daemon and
|
||||
// the script blocks again until bitcoind recovers — the 0.3.x
|
||||
// the script blocks again until bitcoind recovers, the 0.3.x
|
||||
// supervised-restart loop, expressed as a daemon.
|
||||
command: ['kamado-ckpool-run.sh'],
|
||||
env: {
|
||||
@@ -390,7 +390,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
if (!h)
|
||||
return {
|
||||
result: 'failure',
|
||||
message: i18n('Kamado API is unreachable — service may be down'),
|
||||
message: i18n('Kamado API is unreachable, service may be down'),
|
||||
}
|
||||
if (h.bitcoin)
|
||||
return {
|
||||
@@ -415,7 +415,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
if (!h)
|
||||
return {
|
||||
result: 'failure',
|
||||
message: i18n('Kamado API is unreachable — service may be down'),
|
||||
message: i18n('Kamado API is unreachable, service may be down'),
|
||||
}
|
||||
const gap = h.submit_gap ?? 0
|
||||
if (gap === 0)
|
||||
@@ -426,7 +426,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
return {
|
||||
result: 'failure',
|
||||
message: `${gap} ${i18n(
|
||||
'block(s) submitted to bitcoind but not confirmed — check Bitcoin Core logs',
|
||||
'block(s) submitted to bitcoind but not confirmed, check Bitcoin Core logs',
|
||||
)}`,
|
||||
}
|
||||
},
|
||||
@@ -444,14 +444,14 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
return {
|
||||
result: 'failure',
|
||||
message: i18n(
|
||||
'Kamado API is unreachable — service may be down',
|
||||
'Kamado API is unreachable, service may be down',
|
||||
),
|
||||
}
|
||||
if (h.zmq_stale)
|
||||
return {
|
||||
result: 'failure',
|
||||
message: i18n(
|
||||
'ZMQ block feed is stale — block notifications are falling back to RPC polling',
|
||||
'ZMQ block feed is stale, block notifications are falling back to RPC polling',
|
||||
),
|
||||
}
|
||||
return {
|
||||
@@ -504,7 +504,7 @@ export const main = sdk.setupMain(async ({ effects }) => {
|
||||
),
|
||||
},
|
||||
// stunnel now runs only when local TLS is on, and that is exactly
|
||||
// when the self-signed certificate it serves is generated — so the
|
||||
// when the self-signed certificate it serves is generated, so the
|
||||
// oneshot is always the dependency.
|
||||
requires: ['tls-cert'],
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ export const short = {
|
||||
|
||||
export const long = {
|
||||
en_US:
|
||||
'Kamado Pool is a solo Bitcoin mining pool built on a patched fork of CKPool-solo. Unlike wrappers that read periodic stats files, Kamado talks directly to CKPool’s Unix socket API to expose real-time per-client hashrate, difficulty, hardware detection, full block history, and best-share leaderboards (current round and all-time) via a Svelte dashboard with WebSocket push. Miners connect to the stratum port with their payout address as username — block rewards go straight to them.',
|
||||
'Kamado Pool is a solo Bitcoin mining pool built on a patched fork of CKPool-solo. Unlike wrappers that read periodic stats files, Kamado talks directly to CKPool’s Unix socket API to expose real-time per-client hashrate, difficulty, hardware detection, full block history, and best-share leaderboards (current round and all-time) via a Svelte dashboard with WebSocket push. Miners connect to the stratum port with their payout address as username, block rewards go straight to them.',
|
||||
es_ES:
|
||||
'Kamado Pool es un pool de minería solo de Bitcoin basado en un fork parcheado de CKPool-solo. Kamado se comunica directamente con la API de socket Unix de CKPool para exponer en tiempo real el hashrate por cliente, la dificultad, la detección de hardware, el historial completo de bloques y las mejores participaciones (ronda actual e histórica) mediante un panel Svelte con WebSocket. Los mineros se conectan al puerto stratum usando su dirección de pago como usuario.',
|
||||
de_DE:
|
||||
|
||||
+17
-17
@@ -19,7 +19,7 @@ export const uiPort = 8080
|
||||
/**
|
||||
* In-container bind ports. These are FIXED and never user-configurable, which
|
||||
* is load-bearing: a binding is keyed by (hostId, internalPort), so moving an
|
||||
* internal port registers a *new* binding and orphans the old one — StartOS
|
||||
* internal port registers a *new* binding and orphans the old one, StartOS
|
||||
* disables the orphan but keeps listing it, and the user sees a duplicate
|
||||
* interface. Keeping these constant means each host has exactly one binding
|
||||
* for the lifetime of the install, and a port change is a pure rebind that
|
||||
@@ -36,7 +36,7 @@ export const stratumTlsInternalPort = 3334
|
||||
* declared to kamado-api via STRATUM_SERVERS (see stratumServers below).
|
||||
*
|
||||
* Both are bound unconditionally, even when nothing is listening in front of
|
||||
* them. That is deliberate — see stratumServerUrls.
|
||||
* them. That is deliberate, see stratumServerUrls.
|
||||
*/
|
||||
/** Self-signed certificate, for miners on the local network. */
|
||||
export const ckpoolTlsLoopbackPort = 3437
|
||||
@@ -46,7 +46,7 @@ export const ckpoolTlsLoopbackPort = 3437
|
||||
* Unlike the self-signed bind above this one listens on 0.0.0.0, because the
|
||||
* terminator in front of it is StartOS itself rather than our in-container
|
||||
* stunnel: the OS decrypts on the public interface and forwards over the LXC
|
||||
* bridge, which never arrives on loopback. It has to be the OS — StartOS only
|
||||
* bridge, which never arrives on loopback. It has to be the OS, StartOS only
|
||||
* provisions ACME certificates for bindings it terminates TLS for, so a raw
|
||||
* TCP binding is offered no certificate authority at all in the UI.
|
||||
*/
|
||||
@@ -71,7 +71,7 @@ export const defaultStratumPublicTlsPort = 3335
|
||||
*
|
||||
* Deliberately not conditional on the local-TLS toggle: the TLS interface is
|
||||
* bound unconditionally now (so a public domain can be attached to it), which
|
||||
* means the two external ports always collide if they match — even with the
|
||||
* means the two external ports always collide if they match, even with the
|
||||
* toggle off.
|
||||
*/
|
||||
export function validatePorts(opts: {
|
||||
@@ -128,7 +128,7 @@ export function stratumServerUrls(): string[] {
|
||||
/**
|
||||
* The meaning of each stratumServerUrls() entry, handed to kamado-api as
|
||||
* STRATUM_SERVERS so the dashboard can name the transport on hover instead of
|
||||
* assuming a bind order. `publicDomains` only affects the label text — the
|
||||
* assuming a bind order. `publicDomains` only affects the label text, the
|
||||
* array shape is fixed.
|
||||
*
|
||||
* These strings surface in the (English-only) dashboard, not the StartOS UI,
|
||||
@@ -136,16 +136,16 @@ export function stratumServerUrls(): string[] {
|
||||
*/
|
||||
export function stratumServers(publicDomains: string[]): StratumServer[] {
|
||||
return [
|
||||
{ kind: 'plain', label: 'Plaintext — not encrypted' },
|
||||
{ kind: 'plain', label: 'Plaintext, not encrypted' },
|
||||
{
|
||||
kind: 'tls-local',
|
||||
label: 'TLS — self-signed certificate (local network)',
|
||||
label: 'TLS, self-signed certificate (local network)',
|
||||
},
|
||||
{
|
||||
kind: 'tls-public',
|
||||
label: publicDomains.length
|
||||
? `TLS — CA-issued certificate for ${publicDomains.join(', ')}`
|
||||
: 'TLS — CA-issued certificate for a public domain',
|
||||
? `TLS, CA-issued certificate for ${publicDomains.join(', ')}`
|
||||
: 'TLS, CA-issued certificate for a public domain',
|
||||
},
|
||||
]
|
||||
}
|
||||
@@ -171,7 +171,7 @@ export type EndpointPort = {
|
||||
/**
|
||||
* Public domains attached to this binding, with the port each is published
|
||||
* on. That port follows the *requested* value, so it can differ from
|
||||
* `assigned` — the domain and the IP addresses of one interface are not
|
||||
* `assigned`: the domain and the IP addresses of one interface are not
|
||||
* necessarily reachable on the same number.
|
||||
*/
|
||||
domains: { fqdn: string; port: number }[]
|
||||
@@ -181,7 +181,7 @@ export type EndpointPort = {
|
||||
* Resolve all three stratum endpoints. `mode` picks the read strategy: 'const'
|
||||
* in main (so a port reassignment re-fires it), 'once' in an action.
|
||||
*
|
||||
* The public-domain endpoint is read from `assignedSslPort` — the OS terminates
|
||||
* The public-domain endpoint is read from `assignedSslPort`, the OS terminates
|
||||
* TLS there, so the port miners connect to is the SSL one; `assignedPort` on
|
||||
* that binding is the decrypted side, which is not published.
|
||||
*/
|
||||
@@ -226,7 +226,7 @@ export async function endpointPorts(
|
||||
const binding = host?.bindings[spec.internalPort]
|
||||
const net = binding?.net
|
||||
// Public domains are published on the port the binding *requested*
|
||||
// (addSsl.preferredExternalPort), not the one the OS assigned — so a
|
||||
// (addSsl.preferredExternalPort), not the one the OS assigned, so a
|
||||
// domain and an IP address on the same interface can advertise
|
||||
// different ports. Read the domain entries rather than deriving them.
|
||||
const domains = (binding?.addresses.available ?? [])
|
||||
@@ -276,7 +276,7 @@ export const stratumPublicTlsHostId = 'stratum-tls-public'
|
||||
export const kamadoRoot = '/root/.kamado'
|
||||
/** ckpool volume mountpoint: ckpool's own state + daily logs (logs/) */
|
||||
export const ckpoolRoot = '/root/.ckpool'
|
||||
/** bitcoind's data dir (read-only dependency mount) — used for .cookie auth */
|
||||
/** bitcoind's data dir (read-only dependency mount), used for .cookie auth */
|
||||
export const btcMountpoint = '/mnt/bitcoind'
|
||||
|
||||
export const ckpoolLogDir = `${ckpoolRoot}/logs`
|
||||
@@ -288,8 +288,8 @@ export const tlsDir = `${kamadoRoot}/tls`
|
||||
|
||||
/**
|
||||
* stunnel's config directory, on the subcontainer rootfs rather than a volume.
|
||||
* The config is re-rendered on every main run, so — like ckpool.conf and its
|
||||
* RPC credentials — it lives somewhere ephemeral. The self-signed certificate
|
||||
* The config is re-rendered on every main run, so, like ckpool.conf and its
|
||||
* RPC credentials, it lives somewhere ephemeral. The self-signed certificate
|
||||
* it serves is the one thing that stays on the volume, because its fingerprint
|
||||
* has to survive restarts for miners that pin it.
|
||||
*/
|
||||
@@ -395,7 +395,7 @@ export function bridgeAddress(
|
||||
|
||||
/**
|
||||
* Public (clearnet) domains the user has attached to a host, as a minimal
|
||||
* reactive value — the same pattern as bridgeAddress.
|
||||
* reactive value, the same pattern as bridgeAddress.
|
||||
*
|
||||
* The user adds these in the StartOS interface UI, so this is the package's
|
||||
* only source of truth for "is there a domain to get a CA-issued certificate
|
||||
@@ -426,7 +426,7 @@ export function publicDomains(
|
||||
|
||||
/**
|
||||
* bitcoind's RPC and ZMQ-block endpoints over the LXC bridge. Two reactive
|
||||
* bridge-address watches — one per bitcoind host — each chained `.const()`,
|
||||
* bridge-address watches, one per bitcoind host, each chained `.const()`,
|
||||
* so main restarts only when an address actually changes: a bitcoind update
|
||||
* is 0 restarts, bitcoind installed after Kamado is one healing restart, and
|
||||
* uninstall is one restart. Each resolves null while bitcoind is absent (or,
|
||||
|
||||
@@ -6,11 +6,13 @@ import { v0_2_3 } from './v0_2_3'
|
||||
import { v0_2_4 } from './v0_2_4'
|
||||
import { v0_2_5 } from './v0_2_5'
|
||||
import { v0_2_6 } from './v0_2_6'
|
||||
import { v0_2_7 } from './v0_2_7'
|
||||
import { v0_2_8 } from './v0_2_8'
|
||||
|
||||
// The current version must be listed first; `other` carries the rest of the
|
||||
// graph so StartOS can find a migration path from whatever version an existing
|
||||
// install is currently on.
|
||||
export const versionGraph = VersionGraph.of({
|
||||
current: v0_2_6,
|
||||
other: [v0_2_0, v0_2_1, v0_2_2, v0_2_3, v0_2_4, v0_2_5],
|
||||
current: v0_2_8,
|
||||
other: [v0_2_0, v0_2_1, v0_2_2, v0_2_3, v0_2_4, v0_2_5, v0_2_6, v0_2_7],
|
||||
})
|
||||
@@ -24,21 +24,21 @@ export const v0_2_0 = VersionInfo.of({
|
||||
version: '0.2.0:3',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'The configurable stratum ports now set only the external (network-facing) port. The in-container ports are fixed, so changing a port no longer leaves a duplicate Stratum interface behind and no longer restarts the pool — connected miners stay connected. StartOS 0.4.0 port: stratum is exposed directly on the LAN as a raw TCP interface (no more router forwards or simpleproxy), Bitcoin Core is reached over the internal network bridge with cookie authentication, and settings moved from Config to the Configure action. Existing settings, found-block history, and the stratum TLS certificate are migrated automatically.',
|
||||
'The configurable stratum ports now set only the external (network-facing) port. The in-container ports are fixed, so changing a port no longer leaves a duplicate Stratum interface behind and no longer restarts the pool, connected miners stay connected. StartOS 0.4.0 port: stratum is exposed directly on the LAN as a raw TCP interface (no more router forwards or simpleproxy), Bitcoin Core is reached over the internal network bridge with cookie authentication, and settings moved from Config to the Configure action. Existing settings, found-block history, and the stratum TLS certificate are migrated automatically.',
|
||||
es_ES:
|
||||
'Los puertos stratum configurables ahora solo definen el puerto externo (de red). Los puertos internos del contenedor son fijos, así que cambiar un puerto ya no deja una interfaz Stratum duplicada ni reinicia el pool: los mineros conectados siguen conectados. Adaptación a StartOS 0.4.0: Stratum se expone directamente en la LAN como interfaz TCP, Bitcoin Core se alcanza a través del puente de red interno con autenticación por cookie, y la configuración se movió a la acción Configurar. Los ajustes existentes, el historial de bloques y el certificado TLS se migran automáticamente.',
|
||||
de_DE:
|
||||
'Die konfigurierbaren Stratum-Ports legen jetzt nur noch den externen (netzseitigen) Port fest. Die containerinternen Ports sind fix, sodass eine Portänderung keine doppelte Stratum-Schnittstelle hinterlässt und den Pool nicht neu startet — verbundene Miner bleiben verbunden. Portierung auf StartOS 0.4.0: Stratum wird direkt im LAN als TCP-Schnittstelle bereitgestellt, Bitcoin Core wird über die interne Netzwerk-Bridge mit Cookie-Authentifizierung erreicht, und die Einstellungen sind in die Aktion „Konfigurieren“ umgezogen. Bestehende Einstellungen, Blockhistorie und das TLS-Zertifikat werden automatisch migriert.',
|
||||
'Die konfigurierbaren Stratum-Ports legen jetzt nur noch den externen (netzseitigen) Port fest. Die containerinternen Ports sind fix, sodass eine Portänderung keine doppelte Stratum-Schnittstelle hinterlässt und den Pool nicht neu startet, verbundene Miner bleiben verbunden. Portierung auf StartOS 0.4.0: Stratum wird direkt im LAN als TCP-Schnittstelle bereitgestellt, Bitcoin Core wird über die interne Netzwerk-Bridge mit Cookie-Authentifizierung erreicht, und die Einstellungen sind in die Aktion „Konfigurieren“ umgezogen. Bestehende Einstellungen, Blockhistorie und das TLS-Zertifikat werden automatisch migriert.',
|
||||
pl_PL:
|
||||
'Konfigurowalne porty stratum ustawiają teraz wyłącznie port zewnętrzny (sieciowy). Porty wewnątrz kontenera są stałe, więc zmiana portu nie pozostawia już zduplikowanego interfejsu Stratum ani nie restartuje puli — podłączeni górnicy pozostają połączeni. Port na StartOS 0.4.0: Stratum jest udostępniany bezpośrednio w sieci LAN jako interfejs TCP, Bitcoin Core jest osiągany przez wewnętrzny mostek sieciowy z uwierzytelnianiem cookie, a ustawienia przeniesiono do akcji Konfiguruj. Istniejące ustawienia, historia bloków i certyfikat TLS są migrowane automatycznie.',
|
||||
'Konfigurowalne porty stratum ustawiają teraz wyłącznie port zewnętrzny (sieciowy). Porty wewnątrz kontenera są stałe, więc zmiana portu nie pozostawia już zduplikowanego interfejsu Stratum ani nie restartuje puli, podłączeni górnicy pozostają połączeni. Port na StartOS 0.4.0: Stratum jest udostępniany bezpośrednio w sieci LAN jako interfejs TCP, Bitcoin Core jest osiągany przez wewnętrzny mostek sieciowy z uwierzytelnianiem cookie, a ustawienia przeniesiono do akcji Konfiguruj. Istniejące ustawienia, historia bloków i certyfikat TLS są migrowane automatycznie.',
|
||||
fr_FR:
|
||||
'Les ports stratum configurables ne définissent plus que le port externe (côté réseau). Les ports internes au conteneur sont fixes : changer un port ne laisse plus d’interface Stratum en double et ne redémarre plus le pool — les mineurs connectés le restent. Portage vers StartOS 0.4.0 : Stratum est exposé directement sur le LAN comme interface TCP, Bitcoin Core est atteint via le pont réseau interne avec authentification par cookie, et les réglages ont migré vers l’action Configurer. Les réglages existants, l’historique des blocs et le certificat TLS sont migrés automatiquement.',
|
||||
'Les ports stratum configurables ne définissent plus que le port externe (côté réseau). Les ports internes au conteneur sont fixes : changer un port ne laisse plus d’interface Stratum en double et ne redémarre plus le pool, les mineurs connectés le restent. Portage vers StartOS 0.4.0 : Stratum est exposé directement sur le LAN comme interface TCP, Bitcoin Core est atteint via le pont réseau interne avec authentification par cookie, et les réglages ont migré vers l’action Configurer. Les réglages existants, l’historique des blocs et le certificat TLS sont migrés automatiquement.',
|
||||
},
|
||||
migrations: {
|
||||
up: async ({ effects }) => {
|
||||
// Migrate from the 0.3.5.1 wrapper: its config.yaml lives on the main
|
||||
// volume under start9/. The SQLite DB (data/kamado.db), TLS certs
|
||||
// (tls/) and the ckpool volume carry over untouched — only the config
|
||||
// (tls/) and the ckpool volume carry over untouched, only the config
|
||||
// format changed.
|
||||
const configYaml: LegacyConfig | undefined = await readFile(
|
||||
'/media/startos/volumes/main/start9/config.yaml',
|
||||
|
||||
@@ -8,13 +8,13 @@ export const v0_2_1 = VersionInfo.of({
|
||||
es_ES:
|
||||
'Stratum TLS ahora funciona por internet sin configurar ningún certificado: adjunte un dominio de clearnet a la interfaz Stratum (TLS) y StartOS emitirá un certificado de Let’s Encrypt que Kamado sirve automáticamente. El certificado autofirmado se sigue sirviendo en el mismo puerto para los mineros de su red local, elegido por conexión, así que ambos casos funcionan a la vez sin un segundo puerto. El interruptor TLS en Configurar ahora se llama «Stratum TLS (red local)» y cubre solo el certificado autofirmado, y la interfaz TLS aparece siempre, de modo que puede adjuntarle un dominio sin activar antes el TLS local. El candado del panel ahora indica, al pasar el ratón, cuál de los dos certificados usa cada minero.',
|
||||
de_DE:
|
||||
'Stratum-TLS funktioniert jetzt ohne Zertifikatseinrichtung über das Internet: Hängen Sie eine Clearnet-Domain an die Schnittstelle Stratum (TLS) an, und StartOS stellt ein Let’s-Encrypt-Zertifikat aus, das Kamado automatisch bereitstellt. Das selbstsignierte Zertifikat wird weiterhin auf demselben Port für Miner im lokalen Netzwerk bereitgestellt, pro Verbindung ausgewählt — beides funktioniert gleichzeitig, ohne zweiten Port. Der TLS-Schalter unter „Konfigurieren“ heißt jetzt „Stratum-TLS (lokales Netzwerk)“ und betrifft nur das selbstsignierte Zertifikat, und die TLS-Schnittstelle wird immer angezeigt, sodass Sie ihr eine Domain zuweisen können, ohne zuvor lokales TLS zu aktivieren. Das Schloss-Symbol im Dashboard zeigt beim Daraufzeigen, welches der beiden Zertifikate ein Miner verwendet.',
|
||||
'Stratum-TLS funktioniert jetzt ohne Zertifikatseinrichtung über das Internet: Hängen Sie eine Clearnet-Domain an die Schnittstelle Stratum (TLS) an, und StartOS stellt ein Let’s-Encrypt-Zertifikat aus, das Kamado automatisch bereitstellt. Das selbstsignierte Zertifikat wird weiterhin auf demselben Port für Miner im lokalen Netzwerk bereitgestellt, pro Verbindung ausgewählt, beides funktioniert gleichzeitig, ohne zweiten Port. Der TLS-Schalter unter „Konfigurieren“ heißt jetzt „Stratum-TLS (lokales Netzwerk)“ und betrifft nur das selbstsignierte Zertifikat, und die TLS-Schnittstelle wird immer angezeigt, sodass Sie ihr eine Domain zuweisen können, ohne zuvor lokales TLS zu aktivieren. Das Schloss-Symbol im Dashboard zeigt beim Daraufzeigen, welches der beiden Zertifikate ein Miner verwendet.',
|
||||
pl_PL:
|
||||
'Stratum TLS działa teraz przez internet bez konfigurowania certyfikatu: podłącz domenę clearnet do interfejsu Stratum (TLS), a StartOS wystawi certyfikat Let’s Encrypt, który Kamado udostępnia automatycznie. Certyfikat samopodpisany jest nadal udostępniany na tym samym porcie dla górników w sieci lokalnej, wybierany dla każdego połączenia, więc oba przypadki działają jednocześnie bez drugiego portu. Przełącznik TLS w akcji Konfiguruj nazywa się teraz „Stratum TLS (sieć lokalna)” i dotyczy wyłącznie certyfikatu samopodpisanego, a interfejs TLS jest zawsze widoczny, więc można podłączyć do niego domenę bez wcześniejszego włączania lokalnego TLS. Kłódka w panelu pokazuje po najechaniu kursorem, którego z dwóch certyfikatów używa dany górnik.',
|
||||
fr_FR:
|
||||
'Le stratum TLS fonctionne désormais sur internet sans aucune configuration de certificat : rattachez un domaine clearnet à l’interface Stratum (TLS) et StartOS émet un certificat Let’s Encrypt que Kamado présente automatiquement. Le certificat auto-signé reste présenté sur le même port pour les mineurs de votre réseau local, choisi connexion par connexion, si bien que les deux fonctionnent simultanément sans second port. Le commutateur TLS dans Configurer s’appelle maintenant « Stratum TLS (réseau local) » et ne concerne que le certificat auto-signé, et l’interface TLS est toujours affichée, ce qui permet d’y rattacher un domaine sans activer d’abord le TLS local. Le cadenas du tableau de bord indique désormais au survol lequel des deux certificats chaque mineur utilise.',
|
||||
},
|
||||
// No data migration in either direction. store.json is unchanged — the TLS
|
||||
// No data migration in either direction. store.json is unchanged, the TLS
|
||||
// toggle deliberately kept its `tlsEnabled` key when its scope narrowed to
|
||||
// the local network, so existing settings carry over untouched. The new
|
||||
// unconditional stratum-tls binding is registered by setInterfaces on init,
|
||||
|
||||
@@ -4,15 +4,15 @@ export const v0_2_2 = VersionInfo.of({
|
||||
version: '0.2.2:1',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'Let’s Encrypt now actually works. Certificates for a public domain are issued and served by StartOS itself on a new "Stratum (TLS, Public Domain)" interface — attach a domain to it and the Let’s Encrypt option appears, which it never did before. The previous approach could not work: StartOS only issues certificates for endpoints it terminates TLS for, so miners on a domain were served the self-signed certificate instead and rejected it. The plaintext and local self-signed TLS endpoints are unchanged, so nothing already working needs touching, and the dashboard padlock still names which certificate each miner used. The port fields are now named “Preferred”, because StartOS assigns a different port when the one you ask for is already taken — when that happens you now get a notification naming both numbers, and the Pool Status action lists the ports actually in use. Pool Status now also lists any domain attached to an interface with the port it is published on.',
|
||||
'Let’s Encrypt now actually works. Certificates for a public domain are issued and served by StartOS itself on a new "Stratum (TLS, Public Domain)" interface, attach a domain to it and the Let’s Encrypt option appears, which it never did before. The previous approach could not work: StartOS only issues certificates for endpoints it terminates TLS for, so miners on a domain were served the self-signed certificate instead and rejected it. The plaintext and local self-signed TLS endpoints are unchanged, so nothing already working needs touching, and the dashboard padlock still names which certificate each miner used. The port fields are now named “Preferred”, because StartOS assigns a different port when the one you ask for is already taken, when that happens you now get a notification naming both numbers, and the Pool Status action lists the ports actually in use. Pool Status now also lists any domain attached to an interface with the port it is published on.',
|
||||
es_ES:
|
||||
'Let’s Encrypt ya funciona de verdad. Los certificados para un dominio público los emite y sirve StartOS en una nueva interfaz «Stratum (TLS, dominio público)»: adjúntele un dominio y aparecerá la opción de Let’s Encrypt, que antes nunca salía. El enfoque anterior no podía funcionar: StartOS solo emite certificados para los extremos en los que él mismo termina TLS, así que a los mineros conectados por dominio se les servía el certificado autofirmado y lo rechazaban. Los extremos de texto plano y de TLS autofirmado local no cambian, así que no hay que tocar nada que ya funcione, y el candado del panel sigue indicando qué certificado usó cada minero. Los campos de puerto ahora se llaman «preferido», porque StartOS asigna otro puerto cuando el solicitado ya está ocupado: en ese caso recibirá una notificación con ambos números, y la acción Estado del pool lista los puertos realmente en uso. Estado del pool ahora también lista los dominios adjuntos a cada interfaz con el puerto en el que se publican.',
|
||||
de_DE:
|
||||
'Let’s Encrypt funktioniert jetzt wirklich. Zertifikate für eine öffentliche Domain stellt und liefert StartOS selbst über die neue Schnittstelle „Stratum (TLS, öffentliche Domain)“ — hängen Sie eine Domain daran an, und die Let’s-Encrypt-Option erscheint, was zuvor nie der Fall war. Der bisherige Ansatz konnte nicht funktionieren: StartOS stellt Zertifikate nur für Endpunkte aus, deren TLS es selbst terminiert, sodass Miner über eine Domain das selbstsignierte Zertifikat erhielten und es ablehnten. Die Klartext- und die lokale selbstsignierte TLS-Schnittstelle bleiben unverändert, es muss also nichts angefasst werden, was bereits funktioniert, und das Schloss im Dashboard benennt weiterhin das verwendete Zertifikat. Die Port-Felder heißen jetzt „bevorzugt“, weil StartOS einen anderen Port zuweist, wenn der gewünschte bereits belegt ist — in diesem Fall erhalten Sie jetzt eine Benachrichtigung mit beiden Nummern, und die Aktion „Pool-Status“ listet die tatsächlich verwendeten Ports auf. „Pool-Status“ listet jetzt auch jede an eine Schnittstelle angehängte Domain mit dem Port auf, unter dem sie veröffentlicht wird.',
|
||||
'Let’s Encrypt funktioniert jetzt wirklich. Zertifikate für eine öffentliche Domain stellt und liefert StartOS selbst über die neue Schnittstelle „Stratum (TLS, öffentliche Domain)“, hängen Sie eine Domain daran an, und die Let’s-Encrypt-Option erscheint, was zuvor nie der Fall war. Der bisherige Ansatz konnte nicht funktionieren: StartOS stellt Zertifikate nur für Endpunkte aus, deren TLS es selbst terminiert, sodass Miner über eine Domain das selbstsignierte Zertifikat erhielten und es ablehnten. Die Klartext- und die lokale selbstsignierte TLS-Schnittstelle bleiben unverändert, es muss also nichts angefasst werden, was bereits funktioniert, und das Schloss im Dashboard benennt weiterhin das verwendete Zertifikat. Die Port-Felder heißen jetzt „bevorzugt“, weil StartOS einen anderen Port zuweist, wenn der gewünschte bereits belegt ist, in diesem Fall erhalten Sie jetzt eine Benachrichtigung mit beiden Nummern, und die Aktion „Pool-Status“ listet die tatsächlich verwendeten Ports auf. „Pool-Status“ listet jetzt auch jede an eine Schnittstelle angehängte Domain mit dem Port auf, unter dem sie veröffentlicht wird.',
|
||||
pl_PL:
|
||||
'Let’s Encrypt wreszcie działa. Certyfikaty dla domeny publicznej wystawia i udostępnia sam StartOS w nowym interfejsie „Stratum (TLS, domena publiczna)” — podłącz do niego domenę, a pojawi się opcja Let’s Encrypt, której wcześniej nigdy nie było. Poprzednie podejście nie mogło działać: StartOS wystawia certyfikaty wyłącznie dla punktów końcowych, dla których sam kończy TLS, więc górnicy łączący się przez domenę otrzymywali certyfikat samopodpisany i go odrzucali. Punkty końcowe nieszyfrowany i lokalny TLS samopodpisany pozostają bez zmian, więc nie trzeba ruszać niczego, co już działa, a kłódka w panelu nadal wskazuje użyty certyfikat. Pola portów nazywają się teraz „preferowany”, ponieważ StartOS przydziela inny port, gdy żądany jest już zajęty — w takim przypadku otrzymasz powiadomienie z obydwoma numerami, a akcja Stan puli wypisuje faktycznie używane porty. Stan puli wypisuje teraz również domeny podłączone do każdego interfejsu wraz z portem, na którym są publikowane.',
|
||||
'Let’s Encrypt wreszcie działa. Certyfikaty dla domeny publicznej wystawia i udostępnia sam StartOS w nowym interfejsie „Stratum (TLS, domena publiczna)”, podłącz do niego domenę, a pojawi się opcja Let’s Encrypt, której wcześniej nigdy nie było. Poprzednie podejście nie mogło działać: StartOS wystawia certyfikaty wyłącznie dla punktów końcowych, dla których sam kończy TLS, więc górnicy łączący się przez domenę otrzymywali certyfikat samopodpisany i go odrzucali. Punkty końcowe nieszyfrowany i lokalny TLS samopodpisany pozostają bez zmian, więc nie trzeba ruszać niczego, co już działa, a kłódka w panelu nadal wskazuje użyty certyfikat. Pola portów nazywają się teraz „preferowany”, ponieważ StartOS przydziela inny port, gdy żądany jest już zajęty, w takim przypadku otrzymasz powiadomienie z obydwoma numerami, a akcja Stan puli wypisuje faktycznie używane porty. Stan puli wypisuje teraz również domeny podłączone do każdego interfejsu wraz z portem, na którym są publikowane.',
|
||||
fr_FR:
|
||||
'Let’s Encrypt fonctionne enfin. Les certificats pour un domaine public sont émis et présentés par StartOS lui-même sur une nouvelle interface « Stratum (TLS, domaine public) » : rattachez-y un domaine et l’option Let’s Encrypt apparaît, ce qui n’était jamais le cas auparavant. L’approche précédente ne pouvait pas fonctionner : StartOS n’émet des certificats que pour les points de terminaison dont il termine lui-même le TLS, si bien que les mineurs passant par un domaine recevaient le certificat auto-signé et le rejetaient. Les points de terminaison en clair et TLS auto-signé local sont inchangés, rien de ce qui fonctionne déjà n’est à modifier, et le cadenas du tableau de bord indique toujours quel certificat chaque mineur a utilisé. Les champs de port s’appellent désormais « préféré », car StartOS attribue un autre port lorsque celui demandé est déjà pris — dans ce cas vous recevez une notification indiquant les deux numéros, et l’action État du pool liste les ports réellement utilisés. État du pool liste désormais aussi les domaines rattachés à chaque interface avec le port sur lequel ils sont publiés.',
|
||||
'Let’s Encrypt fonctionne enfin. Les certificats pour un domaine public sont émis et présentés par StartOS lui-même sur une nouvelle interface « Stratum (TLS, domaine public) » : rattachez-y un domaine et l’option Let’s Encrypt apparaît, ce qui n’était jamais le cas auparavant. L’approche précédente ne pouvait pas fonctionner : StartOS n’émet des certificats que pour les points de terminaison dont il termine lui-même le TLS, si bien que les mineurs passant par un domaine recevaient le certificat auto-signé et le rejetaient. Les points de terminaison en clair et TLS auto-signé local sont inchangés, rien de ce qui fonctionne déjà n’est à modifier, et le cadenas du tableau de bord indique toujours quel certificat chaque mineur a utilisé. Les champs de port s’appellent désormais « préféré », car StartOS attribue un autre port lorsque celui demandé est déjà pris, dans ce cas vous recevez une notification indiquant les deux numéros, et l’action État du pool liste les ports réellement utilisés. État du pool liste désormais aussi les domaines rattachés à chaque interface avec le port sur lequel ils sont publiés.',
|
||||
},
|
||||
// No data migration. The new `stratumPublicTlsPort` store field materializes
|
||||
// from its `.catch()` default on first read, and the new interface is
|
||||
|
||||
@@ -4,19 +4,19 @@ export const v0_2_3 = VersionInfo.of({
|
||||
version: '0.2.3:0',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'The best-share page can now show you the proof of work itself. A new "Show PoW" button opens the block header behind your best share, drawn as a block with every field in place — version, previous block, merkle root, time, bits and nonce — next to the raw 80 bytes the miner hashed. Press Verify and the page replays the whole verification in front of you: it rebuilds the merkle root from the coinbase transaction and its branch hashes, pads the header into message blocks, runs the real SHA-256 compression rounds, hashes the result a second time, reverses the bytes and compares the hash against the share and network targets. Every value comes from your own share and is computed in your browser, so you can confirm the pool is telling the truth without having to trust it — and the raw header plus a one-line terminal command are there to check it elsewhere. Headers are only recorded from this version onward: a best share found earlier cannot be reconstructed, so until a new record is set the page shows the best share since the update and says so. Restarting the service no longer produces a burst of rejected shares either. Miners were being sent work before they were told which difficulty to work at, and every miner was reset to the pool’s starting difficulty, so the first shares after each restart came back rejected. The difficulty is now sent first, miners resume at the difficulty they had already been tuned to instead of starting over, and work they had already begun is accepted rather than rejected. Pool Status also reports the state of best-share header capture.',
|
||||
'The best-share page can now show you the proof of work itself. A new "Show PoW" button opens the block header behind your best share, drawn as a block with every field in place, version, previous block, merkle root, time, bits and nonce, next to the raw 80 bytes the miner hashed. Press Verify and the page replays the whole verification in front of you: it rebuilds the merkle root from the coinbase transaction and its branch hashes, pads the header into message blocks, runs the real SHA-256 compression rounds, hashes the result a second time, reverses the bytes and compares the hash against the share and network targets. Every value comes from your own share and is computed in your browser, so you can confirm the pool is telling the truth without having to trust it, and the raw header plus a one-line terminal command are there to check it elsewhere. Headers are only recorded from this version onward: a best share found earlier cannot be reconstructed, so until a new record is set the page shows the best share since the update and says so. Restarting the service no longer produces a burst of rejected shares either. Miners were being sent work before they were told which difficulty to work at, and every miner was reset to the pool’s starting difficulty, so the first shares after each restart came back rejected. The difficulty is now sent first, miners resume at the difficulty they had already been tuned to instead of starting over, and work they had already begun is accepted rather than rejected. Pool Status also reports the state of best-share header capture.',
|
||||
es_ES:
|
||||
'La página de mejores participaciones ya puede mostrarle la prueba de trabajo en sí. Un nuevo botón «Mostrar PoW» abre la cabecera de bloque de su mejor participación, dibujada como un bloque con cada campo en su sitio —versión, bloque anterior, raíz de Merkle, hora, bits y nonce—, junto a los 80 bytes en bruto que el minero pasó por el hash. Pulse Verificar y la página reproduce toda la verificación ante usted: reconstruye la raíz de Merkle a partir de la transacción coinbase y sus hashes de rama, rellena la cabecera en bloques de mensaje, ejecuta las rondas de compresión reales de SHA-256, vuelve a aplicar el hash al resultado, invierte los bytes y compara el hash con el objetivo de la participación y con el de la red. Todos los valores proceden de su propia participación y se calculan en su navegador, así que puede comprobar que el pool dice la verdad sin tener que confiar en él; además dispone de la cabecera en bruto y de una orden de terminal de una sola línea para verificarlo por fuera. Las cabeceras solo se registran a partir de esta versión: una mejor participación encontrada antes no puede reconstruirse, así que hasta que se establezca un nuevo récord la página muestra la mejor participación desde la actualización y lo indica. Reiniciar el servicio tampoco provoca ya una ráfaga de participaciones rechazadas. A los mineros se les enviaba trabajo antes de indicarles con qué dificultad debían trabajar, y todos se reiniciaban con la dificultad inicial del pool, de modo que las primeras participaciones tras cada reinicio se rechazaban. Ahora la dificultad se envía primero, los mineros retoman la dificultad a la que ya estaban ajustados en lugar de empezar de cero, y el trabajo ya iniciado se acepta en vez de rechazarse. Estado del pool informa además del estado del registro de cabeceras.',
|
||||
'La página de mejores participaciones ya puede mostrarle la prueba de trabajo en sí. Un nuevo botón «Mostrar PoW» abre la cabecera de bloque de su mejor participación, dibujada como un bloque con cada campo en su sitio, versión, bloque anterior, raíz de Merkle, hora, bits y nonce, junto a los 80 bytes en bruto que el minero pasó por el hash. Pulse Verificar y la página reproduce toda la verificación ante usted: reconstruye la raíz de Merkle a partir de la transacción coinbase y sus hashes de rama, rellena la cabecera en bloques de mensaje, ejecuta las rondas de compresión reales de SHA-256, vuelve a aplicar el hash al resultado, invierte los bytes y compara el hash con el objetivo de la participación y con el de la red. Todos los valores proceden de su propia participación y se calculan en su navegador, así que puede comprobar que el pool dice la verdad sin tener que confiar en él; además dispone de la cabecera en bruto y de una orden de terminal de una sola línea para verificarlo por fuera. Las cabeceras solo se registran a partir de esta versión: una mejor participación encontrada antes no puede reconstruirse, así que hasta que se establezca un nuevo récord la página muestra la mejor participación desde la actualización y lo indica. Reiniciar el servicio tampoco provoca ya una ráfaga de participaciones rechazadas. A los mineros se les enviaba trabajo antes de indicarles con qué dificultad debían trabajar, y todos se reiniciaban con la dificultad inicial del pool, de modo que las primeras participaciones tras cada reinicio se rechazaban. Ahora la dificultad se envía primero, los mineros retoman la dificultad a la que ya estaban ajustados en lugar de empezar de cero, y el trabajo ya iniciado se acepta en vez de rechazarse. Estado del pool informa además del estado del registro de cabeceras.',
|
||||
de_DE:
|
||||
'Die Bestwert-Seite kann Ihnen jetzt den Arbeitsnachweis selbst zeigen. Eine neue Schaltfläche „PoW anzeigen“ öffnet den Blockheader hinter Ihrem besten Share, gezeichnet als Block mit jedem Feld an seinem Platz — Version, vorheriger Block, Merkle-Wurzel, Zeit, Bits und Nonce — daneben die rohen 80 Bytes, die der Miner gehasht hat. Klicken Sie auf „Überprüfen“, und die Seite spielt die gesamte Überprüfung vor Ihren Augen ab: Sie baut die Merkle-Wurzel aus der Coinbase-Transaktion und ihren Zweig-Hashes neu auf, füllt den Header zu Nachrichtenblöcken auf, durchläuft die echten SHA-256-Kompressionsrunden, hasht das Ergebnis ein zweites Mal, dreht die Bytes um und vergleicht den Hash mit dem Share-Ziel und dem Netzwerk-Ziel. Alle angezeigten Werte stammen aus Ihrem eigenen Share und werden in Ihrem Browser berechnet, sodass Sie überprüfen können, ob der Pool die Wahrheit sagt, ohne ihm vertrauen zu müssen — und der rohe Header sowie ein einzeiliger Terminalbefehl stehen bereit, um es anderswo nachzurechnen. Header werden erst ab dieser Version aufgezeichnet: ein früher gefundener bester Share lässt sich nicht rekonstruieren, daher zeigt die Seite bis zum nächsten Rekord den besten Share seit dem Update und weist darauf hin. Auch ein Neustart des Dienstes führt nicht mehr zu einer Welle abgelehnter Shares. Miner erhielten Arbeit, bevor ihnen die Schwierigkeit mitgeteilt wurde, und jeder Miner wurde auf die Startschwierigkeit des Pools zurückgesetzt, sodass die ersten Shares nach jedem Neustart abgelehnt wurden. Nun wird zuerst die Schwierigkeit gesendet, Miner setzen mit der Schwierigkeit fort, auf die sie bereits eingestellt waren, statt von vorn zu beginnen, und bereits begonnene Arbeit wird angenommen statt abgelehnt. „Pool-Status“ meldet zudem den Zustand der Header-Aufzeichnung.',
|
||||
'Die Bestwert-Seite kann Ihnen jetzt den Arbeitsnachweis selbst zeigen. Eine neue Schaltfläche „PoW anzeigen“ öffnet den Blockheader hinter Ihrem besten Share, gezeichnet als Block mit jedem Feld an seinem Platz, Version, vorheriger Block, Merkle-Wurzel, Zeit, Bits und Nonce, daneben die rohen 80 Bytes, die der Miner gehasht hat. Klicken Sie auf „Überprüfen“, und die Seite spielt die gesamte Überprüfung vor Ihren Augen ab: Sie baut die Merkle-Wurzel aus der Coinbase-Transaktion und ihren Zweig-Hashes neu auf, füllt den Header zu Nachrichtenblöcken auf, durchläuft die echten SHA-256-Kompressionsrunden, hasht das Ergebnis ein zweites Mal, dreht die Bytes um und vergleicht den Hash mit dem Share-Ziel und dem Netzwerk-Ziel. Alle angezeigten Werte stammen aus Ihrem eigenen Share und werden in Ihrem Browser berechnet, sodass Sie überprüfen können, ob der Pool die Wahrheit sagt, ohne ihm vertrauen zu müssen, und der rohe Header sowie ein einzeiliger Terminalbefehl stehen bereit, um es anderswo nachzurechnen. Header werden erst ab dieser Version aufgezeichnet: ein früher gefundener bester Share lässt sich nicht rekonstruieren, daher zeigt die Seite bis zum nächsten Rekord den besten Share seit dem Update und weist darauf hin. Auch ein Neustart des Dienstes führt nicht mehr zu einer Welle abgelehnter Shares. Miner erhielten Arbeit, bevor ihnen die Schwierigkeit mitgeteilt wurde, und jeder Miner wurde auf die Startschwierigkeit des Pools zurückgesetzt, sodass die ersten Shares nach jedem Neustart abgelehnt wurden. Nun wird zuerst die Schwierigkeit gesendet, Miner setzen mit der Schwierigkeit fort, auf die sie bereits eingestellt waren, statt von vorn zu beginnen, und bereits begonnene Arbeit wird angenommen statt abgelehnt. „Pool-Status“ meldet zudem den Zustand der Header-Aufzeichnung.',
|
||||
pl_PL:
|
||||
'Strona najlepszych udziałów może teraz pokazać sam dowód pracy. Nowy przycisk „Pokaż PoW” otwiera nagłówek bloku stojący za najlepszym udziałem, narysowany jako blok z każdym polem na swoim miejscu — wersja, poprzedni blok, korzeń Merkle, czas, bity i nonce — obok surowych 80 bajtów, które górnik poddał haszowaniu. Naciśnij „Zweryfikuj”, a strona odtworzy całą weryfikację na Twoich oczach: odbuduje korzeń Merkle z transakcji coinbase i jej haszy gałęzi, uzupełni nagłówek do bloków wiadomości, przejdzie przez prawdziwe rundy kompresji SHA-256, zahaszuje wynik po raz drugi, odwróci bajty i porówna hasz z celem udziału oraz z celem sieci. Wszystkie pokazane wartości pochodzą z Twojego własnego udziału i są obliczane w przeglądarce, więc możesz sprawdzić, czy pula mówi prawdę, nie musząc jej ufać — a surowy nagłówek i jednolinijkowe polecenie terminala pozwalają zweryfikować to gdzie indziej. Nagłówki są zapisywane dopiero od tej wersji: najlepszego udziału znalezionego wcześniej nie da się odtworzyć, więc do czasu pobicia rekordu strona pokazuje najlepszy udział od czasu aktualizacji i wyraźnie o tym informuje. Ponowne uruchomienie usługi nie powoduje już również fali odrzuconych udziałów. Górnicy otrzymywali pracę, zanim powiedziano im, z jaką trudnością mają pracować, a każdy był resetowany do początkowej trudności puli, więc pierwsze udziały po każdym restarcie były odrzucane. Teraz trudność wysyłana jest jako pierwsza, górnicy wracają do trudności, do której byli już dostrojeni, zamiast zaczynać od nowa, a rozpoczęta już praca jest przyjmowana zamiast odrzucana. Stan puli podaje ponadto stan zapisu nagłówków.',
|
||||
'Strona najlepszych udziałów może teraz pokazać sam dowód pracy. Nowy przycisk „Pokaż PoW” otwiera nagłówek bloku stojący za najlepszym udziałem, narysowany jako blok z każdym polem na swoim miejscu, wersja, poprzedni blok, korzeń Merkle, czas, bity i nonce, obok surowych 80 bajtów, które górnik poddał haszowaniu. Naciśnij „Zweryfikuj”, a strona odtworzy całą weryfikację na Twoich oczach: odbuduje korzeń Merkle z transakcji coinbase i jej haszy gałęzi, uzupełni nagłówek do bloków wiadomości, przejdzie przez prawdziwe rundy kompresji SHA-256, zahaszuje wynik po raz drugi, odwróci bajty i porówna hasz z celem udziału oraz z celem sieci. Wszystkie pokazane wartości pochodzą z Twojego własnego udziału i są obliczane w przeglądarce, więc możesz sprawdzić, czy pula mówi prawdę, nie musząc jej ufać, a surowy nagłówek i jednolinijkowe polecenie terminala pozwalają zweryfikować to gdzie indziej. Nagłówki są zapisywane dopiero od tej wersji: najlepszego udziału znalezionego wcześniej nie da się odtworzyć, więc do czasu pobicia rekordu strona pokazuje najlepszy udział od czasu aktualizacji i wyraźnie o tym informuje. Ponowne uruchomienie usługi nie powoduje już również fali odrzuconych udziałów. Górnicy otrzymywali pracę, zanim powiedziano im, z jaką trudnością mają pracować, a każdy był resetowany do początkowej trudności puli, więc pierwsze udziały po każdym restarcie były odrzucane. Teraz trudność wysyłana jest jako pierwsza, górnicy wracają do trudności, do której byli już dostrojeni, zamiast zaczynać od nowa, a rozpoczęta już praca jest przyjmowana zamiast odrzucana. Stan puli podaje ponadto stan zapisu nagłówków.',
|
||||
fr_FR:
|
||||
'La page des meilleures parts peut désormais vous montrer la preuve de travail elle-même. Un nouveau bouton « Afficher la PoW » ouvre l’en-tête de bloc de votre meilleure part, dessiné comme un bloc avec chaque champ à sa place — version, bloc précédent, racine de Merkle, heure, bits et nonce — à côté des 80 octets bruts que le mineur a hachés. Appuyez sur Vérifier et la page rejoue toute la vérification sous vos yeux : elle reconstruit la racine de Merkle à partir de la transaction coinbase et de ses hachages de branche, complète l’en-tête en blocs de message, exécute les véritables tours de compression SHA-256, hache le résultat une seconde fois, inverse les octets et compare le hachage à la cible de la part et à celle du réseau. Toutes les valeurs proviennent de votre propre part et sont calculées dans votre navigateur : vous pouvez donc vérifier que le pool dit vrai sans avoir à lui faire confiance — et l’en-tête brut ainsi qu’une commande de terminal d’une ligne permettent de le recalculer ailleurs. Les en-têtes ne sont enregistrés qu’à partir de cette version : une meilleure part trouvée auparavant ne peut pas être reconstituée, donc jusqu’au prochain record la page affiche la meilleure part depuis la mise à jour et le signale. Le redémarrage du service ne provoque plus non plus de vague de parts rejetées. Les mineurs recevaient du travail avant qu’on leur indique à quelle difficulté travailler, et chacun était réinitialisé à la difficulté de départ du pool, si bien que les premières parts après chaque redémarrage étaient rejetées. La difficulté est désormais envoyée en premier, les mineurs reprennent à la difficulté à laquelle ils étaient déjà ajustés au lieu de repartir de zéro, et le travail déjà entamé est accepté plutôt que rejeté. État du pool indique également l’état de l’enregistrement des en-têtes.',
|
||||
'La page des meilleures parts peut désormais vous montrer la preuve de travail elle-même. Un nouveau bouton « Afficher la PoW » ouvre l’en-tête de bloc de votre meilleure part, dessiné comme un bloc avec chaque champ à sa place, version, bloc précédent, racine de Merkle, heure, bits et nonce, à côté des 80 octets bruts que le mineur a hachés. Appuyez sur Vérifier et la page rejoue toute la vérification sous vos yeux : elle reconstruit la racine de Merkle à partir de la transaction coinbase et de ses hachages de branche, complète l’en-tête en blocs de message, exécute les véritables tours de compression SHA-256, hache le résultat une seconde fois, inverse les octets et compare le hachage à la cible de la part et à celle du réseau. Toutes les valeurs proviennent de votre propre part et sont calculées dans votre navigateur : vous pouvez donc vérifier que le pool dit vrai sans avoir à lui faire confiance, et l’en-tête brut ainsi qu’une commande de terminal d’une ligne permettent de le recalculer ailleurs. Les en-têtes ne sont enregistrés qu’à partir de cette version : une meilleure part trouvée auparavant ne peut pas être reconstituée, donc jusqu’au prochain record la page affiche la meilleure part depuis la mise à jour et le signale. Le redémarrage du service ne provoque plus non plus de vague de parts rejetées. Les mineurs recevaient du travail avant qu’on leur indique à quelle difficulté travailler, et chacun était réinitialisé à la difficulté de départ du pool, si bien que les premières parts après chaque redémarrage étaient rejetées. La difficulté est désormais envoyée en premier, les mineurs reprennent à la difficulté à laquelle ils étaient déjà ajustés au lieu de repartir de zéro, et le travail déjà entamé est accepté plutôt que rejeté. État du pool indique également l’état de l’enregistrement des en-têtes.',
|
||||
},
|
||||
// No data migration in either direction. The proof-of-work record is a new
|
||||
// row in the existing kv table of the same SQLite database, written the
|
||||
// first time a share sets one — nothing that existed before changes shape,
|
||||
// first time a share sets one, nothing that existed before changes shape,
|
||||
// so a downgrade has nothing to undo (an older build simply ignores the
|
||||
// row). The ckpool difficulty fix lives in the binary, not in stored data.
|
||||
migrations: {},
|
||||
|
||||
@@ -4,18 +4,18 @@ export const v0_2_4 = VersionInfo.of({
|
||||
version: '0.2.4:0',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'Fixes a bug that could wipe the all-time share statistics — the difficulty distribution and rejection reasons on the Stats page. Those counters are restored from the database when the service starts, but the log reader that updates them was starting at the same moment, and the first share it saw could save a nearly empty set of counters over the accumulated history, which was then read back as the new total. The restore now finishes before the log reader starts, and the counters can no longer be written before they have been read. Found blocks, best-share records and the proof-of-work page were never affected. If your statistics were already lost, the new "Rebuild Share Statistics" action recounts them from CKPool’s log, which still holds every share; it only replaces the stored totals when the log accounts for more shares than they do, so it can restore history but never erase it.',
|
||||
'Fixes a bug that could wipe the all-time share statistics, the difficulty distribution and rejection reasons on the Stats page. Those counters are restored from the database when the service starts, but the log reader that updates them was starting at the same moment, and the first share it saw could save a nearly empty set of counters over the accumulated history, which was then read back as the new total. The restore now finishes before the log reader starts, and the counters can no longer be written before they have been read. Found blocks, best-share records and the proof-of-work page were never affected. If your statistics were already lost, the new "Rebuild Share Statistics" action recounts them from CKPool’s log, which still holds every share; it only replaces the stored totals when the log accounts for more shares than they do, so it can restore history but never erase it.',
|
||||
es_ES:
|
||||
'Corrige un fallo que podía borrar las estadísticas históricas de participaciones: la distribución de dificultad y los motivos de rechazo de la página Estadísticas. Esos contadores se restauran desde la base de datos al iniciar el servicio, pero el lector del registro que los actualiza arrancaba en ese mismo momento, y la primera participación que veía podía guardar unos contadores casi vacíos encima del historial acumulado, que luego se releía como el nuevo total. Ahora la restauración termina antes de que arranque el lector del registro, y los contadores ya no pueden escribirse antes de haberse leído. Los bloques encontrados, los registros de mejores participaciones y la página de prueba de trabajo nunca se vieron afectados. Si sus estadísticas ya se perdieron, la nueva acción «Reconstruir estadísticas de participaciones» las vuelve a contar a partir del registro de CKPool, que conserva todas las participaciones; solo sustituye los totales almacenados cuando el registro contabiliza más participaciones que ellos, así que puede recuperar historial pero nunca borrarlo.',
|
||||
de_DE:
|
||||
'Behebt einen Fehler, der die Allzeit-Share-Statistiken löschen konnte — die Schwierigkeitsverteilung und die Ablehnungsgründe auf der Statistikseite. Diese Zähler werden beim Start des Dienstes aus der Datenbank wiederhergestellt, doch der Protokolleser, der sie aktualisiert, startete im selben Moment, und der erste Share, den er sah, konnte einen nahezu leeren Zählerstand über den angesammelten Verlauf speichern, der anschließend als neuer Gesamtstand zurückgelesen wurde. Die Wiederherstellung wird nun abgeschlossen, bevor der Protokolleser startet, und die Zähler können nicht mehr geschrieben werden, bevor sie gelesen wurden. Gefundene Blöcke, Bestwert-Aufzeichnungen und die Arbeitsnachweis-Seite waren nie betroffen. Falls Ihre Statistiken bereits verloren gegangen sind, zählt die neue Aktion „Share-Statistiken neu aufbauen“ sie aus dem CKPool-Protokoll neu, das weiterhin jeden Share enthält; sie ersetzt die gespeicherten Summen nur, wenn das Protokoll mehr Shares ausweist, kann also Verlauf zurückholen, aber niemals löschen.',
|
||||
'Behebt einen Fehler, der die Allzeit-Share-Statistiken löschen konnte, die Schwierigkeitsverteilung und die Ablehnungsgründe auf der Statistikseite. Diese Zähler werden beim Start des Dienstes aus der Datenbank wiederhergestellt, doch der Protokolleser, der sie aktualisiert, startete im selben Moment, und der erste Share, den er sah, konnte einen nahezu leeren Zählerstand über den angesammelten Verlauf speichern, der anschließend als neuer Gesamtstand zurückgelesen wurde. Die Wiederherstellung wird nun abgeschlossen, bevor der Protokolleser startet, und die Zähler können nicht mehr geschrieben werden, bevor sie gelesen wurden. Gefundene Blöcke, Bestwert-Aufzeichnungen und die Arbeitsnachweis-Seite waren nie betroffen. Falls Ihre Statistiken bereits verloren gegangen sind, zählt die neue Aktion „Share-Statistiken neu aufbauen“ sie aus dem CKPool-Protokoll neu, das weiterhin jeden Share enthält; sie ersetzt die gespeicherten Summen nur, wenn das Protokoll mehr Shares ausweist, kann also Verlauf zurückholen, aber niemals löschen.',
|
||||
pl_PL:
|
||||
'Naprawia błąd, który mógł skasować statystyki udziałów od początku istnienia puli — rozkład trudności i powody odrzuceń na stronie Statystyki. Te liczniki są odtwarzane z bazy danych przy starcie usługi, ale czytnik dziennika, który je aktualizuje, uruchamiał się w tej samej chwili, a pierwszy zobaczony udział mógł zapisać niemal puste liczniki na zgromadzonej historii, którą następnie odczytywano jako nową sumę. Odtwarzanie kończy się teraz przed uruchomieniem czytnika dziennika, a liczniki nie mogą już zostać zapisane, zanim nie zostaną wczytane. Znalezione bloki, rekordy najlepszych udziałów i strona dowodu pracy nigdy nie były tym dotknięte. Jeśli Twoje statystyki już przepadły, nowa akcja „Odbuduj statystyki udziałów” przelicza je na nowo z dziennika CKPool, który wciąż zawiera każdy udział; zastępuje zapisane sumy tylko wtedy, gdy dziennik obejmuje więcej udziałów, więc może przywrócić historię, ale nigdy jej nie usunie.',
|
||||
'Naprawia błąd, który mógł skasować statystyki udziałów od początku istnienia puli, rozkład trudności i powody odrzuceń na stronie Statystyki. Te liczniki są odtwarzane z bazy danych przy starcie usługi, ale czytnik dziennika, który je aktualizuje, uruchamiał się w tej samej chwili, a pierwszy zobaczony udział mógł zapisać niemal puste liczniki na zgromadzonej historii, którą następnie odczytywano jako nową sumę. Odtwarzanie kończy się teraz przed uruchomieniem czytnika dziennika, a liczniki nie mogą już zostać zapisane, zanim nie zostaną wczytane. Znalezione bloki, rekordy najlepszych udziałów i strona dowodu pracy nigdy nie były tym dotknięte. Jeśli Twoje statystyki już przepadły, nowa akcja „Odbuduj statystyki udziałów” przelicza je na nowo z dziennika CKPool, który wciąż zawiera każdy udział; zastępuje zapisane sumy tylko wtedy, gdy dziennik obejmuje więcej udziałów, więc może przywrócić historię, ale nigdy jej nie usunie.',
|
||||
fr_FR:
|
||||
'Corrige un bogue qui pouvait effacer les statistiques de parts depuis toujours — la répartition des difficultés et les motifs de rejet de la page Statistiques. Ces compteurs sont restaurés depuis la base de données au démarrage du service, mais le lecteur de journal qui les met à jour démarrait au même instant, et la première part qu’il voyait pouvait enregistrer des compteurs presque vides par-dessus l’historique accumulé, ensuite relu comme le nouveau total. La restauration se termine désormais avant le démarrage du lecteur de journal, et les compteurs ne peuvent plus être écrits avant d’avoir été lus. Les blocs trouvés, les records de meilleures parts et la page de preuve de travail n’ont jamais été affectés. Si vos statistiques ont déjà été perdues, la nouvelle action « Reconstruire les statistiques de parts » les recompte à partir du journal de CKPool, qui contient encore chaque part ; elle ne remplace les totaux enregistrés que si le journal comptabilise davantage de parts, elle peut donc restaurer de l’historique, jamais l’effacer.',
|
||||
'Corrige un bogue qui pouvait effacer les statistiques de parts depuis toujours, la répartition des difficultés et les motifs de rejet de la page Statistiques. Ces compteurs sont restaurés depuis la base de données au démarrage du service, mais le lecteur de journal qui les met à jour démarrait au même instant, et la première part qu’il voyait pouvait enregistrer des compteurs presque vides par-dessus l’historique accumulé, ensuite relu comme le nouveau total. La restauration se termine désormais avant le démarrage du lecteur de journal, et les compteurs ne peuvent plus être écrits avant d’avoir été lus. Les blocs trouvés, les records de meilleures parts et la page de preuve de travail n’ont jamais été affectés. Si vos statistiques ont déjà été perdues, la nouvelle action « Reconstruire les statistiques de parts » les recompte à partir du journal de CKPool, qui contient encore chaque part ; elle ne remplace les totaux enregistrés que si le journal comptabilise davantage de parts, elle peut donc restaurer de l’historique, jamais l’effacer.',
|
||||
},
|
||||
// No data migration in either direction. The fix lives entirely in the
|
||||
// service binary — the restore now completes before ingestion starts — and
|
||||
// service binary, the restore now completes before ingestion starts, and
|
||||
// the recovery action only rewrites rows the service already owns. Nothing
|
||||
// stored changes shape, so a downgrade has nothing to undo.
|
||||
migrations: {},
|
||||
|
||||
@@ -4,15 +4,15 @@ export const v0_2_5 = VersionInfo.of({
|
||||
version: '0.2.5:0',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'The estimated difficulty adjustment on the dashboard is now accurate from the very start of a retarget period. It was measuring elapsed time up to the current moment while counting only completed blocks, so the wait since the last block — ten minutes on average — was counted as mining time that had produced nothing. A few blocks into a period that wait is most of the sample, which is why the figure was wildly off early on and only settled down around the halfway mark. It now measures between block timestamps, matching what mempool.space shows. The estimated time until the adjustment is projected at the pace the network is actually keeping this period, rather than assuming a flat ten minutes per block.',
|
||||
'The estimated difficulty adjustment on the dashboard is now accurate from the very start of a retarget period. It was measuring elapsed time up to the current moment while counting only completed blocks, so the wait since the last block, ten minutes on average, was counted as mining time that had produced nothing. A few blocks into a period that wait is most of the sample, which is why the figure was wildly off early on and only settled down around the halfway mark. It now measures between block timestamps, matching what mempool.space shows. The estimated time until the adjustment is projected at the pace the network is actually keeping this period, rather than assuming a flat ten minutes per block.',
|
||||
es_ES:
|
||||
'El ajuste de dificultad estimado en el panel ahora es preciso desde el comienzo mismo del periodo de reajuste. Antes medía el tiempo transcurrido hasta el momento actual pero contaba solo los bloques completados, de modo que la espera desde el último bloque —diez minutos de media— se contabilizaba como tiempo de minado que no había producido nada. A los pocos bloques de iniciarse un periodo, esa espera representa la mayor parte de la muestra, por lo que la cifra se desviaba muchísimo al principio y solo se estabilizaba hacia la mitad. Ahora se mide entre las marcas de tiempo de los bloques, igual que muestra mempool.space. El tiempo estimado hasta el ajuste se proyecta al ritmo que la red lleva realmente en este periodo, en lugar de suponer diez minutos fijos por bloque.',
|
||||
'El ajuste de dificultad estimado en el panel ahora es preciso desde el comienzo mismo del periodo de reajuste. Antes medía el tiempo transcurrido hasta el momento actual pero contaba solo los bloques completados, de modo que la espera desde el último bloque, diez minutos de media, se contabilizaba como tiempo de minado que no había producido nada. A los pocos bloques de iniciarse un periodo, esa espera representa la mayor parte de la muestra, por lo que la cifra se desviaba muchísimo al principio y solo se estabilizaba hacia la mitad. Ahora se mide entre las marcas de tiempo de los bloques, igual que muestra mempool.space. El tiempo estimado hasta el ajuste se proyecta al ritmo que la red lleva realmente en este periodo, en lugar de suponer diez minutos fijos por bloque.',
|
||||
de_DE:
|
||||
'Die geschätzte Schwierigkeitsanpassung im Dashboard ist jetzt schon zu Beginn einer Anpassungsperiode genau. Zuvor wurde die verstrichene Zeit bis zum aktuellen Moment gemessen, aber nur abgeschlossene Blöcke gezählt — die Wartezeit seit dem letzten Block, im Mittel zehn Minuten, floss also als Mining-Zeit ein, die nichts hervorgebracht hatte. Wenige Blöcke nach Beginn einer Periode macht diese Wartezeit den Großteil der Stichprobe aus, weshalb der Wert anfangs stark abwich und sich erst etwa zur Halbzeit einpendelte. Nun wird zwischen den Zeitstempeln der Blöcke gemessen, so wie es auch mempool.space anzeigt. Die geschätzte Zeit bis zur Anpassung wird mit dem Tempo hochgerechnet, das das Netzwerk in dieser Periode tatsächlich hält, statt pauschal zehn Minuten pro Block anzunehmen.',
|
||||
'Die geschätzte Schwierigkeitsanpassung im Dashboard ist jetzt schon zu Beginn einer Anpassungsperiode genau. Zuvor wurde die verstrichene Zeit bis zum aktuellen Moment gemessen, aber nur abgeschlossene Blöcke gezählt, die Wartezeit seit dem letzten Block, im Mittel zehn Minuten, floss also als Mining-Zeit ein, die nichts hervorgebracht hatte. Wenige Blöcke nach Beginn einer Periode macht diese Wartezeit den Großteil der Stichprobe aus, weshalb der Wert anfangs stark abwich und sich erst etwa zur Halbzeit einpendelte. Nun wird zwischen den Zeitstempeln der Blöcke gemessen, so wie es auch mempool.space anzeigt. Die geschätzte Zeit bis zur Anpassung wird mit dem Tempo hochgerechnet, das das Netzwerk in dieser Periode tatsächlich hält, statt pauschal zehn Minuten pro Block anzunehmen.',
|
||||
pl_PL:
|
||||
'Szacowana korekta trudności na pulpicie jest teraz dokładna już od samego początku okresu korekty. Wcześniej mierzono czas, który upłynął do bieżącej chwili, licząc jedynie ukończone bloki, więc oczekiwanie od ostatniego bloku — średnio dziesięć minut — było wliczane jako czas kopania, który niczego nie przyniósł. Kilka bloków po rozpoczęciu okresu to oczekiwanie stanowi większość próby, dlatego wartość była na początku mocno błędna i stabilizowała się dopiero mniej więcej w połowie. Teraz pomiar odbywa się między znacznikami czasu bloków, tak jak pokazuje to mempool.space. Szacowany czas do korekty jest wyliczany w tempie, które sieć faktycznie utrzymuje w tym okresie, zamiast zakładać sztywne dziesięć minut na blok.',
|
||||
'Szacowana korekta trudności na pulpicie jest teraz dokładna już od samego początku okresu korekty. Wcześniej mierzono czas, który upłynął do bieżącej chwili, licząc jedynie ukończone bloki, więc oczekiwanie od ostatniego bloku, średnio dziesięć minut, było wliczane jako czas kopania, który niczego nie przyniósł. Kilka bloków po rozpoczęciu okresu to oczekiwanie stanowi większość próby, dlatego wartość była na początku mocno błędna i stabilizowała się dopiero mniej więcej w połowie. Teraz pomiar odbywa się między znacznikami czasu bloków, tak jak pokazuje to mempool.space. Szacowany czas do korekty jest wyliczany w tempie, które sieć faktycznie utrzymuje w tym okresie, zamiast zakładać sztywne dziesięć minut na blok.',
|
||||
fr_FR:
|
||||
'L’ajustement de difficulté estimé sur le tableau de bord est désormais exact dès le tout début d’une période de réajustement. Il mesurait auparavant le temps écoulé jusqu’à l’instant présent tout en ne comptant que les blocs terminés : l’attente depuis le dernier bloc — dix minutes en moyenne — était donc comptabilisée comme du temps de minage n’ayant rien produit. Quelques blocs après le début d’une période, cette attente représente l’essentiel de l’échantillon, ce qui explique pourquoi le chiffre était très faux au début et ne se stabilisait qu’à mi-parcours. La mesure se fait maintenant entre les horodatages des blocs, comme l’affiche mempool.space. Le temps estimé avant l’ajustement est projeté au rythme que le réseau tient réellement sur cette période, au lieu de supposer dix minutes fixes par bloc.',
|
||||
'L’ajustement de difficulté estimé sur le tableau de bord est désormais exact dès le tout début d’une période de réajustement. Il mesurait auparavant le temps écoulé jusqu’à l’instant présent tout en ne comptant que les blocs terminés : l’attente depuis le dernier bloc, dix minutes en moyenne, était donc comptabilisée comme du temps de minage n’ayant rien produit. Quelques blocs après le début d’une période, cette attente représente l’essentiel de l’échantillon, ce qui explique pourquoi le chiffre était très faux au début et ne se stabilisait qu’à mi-parcours. La mesure se fait maintenant entre les horodatages des blocs, comme l’affiche mempool.space. Le temps estimé avant l’ajustement est projeté au rythme que le réseau tient réellement sur cette période, au lieu de supposer dix minutes fixes par bloc.',
|
||||
},
|
||||
// No data migration in either direction. The change is confined to how
|
||||
// the service derives one displayed number from data it already fetches
|
||||
|
||||
@@ -4,17 +4,17 @@ export const v0_2_6 = VersionInfo.of({
|
||||
version: '0.2.6:0',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'The proof-of-work verification now plays full screen. Pressing Verify on the best-share page takes over the display and walks the whole proof in eight chapters: rebuilding the merkle root from the coinbase transaction and its branch hashes, padding the header into two 512-bit message blocks, seeding the eight hash registers, then the compression rounds themselves — where a live grid shows all 256 bits of the working state flipping, every lit cell a real bit of your share’s computation — followed by the second hash, the byte reversal, and the comparison against the share and network targets. It ends on the block header hash with its leading zeros lit. The formulas are set in proper mathematical notation, and every scene that uses colour carries a legend. Nothing is simulated: all of it comes from hashing your own share in your browser. Playback can be paused, run at 2× or 4×, or skipped straight to the result; Escape closes it and Space pauses. The raw header section now also explains why that data is worth having: a screenshot of a big difficulty number proves nothing, but the 80 bytes behind it are the share hash’s exact preimage, and because they commit to the previous block and to the coinbase transaction that pays you, the proof cannot be lifted from another miner or replayed from a different block.',
|
||||
'The proof-of-work verification now plays full screen. Pressing Verify on the best-share page takes over the display and walks the whole proof in eight chapters: rebuilding the merkle root from the coinbase transaction and its branch hashes, padding the header into two 512-bit message blocks, seeding the eight hash registers, then the compression rounds themselves, where a live grid shows all 256 bits of the working state flipping, every lit cell a real bit of your share’s computation, followed by the second hash, the byte reversal, and the comparison against the share and network targets. It ends on the block header hash with its leading zeros lit. The formulas are set in proper mathematical notation, and every scene that uses colour carries a legend. Nothing is simulated: all of it comes from hashing your own share in your browser. Playback can be paused, run at 2× or 4×, or skipped straight to the result; Escape closes it and Space pauses. The raw header section now also explains why that data is worth having: a screenshot of a big difficulty number proves nothing, but the 80 bytes behind it are the share hash’s exact preimage, and because they commit to the previous block and to the coinbase transaction that pays you, the proof cannot be lifted from another miner or replayed from a different block.',
|
||||
es_ES:
|
||||
'La verificación de la prueba de trabajo ahora se reproduce a pantalla completa. Al pulsar Verificar en la página de mejores participaciones, la animación ocupa toda la pantalla y recorre la prueba entera en ocho capítulos: la reconstrucción de la raíz de Merkle a partir de la transacción coinbase y sus hashes de rama, el relleno de la cabecera en dos bloques de mensaje de 512 bits, la inicialización de los ocho registros de hash y luego las propias rondas de compresión —donde una cuadrícula en vivo muestra los 256 bits del estado de trabajo cambiando, y cada celda encendida es un bit real del cálculo de su participación—, seguidas del segundo hash, la inversión de bytes y la comparación con los objetivos de la participación y de la red. Termina en el hash de la cabecera del bloque con sus ceros iniciales iluminados. Las fórmulas aparecen en notación matemática propiamente compuesta y cada escena que usa color incluye una leyenda. Nada está simulado: todo procede de aplicar el hash a su propia participación en su navegador. La reproducción se puede pausar, acelerar a 2× o 4×, o saltar directamente al resultado; Esc la cierra y la barra espaciadora la pausa. La sección de la cabecera en bruto explica ahora por qué merece la pena tener esos datos: una captura de pantalla con un número de dificultad grande no demuestra nada, pero los 80 bytes que hay detrás son la preimagen exacta del hash de la participación y, como se comprometen con el bloque anterior y con la transacción coinbase que le paga a usted, la prueba no puede tomarse de otro minero ni reutilizarse desde otro bloque.',
|
||||
'La verificación de la prueba de trabajo ahora se reproduce a pantalla completa. Al pulsar Verificar en la página de mejores participaciones, la animación ocupa toda la pantalla y recorre la prueba entera en ocho capítulos: la reconstrucción de la raíz de Merkle a partir de la transacción coinbase y sus hashes de rama, el relleno de la cabecera en dos bloques de mensaje de 512 bits, la inicialización de los ocho registros de hash y luego las propias rondas de compresión, donde una cuadrícula en vivo muestra los 256 bits del estado de trabajo cambiando, y cada celda encendida es un bit real del cálculo de su participación, seguidas del segundo hash, la inversión de bytes y la comparación con los objetivos de la participación y de la red. Termina en el hash de la cabecera del bloque con sus ceros iniciales iluminados. Las fórmulas aparecen en notación matemática propiamente compuesta y cada escena que usa color incluye una leyenda. Nada está simulado: todo procede de aplicar el hash a su propia participación en su navegador. La reproducción se puede pausar, acelerar a 2× o 4×, o saltar directamente al resultado; Esc la cierra y la barra espaciadora la pausa. La sección de la cabecera en bruto explica ahora por qué merece la pena tener esos datos: una captura de pantalla con un número de dificultad grande no demuestra nada, pero los 80 bytes que hay detrás son la preimagen exacta del hash de la participación y, como se comprometen con el bloque anterior y con la transacción coinbase que le paga a usted, la prueba no puede tomarse de otro minero ni reutilizarse desde otro bloque.',
|
||||
de_DE:
|
||||
'Die Arbeitsnachweis-Überprüfung läuft jetzt im Vollbild. Ein Klick auf „Überprüfen“ auf der Bestwert-Seite übernimmt den Bildschirm und führt in acht Kapiteln durch den gesamten Nachweis: den Neuaufbau der Merkle-Wurzel aus der Coinbase-Transaktion und ihren Zweig-Hashes, das Auffüllen des Headers zu zwei 512-Bit-Nachrichtenblöcken, das Initialisieren der acht Hash-Register und dann die Kompressionsrunden selbst — wobei ein Live-Raster alle 256 Bits des Arbeitszustands beim Umkippen zeigt und jede leuchtende Zelle ein echtes Bit der Berechnung Ihres Shares ist — gefolgt vom zweiten Hash, der Byte-Umkehrung und dem Vergleich mit dem Share- und dem Netzwerk-Ziel. Es endet beim Blockheader-Hash mit hervorgehobenen führenden Nullen. Die Formeln sind in korrekter mathematischer Notation gesetzt, und jede Szene mit Farbcodierung hat eine Legende. Nichts ist simuliert: Alles stammt daraus, Ihren eigenen Share in Ihrem Browser zu hashen. Die Wiedergabe lässt sich pausieren, mit 2× oder 4× abspielen oder direkt zum Ergebnis überspringen; Esc schließt sie, die Leertaste pausiert. Der Abschnitt mit dem rohen Header erklärt nun auch, warum diese Daten wertvoll sind: Ein Screenshot mit einer großen Schwierigkeitszahl beweist nichts, aber die 80 Bytes dahinter sind das exakte Urbild des Share-Hashes — und da sie sich auf den vorherigen Block und auf die Coinbase-Transaktion festlegen, die an Sie zahlt, lässt sich der Nachweis weder von einem anderen Miner übernehmen noch aus einem anderen Block wiederverwenden.',
|
||||
'Die Arbeitsnachweis-Überprüfung läuft jetzt im Vollbild. Ein Klick auf „Überprüfen“ auf der Bestwert-Seite übernimmt den Bildschirm und führt in acht Kapiteln durch den gesamten Nachweis: den Neuaufbau der Merkle-Wurzel aus der Coinbase-Transaktion und ihren Zweig-Hashes, das Auffüllen des Headers zu zwei 512-Bit-Nachrichtenblöcken, das Initialisieren der acht Hash-Register und dann die Kompressionsrunden selbst, wobei ein Live-Raster alle 256 Bits des Arbeitszustands beim Umkippen zeigt und jede leuchtende Zelle ein echtes Bit der Berechnung Ihres Shares ist, gefolgt vom zweiten Hash, der Byte-Umkehrung und dem Vergleich mit dem Share- und dem Netzwerk-Ziel. Es endet beim Blockheader-Hash mit hervorgehobenen führenden Nullen. Die Formeln sind in korrekter mathematischer Notation gesetzt, und jede Szene mit Farbcodierung hat eine Legende. Nichts ist simuliert: Alles stammt daraus, Ihren eigenen Share in Ihrem Browser zu hashen. Die Wiedergabe lässt sich pausieren, mit 2× oder 4× abspielen oder direkt zum Ergebnis überspringen; Esc schließt sie, die Leertaste pausiert. Der Abschnitt mit dem rohen Header erklärt nun auch, warum diese Daten wertvoll sind: Ein Screenshot mit einer großen Schwierigkeitszahl beweist nichts, aber die 80 Bytes dahinter sind das exakte Urbild des Share-Hashes, und da sie sich auf den vorherigen Block und auf die Coinbase-Transaktion festlegen, die an Sie zahlt, lässt sich der Nachweis weder von einem anderen Miner übernehmen noch aus einem anderen Block wiederverwenden.',
|
||||
pl_PL:
|
||||
'Weryfikacja dowodu pracy jest teraz odtwarzana na pełnym ekranie. Naciśnięcie „Zweryfikuj” na stronie najlepszych udziałów przejmuje ekran i prowadzi przez cały dowód w ośmiu rozdziałach: odbudowa korzenia Merkle z transakcji coinbase i jej haszy gałęzi, uzupełnienie nagłówka do dwóch 512-bitowych bloków wiadomości, zainicjowanie ośmiu rejestrów skrótu, a następnie same rundy kompresji — gdzie żywa siatka pokazuje wszystkie 256 bitów stanu roboczego w trakcie zmian, a każda zapalona komórka to prawdziwy bit obliczeń Twojego udziału — po czym drugie haszowanie, odwrócenie bajtów i porównanie z celem udziału oraz celem sieci. Kończy się na haszu nagłówka bloku z podświetlonymi wiodącymi zerami. Wzory zapisano w prawidłowej notacji matematycznej, a każda scena używająca kolorów ma legendę. Nic nie jest symulowane: wszystko pochodzi z haszowania Twojego własnego udziału w przeglądarce. Odtwarzanie można wstrzymać, przyspieszyć do 2× lub 4× albo przeskoczyć wprost do wyniku; Esc zamyka, a spacja wstrzymuje. Sekcja surowego nagłówka wyjaśnia teraz również, dlaczego te dane mają wartość: zrzut ekranu z dużą liczbą trudności niczego nie dowodzi, ale stojące za nim 80 bajtów to dokładny przeciwobraz hasza udziału, a ponieważ wiążą się z poprzednim blokiem i z transakcją coinbase wypłacającą Tobie, dowodu nie da się przejąć od innego górnika ani odtworzyć z innego bloku.',
|
||||
'Weryfikacja dowodu pracy jest teraz odtwarzana na pełnym ekranie. Naciśnięcie „Zweryfikuj” na stronie najlepszych udziałów przejmuje ekran i prowadzi przez cały dowód w ośmiu rozdziałach: odbudowa korzenia Merkle z transakcji coinbase i jej haszy gałęzi, uzupełnienie nagłówka do dwóch 512-bitowych bloków wiadomości, zainicjowanie ośmiu rejestrów skrótu, a następnie same rundy kompresji, gdzie żywa siatka pokazuje wszystkie 256 bitów stanu roboczego w trakcie zmian, a każda zapalona komórka to prawdziwy bit obliczeń Twojego udziału, po czym drugie haszowanie, odwrócenie bajtów i porównanie z celem udziału oraz celem sieci. Kończy się na haszu nagłówka bloku z podświetlonymi wiodącymi zerami. Wzory zapisano w prawidłowej notacji matematycznej, a każda scena używająca kolorów ma legendę. Nic nie jest symulowane: wszystko pochodzi z haszowania Twojego własnego udziału w przeglądarce. Odtwarzanie można wstrzymać, przyspieszyć do 2× lub 4× albo przeskoczyć wprost do wyniku; Esc zamyka, a spacja wstrzymuje. Sekcja surowego nagłówka wyjaśnia teraz również, dlaczego te dane mają wartość: zrzut ekranu z dużą liczbą trudności niczego nie dowodzi, ale stojące za nim 80 bajtów to dokładny przeciwobraz hasza udziału, a ponieważ wiążą się z poprzednim blokiem i z transakcją coinbase wypłacającą Tobie, dowodu nie da się przejąć od innego górnika ani odtworzyć z innego bloku.',
|
||||
fr_FR:
|
||||
'La vérification de la preuve de travail s’affiche désormais en plein écran. Un clic sur Vérifier depuis la page des meilleures parts prend possession de l’écran et parcourt toute la preuve en huit chapitres : la reconstruction de la racine de Merkle à partir de la transaction coinbase et de ses hachages de branche, le remplissage de l’en-tête en deux blocs de message de 512 bits, l’initialisation des huit registres de hachage, puis les tours de compression eux-mêmes — où une grille en direct montre les 256 bits de l’état de travail en train de basculer, chaque cellule allumée étant un bit réel du calcul de votre part — suivis du second hachage, de l’inversion des octets et de la comparaison avec la cible de la part et celle du réseau. Cela se termine sur le hachage de l’en-tête de bloc, zéros de tête mis en lumière. Les formules sont composées en notation mathématique correcte, et chaque scène utilisant la couleur comporte une légende. Rien n’est simulé : tout provient du hachage de votre propre part dans votre navigateur. La lecture peut être mise en pause, lancée à 2× ou 4×, ou passée directement au résultat ; Échap ferme et la barre d’espace met en pause. La section de l’en-tête brut explique désormais aussi pourquoi ces données comptent : une capture d’écran affichant une grande difficulté ne prouve rien, mais les 80 octets qui la sous-tendent sont la préimage exacte du hachage de la part et, puisqu’ils engagent le bloc précédent ainsi que la transaction coinbase qui vous paie, la preuve ne peut être reprise d’un autre mineur ni rejouée depuis un autre bloc.',
|
||||
'La vérification de la preuve de travail s’affiche désormais en plein écran. Un clic sur Vérifier depuis la page des meilleures parts prend possession de l’écran et parcourt toute la preuve en huit chapitres : la reconstruction de la racine de Merkle à partir de la transaction coinbase et de ses hachages de branche, le remplissage de l’en-tête en deux blocs de message de 512 bits, l’initialisation des huit registres de hachage, puis les tours de compression eux-mêmes, où une grille en direct montre les 256 bits de l’état de travail en train de basculer, chaque cellule allumée étant un bit réel du calcul de votre part, suivis du second hachage, de l’inversion des octets et de la comparaison avec la cible de la part et celle du réseau. Cela se termine sur le hachage de l’en-tête de bloc, zéros de tête mis en lumière. Les formules sont composées en notation mathématique correcte, et chaque scène utilisant la couleur comporte une légende. Rien n’est simulé : tout provient du hachage de votre propre part dans votre navigateur. La lecture peut être mise en pause, lancée à 2× ou 4×, ou passée directement au résultat ; Échap ferme et la barre d’espace met en pause. La section de l’en-tête brut explique désormais aussi pourquoi ces données comptent : une capture d’écran affichant une grande difficulté ne prouve rien, mais les 80 octets qui la sous-tendent sont la préimage exacte du hachage de la part et, puisqu’ils engagent le bloc précédent ainsi que la transaction coinbase qui vous paie, la preuve ne peut être reprise d’un autre mineur ni rejouée depuis un autre bloc.',
|
||||
},
|
||||
// No data migration in either direction. Presentation only — the change
|
||||
// No data migration in either direction. Presentation only, the change
|
||||
// is confined to the dashboard bundled in the service binary, and it
|
||||
// reads nothing it was not already reading.
|
||||
migrations: {},
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import { VersionInfo } from '@start9labs/start-sdk'
|
||||
|
||||
export const v0_2_7 = VersionInfo.of({
|
||||
version: '0.2.7:0',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'Your best share and every block you find can now be shared as an image. A "Share card" button on the proof-of-work page, and on each row of the found-blocks table, opens a preview; the card can be saved as a PNG or copied straight to the clipboard, in a 9:16 story format or a 1:1 square for feed posts. The best-share card carries the difficulty, the block header hash with its leading zeros lit, and the raw 80-byte header itself, so the image is its own proof: a screenshot of a big number proves nothing, but those bytes are the share hash\'s exact preimage and anyone can hash them. A QR code carries the same header, so it can be scanned and checked without retyping 160 hex characters. The block card has a design of its own: a gold "I found a block!" headline, the block height, the reward, the difficulty of the winning share, and the chain named on a badge, so a testnet4 block is never mistaken for a mainnet one. Its QR code links to the block on an explorer, because a mined block is already public and the chain itself is the proof. Both cards carry Kamado Pool branding and the Bitcoin logo.',
|
||||
es_ES:
|
||||
'Su mejor participación y cada bloque que encuentre ahora se pueden compartir como imagen. Un botón «Tarjeta para compartir» en la página de prueba de trabajo, y en cada fila de la tabla de bloques encontrados, abre una vista previa; la tarjeta se puede guardar como PNG o copiar directamente al portapapeles, en formato historia 9:16 o cuadrado 1:1 para publicaciones. La tarjeta de mejor participación incluye la dificultad, el hash de la cabecera del bloque con sus ceros iniciales iluminados y la propia cabecera en bruto de 80 bytes, de modo que la imagen es su propia prueba: una captura de pantalla con un número grande no demuestra nada, pero esos bytes son la preimagen exacta del hash de la participación y cualquiera puede aplicarles el hash. Un código QR contiene la misma cabecera, así que se puede escanear y comprobar sin teclear 160 caracteres hexadecimales. La tarjeta de bloque tiene un diseño propio: un titular dorado «¡He encontrado un bloque!», la altura del bloque, la recompensa, la dificultad de la participación ganadora y la cadena indicada en una insignia, para que un bloque de testnet4 nunca se confunda con uno de mainnet. Su código QR enlaza al bloque en un explorador, porque un bloque minado ya es público y la propia cadena es la prueba. Ambas tarjetas llevan la marca de Kamado Pool y el logotipo de Bitcoin.',
|
||||
de_DE:
|
||||
'Ihr bester Share und jeder gefundene Block lassen sich jetzt als Bild teilen. Eine Schaltfläche „Share-Karte“ auf der Arbeitsnachweis-Seite und in jeder Zeile der Tabelle gefundener Blöcke öffnet eine Vorschau; die Karte lässt sich als PNG speichern oder direkt in die Zwischenablage kopieren, im Story-Format 9:16 oder quadratisch 1:1 für Feed-Beiträge. Die Bestwert-Karte enthält die Schwierigkeit, den Blockheader-Hash mit hervorgehobenen führenden Nullen und den rohen 80-Byte-Header selbst, sodass das Bild sein eigener Beweis ist: Ein Screenshot mit einer großen Zahl beweist nichts, aber diese Bytes sind das exakte Urbild des Share-Hashes, und jeder kann sie hashen. Ein QR-Code trägt denselben Header, sodass er gescannt und geprüft werden kann, ohne 160 Hexzeichen abzutippen. Die Block-Karte hat ein eigenes Design: eine goldene Überschrift „Ich habe einen Block gefunden!“, die Blockhöhe, die Belohnung, die Schwierigkeit des entscheidenden Shares und die Chain auf einem Abzeichen, damit ein testnet4-Block nie mit einem Mainnet-Block verwechselt wird. Sein QR-Code verweist auf den Block in einem Explorer, denn ein geschürfter Block ist bereits öffentlich und die Chain selbst ist der Beweis. Beide Karten tragen das Kamado-Pool-Branding und das Bitcoin-Logo.',
|
||||
pl_PL:
|
||||
'Twój najlepszy udział i każdy znaleziony blok można teraz udostępnić jako obraz. Przycisk „Karta do udostępnienia” na stronie dowodu pracy oraz w każdym wierszu tabeli znalezionych bloków otwiera podgląd; kartę można zapisać jako PNG lub skopiować wprost do schowka, w formacie story 9:16 albo kwadratowym 1:1 do wpisów w kanale. Karta najlepszego udziału zawiera trudność, hasz nagłówka bloku z podświetlonymi wiodącymi zerami oraz sam surowy 80-bajtowy nagłówek, dzięki czemu obraz jest własnym dowodem: zrzut ekranu z dużą liczbą niczego nie dowodzi, ale te bajty to dokładny przeciwobraz hasza udziału i każdy może je zahaszować. Kod QR zawiera ten sam nagłówek, więc można go zeskanować i sprawdzić bez przepisywania 160 znaków szesnastkowych. Karta bloku ma własny projekt: złoty nagłówek „Znalazłem blok!”, wysokość bloku, nagrodę, trudność zwycięskiego udziału oraz nazwę łańcucha na odznace, aby bloku z testnet4 nigdy nie pomylić z blokiem z mainnetu. Jej kod QR prowadzi do bloku w eksploratorze, ponieważ wykopany blok jest już publiczny, a sam łańcuch jest dowodem. Obie karty niosą oznaczenia Kamado Pool i logo Bitcoina.',
|
||||
fr_FR:
|
||||
'Votre meilleure part et chaque bloc trouvé peuvent désormais être partagés sous forme d’image. Un bouton « Carte à partager », sur la page de preuve de travail comme sur chaque ligne du tableau des blocs trouvés, ouvre un aperçu ; la carte peut être enregistrée en PNG ou copiée directement dans le presse-papiers, au format story 9:16 ou carré 1:1 pour les publications. La carte de meilleure part porte la difficulté, le hachage de l’en-tête de bloc avec ses zéros de tête mis en lumière et l’en-tête brut de 80 octets lui-même, si bien que l’image est sa propre preuve : une capture d’écran affichant un grand nombre ne prouve rien, mais ces octets sont la préimage exacte du hachage de la part et n’importe qui peut les hacher. Un code QR contient le même en-tête, ce qui permet de le scanner et de le vérifier sans retaper 160 caractères hexadécimaux. La carte de bloc a son propre design : un titre doré « J’ai trouvé un bloc ! », la hauteur du bloc, la récompense, la difficulté de la part gagnante et la chaîne nommée sur un badge, afin qu’un bloc testnet4 ne soit jamais pris pour un bloc du réseau principal. Son code QR renvoie au bloc dans un explorateur, car un bloc miné est déjà public et la chaîne elle-même est la preuve. Les deux cartes portent l’identité de Kamado Pool et le logo Bitcoin.',
|
||||
},
|
||||
// No data migration in either direction. Presentation only: the cards are
|
||||
// drawn in the browser from data the dashboard already receives, and
|
||||
// nothing stored changes shape.
|
||||
migrations: {},
|
||||
})
|
||||
@@ -0,0 +1,21 @@
|
||||
import { VersionInfo } from '@start9labs/start-sdk'
|
||||
|
||||
export const v0_2_8 = VersionInfo.of({
|
||||
version: '0.2.8:0',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'Security hardening for the dashboard API. The WebSocket that feeds the dashboard, and every request that changes state, now verify that they came from the dashboard itself rather than from another site. Without that check, a web page you happened to visit while signed in to StartOS could have used your browser session to read pool data, including payout addresses, per-worker hashrates and block history, or to trigger admin actions such as zeroing the latency counters or starting a rebuild of the share statistics. Requests that are not browser-driven, such as the Pool Status action or a health probe, are unaffected. Responses now also tell browsers not to sniff content types and not to allow the dashboard to be embedded in a frame, and the share statistics rebuild refuses to start a second run while one is already going. The transaction accelerator was reviewed as part of this and needed no change: it already rejects anything that is not a 64 character transaction id, caps the fee rate at 2000 sat/vB, and passes values to Bitcoin Core as typed parameters.',
|
||||
es_ES:
|
||||
'Refuerzo de seguridad de la API del panel. El WebSocket que alimenta el panel, y toda petición que cambie el estado, ahora comprueban que proceden del propio panel y no de otro sitio web. Sin esa comprobación, una página que usted visitara mientras tenía la sesión iniciada en StartOS podría haber usado su navegador para leer datos del pool, incluidas las direcciones de pago, el hashrate por trabajador y el historial de bloques, o para activar acciones de administración como poner a cero los contadores de latencia o iniciar una reconstrucción de las estadísticas de participaciones. Las peticiones que no proceden de un navegador, como la acción Estado del pool o una comprobación de salud, no se ven afectadas. Las respuestas indican además a los navegadores que no deduzcan el tipo de contenido y que no permitan incrustar el panel en un marco, y la reconstrucción de estadísticas se niega a iniciar una segunda ejecución mientras ya hay una en curso. El acelerador de transacciones se revisó como parte de este trabajo y no necesitó cambios: ya rechaza todo lo que no sea un identificador de transacción de 64 caracteres, limita la tarifa a 2000 sat/vB y pasa los valores a Bitcoin Core como parámetros tipados.',
|
||||
de_DE:
|
||||
'Sicherheitshärtung der Dashboard-API. Der WebSocket, der das Dashboard versorgt, und jede zustandsändernde Anfrage prüfen jetzt, ob sie vom Dashboard selbst stammen und nicht von einer anderen Website. Ohne diese Prüfung hätte eine Webseite, die Sie bei angemeldeter StartOS-Sitzung besuchen, Ihre Browsersitzung nutzen können, um Pool-Daten auszulesen, darunter Auszahlungsadressen, Hashrate je Worker und Blockhistorie, oder um Admin-Aktionen auszulösen, etwa das Nullsetzen der Latenzzähler oder den Neuaufbau der Share-Statistiken. Nicht browsergesteuerte Anfragen, etwa die Aktion „Pool-Status“ oder eine Health-Prüfung, sind nicht betroffen. Antworten weisen Browser zudem an, Inhaltstypen nicht zu erraten und das Dashboard nicht in einem Frame einzubetten, und der Neuaufbau der Share-Statistiken verweigert einen zweiten Lauf, solange bereits einer läuft. Der Transaktionsbeschleuniger wurde dabei überprüft und benötigte keine Änderung: Er weist alles zurück, was keine 64 Zeichen lange Transaktions-ID ist, begrenzt die Gebühr auf 2000 sat/vB und übergibt Werte typisiert an Bitcoin Core.',
|
||||
pl_PL:
|
||||
'Wzmocnienie bezpieczeństwa API pulpitu. WebSocket zasilający pulpit oraz każde żądanie zmieniające stan sprawdzają teraz, czy pochodzą z samego pulpitu, a nie z innej witryny. Bez tej kontroli strona internetowa odwiedzona podczas zalogowania do StartOS mogła wykorzystać sesję przeglądarki do odczytania danych puli, w tym adresów wypłat, hashrate poszczególnych koparek i historii bloków, albo do uruchomienia akcji administracyjnych, takich jak wyzerowanie liczników opóźnień czy rozpoczęcie odbudowy statystyk udziałów. Żądania niepochodzące z przeglądarki, na przykład akcja Stan puli lub kontrola stanu zdrowia, pozostają bez zmian. Odpowiedzi informują ponadto przeglądarki, aby nie zgadywały typu treści i nie pozwalały osadzać pulpitu w ramce, a odbudowa statystyk odmawia uruchomienia drugiego przebiegu, gdy jeden już trwa. Akcelerator transakcji został przy tej okazji sprawdzony i nie wymagał zmian: już wcześniej odrzucał wszystko, co nie jest 64-znakowym identyfikatorem transakcji, ogranicza stawkę do 2000 sat/vB i przekazuje wartości do Bitcoin Core jako parametry typowane.',
|
||||
fr_FR:
|
||||
'Renforcement de la sécurité de l’API du tableau de bord. Le WebSocket qui alimente le tableau de bord, ainsi que toute requête modifiant l’état, vérifient désormais qu’ils proviennent bien du tableau de bord et non d’un autre site. Sans cette vérification, une page web visitée pendant que vous étiez connecté à StartOS aurait pu utiliser votre session de navigateur pour lire les données du pool, notamment les adresses de paiement, le hashrate par mineur et l’historique des blocs, ou pour déclencher des actions d’administration comme la remise à zéro des compteurs de latence ou le lancement d’une reconstruction des statistiques de parts. Les requêtes qui ne viennent pas d’un navigateur, comme l’action État du pool ou une sonde de santé, ne sont pas affectées. Les réponses indiquent en outre aux navigateurs de ne pas deviner les types de contenu et de ne pas autoriser l’intégration du tableau de bord dans un cadre, et la reconstruction des statistiques refuse de démarrer une seconde exécution tant qu’une autre est en cours. L’accélérateur de transactions a été revu à cette occasion et n’a nécessité aucune modification : il rejette déjà tout ce qui n’est pas un identifiant de transaction de 64 caractères, plafonne le tarif à 2000 sat/vB et transmet les valeurs à Bitcoin Core sous forme de paramètres typés.',
|
||||
},
|
||||
// No data migration in either direction. The change is confined to how
|
||||
// the service decides whether to answer a request; nothing stored
|
||||
// changes shape, and a downgrade simply removes the checks again.
|
||||
migrations: {},
|
||||
})
|
||||
Reference in new issue
Block a user