v2.3.7
Security: the group admin view could be read with any token
- The open-invite and join-request reads keyed their response cache on whether a token header was present and checked the token only on a cache miss. For 30 s after the admin's own call, any token got the cached admin body. The token is now checked before the cache, the same way the group detail already did it.
Blockparty
- Dissolving a party now frees its members' addresses. The member rows and the join link are deleted in the same transaction as the status change, like Group-Solo. Before, every former member and the admin stayed locked out of later parties, and the custom-extranonce Solo check kept refusing them. Migration 0016 cleans up parties dissolved earlier.
- The party roster (
GET /api/blockparty/:idand member-view) no longer exposes member addresses. It sendsmemberId,addressLabelandisSelflike the Group-Solo roster; the full address only with the admin token.adminAddressstays public, it is the party's mining target.
Best-share charts
- New: the highest single share difficulty per 10-minute slot, pool-wide (
GET /api/info/max-difficulty), per address (GET /api/client/:address/max-difficulty) and per Group-Solo group (GET /api/pplns/groups/:id/max-difficulty), for 1, 3 or 7 days in the slot shape of/accepted. The value is recorded by the existing batched stats flush, without new rows or writes; the group endpoint reads all members in one query. - New:
GET /api/client/:address/best-difficulty/today?since=<ms>returns the best share since the caller's local midnight.
Share statistics
- Stale shares are counted as
Staleinstead ofJobNotFound. Both protocol adapters folded them into job-not-found before the stats saw them, so the stale columns and theStalekey of the reject APIs stayed at zero. - A disconnected session is no longer revived as mining. The live touch was stamped when the satellite consumed a share instead of when the pool accepted it, so a session's last shares could land after its disconnect and
kill_dead_clientsbrought the session back for several minutes. - Accepted and rejected shares are published to the Redis stream in batches, one pipeline per drain instead of one round trip per share. Measured locally the drain goes from about 14,000 to about 160,000 shares per second, which keeps large rentals far away from the point where the publish buffer drops shares.
Group-Solo block preview
- An address without shares in the group's window no longer gets a preview job with itself as finder. The preview names the member with the largest window share instead, and reports it as
previewFinder.
Operations
- The pool builds its schema from an empty database. Migration
0000_baselinecreates the base tables on an empty database and changes nothing on an existing one;db/schema.sqlis gone. - A binary one release older boots against newer migrations. The processes are swapped one at a time, and a core on the previous image used to refuse to start once the api had applied a new migration.
- A refused SV2 channel open and a refused SV1 authorize are logged with the session, the identity and the reason. Before, they only went back to the miner.
GET /api/pplns/groups/membership/:addressanswers yes or no without building the group detail, andGET .../:id/admin-check(Group-Solo and Blockparty) checks an admin token without reading anything else.
Upgrade notes
- Two new migrations:
0016(Blockparty, deletes the member rows and join links of already dissolved parties) and0017(addsmaxDifficultytopool_share_statistics_entityandclient_statistics_entity).0000_baselineis only recorded on an existing database. - A 2.3.6 binary does not start against a database that has migration 0016 or later. Move every process to 2.3.7; from 2.3.7 on, a process one release behind keeps starting.
- No config changes. The Redis and stream formats are unchanged, so the processes can be swapped one after another.
- Stale rejects recorded before the upgrade stay in
JobNotFound; they cannot be split afterwards. The best-share charts fill up from the deploy on.