#27 – Upgrade Proposal: v0.2.10
Passed
Proposal ID: 27
Type: Software Upgrade
Submit: 2026-02-17 09:26 UTC
Voting: 2026-02-17 09:26 UTC → 2026-02-18 09:26 UTC
Proposer: gonka18lluv53n4h9z34qu20vxcvypgdkhsg6nn2cl2d
Upgrade Proposal: v0.2.10
Full Proposal
Full proposal — click to expand · Open in separate page →
Upgrade Proposal: v0.2.10
This document outlines the proposed changes for on-chain software upgrade v0.2.10. The Changes section details the major modifications, and the Upgrade Plan section describes the process for applying these changes.
Upgrade Plan
This PR updates the code for the api and node services. The PR modifies the container versions in deploy/join/docker-compose.yml.
The binary versions will be updated via an on-chain upgrade proposal. For more information on the upgrade process, refer to /docs/upgrades.md.
Existing hosts are not required to upgrade their api and node containers. The updated container versions are intended for new hosts who join after the on-chain upgrade is complete.
To apply the new vLLM model parameters, mlnode must be restarted after the on-chain upgrade. The safest approach is:
The upgrade of MLNode to more reliable versions ghcr.io/product-science/mlnode:3.0.12-post4 / ghcr.io/product-science/mlnode:3.0.12-post4-blackwell is recommended.
Proposed Process
- Active hosts review this proposal on GitHub.
- Once the PR is reviewed by the community, a
v0.2.10release will be created from this branch, and an on-chain upgrade proposal for this version will be submitted. - If the on-chain proposal is approved, this PR will be merged immediately after the upgrade is executed on-chain.
Creating the release from this branch (instead of main) minimizes the time that the /deploy/join/ directory on the main branch contains container versions that do not match the on-chain binary versions, ensuring a smoother onboarding experience for new hosts.
Testing
The on-chain upgrade from version v0.2.9 to v0.2.10 has been successfully deployed and verified on the testnet. PoC time-based weight normalization has been validated in the testnet environment. No regression in core functionality or performance has been observed during testing.
Reviewers are encouraged to request access to testnet environments to validate both node behavior and the on-chain upgrade process, or to replay the upgrade on private testnets.
Migration
The on-chain migration logic is defined in upgrades.go.
Migrations:
- Validation slots default: explicitly sets PocParams.ValidationSlots=0 during migration. This keeps existing O(N^2) validation behavior after upgrade until sampling is enabled by governance parameter update.
- PoC normalization default: explicitly sets PocParams.PocNormalizationEnabled=true during migration to enable time-based weight normalization.
- Model parameter update: Updates Qwen/Qwen3-235B-A22B-Instruct-2507-FP8 with tool calling args (--enable-auto-tool-choice, --tool-call-parser hermes) and validation threshold 0.958.
PoC Validation Sampling Optimization
This upgrade introduces a new PoC validation mechanism that reduces complexity from O(N^2) to O(N x N_SLOTS) by assigning each participant a fixed sampled set of validators.
Reference design and analysis: proposals/poc/optimize.md
Key points:
- Only assigned validators validate each participant when sampling is enabled.
- Sampling is deterministic on both chain and API sides (based on validation snapshot + app_hash).
- Decision threshold is strict supermajority of assigned slots (>66.7%).
- The feature is shipped in this release but disabled by default (ValidationSlots=0) and can be enabled via a governance proposal that changes the ValidationSlots parameter to a non-zero value once rollout conditions are met.
PoC Weight Normalization by Real PoC Time
This upgrade normalizes PoC participant weights by actual PoC elapsed time to reduce block-time drift effects and keep weight outcomes consistent with real execution duration.
Key points:
- Adds PocParams.PocNormalizationEnabled parameter for time-based normalization control.
- Captures generation start and exchange end timestamps in PoCValidationSnapshot.
- Applies a normalization factor derived from expected stage duration vs actual elapsed time.
- Applies to both regular PoC and confirmation PoC weight calculations.
- Enabled by default in this upgrade (PocNormalizationEnabled=true).
Upgrade Grace Period
To ensure a smooth upgrade transition: - Confirmation PoC will not be triggered for the first 3000 blocks (~5 hours) after upgrade. - Miss/invalid punishment rates are relaxed for the entire grace epoch (binom_test_p0 set to 0.5). - Regular PoC operates normally during the grace period.
Changes
PR #710 PoC Validation Sampling Optimization
- Reduces validation complexity from quadratic to slot-based sampling.
- Adds deterministic slot assignment shared by chain and API, with snapshot-backed weight synchronization.
- Keeps backward-compatible fallback path when
ValidationSlots=0and includes upgrade-time default ofValidationSlots=0for safe rollout.
PR #725 PoC weight normalization on real PoC time
- Adds time-based PoC weight normalization to reduce sensitivity to block-time variance.
- Introduces
PocNormalizationEnabledin PoC params and uses validation snapshot timestamps to compute normalization factor. - Integrates normalization into both regular PoC and confirmation PoC weight calculations.
- Upgrade handler enables normalization by default for
v0.2.10.
PR #767 Upgrade grace period, tool calling, and PoC timing fix
- Adds grace epoch protection for the upgrade epoch: extended CPoC window (3000 blocks) and relaxed miss/invalid thresholds.
- Updates Qwen model with tool calling support (
--enable-auto-tool-choice,--tool-call-parser hermes). - Adjusts validation threshold from 0.970917 to 0.958.
- Deprecates
poc_exchange_durationparameter (set to 0 in upgrade). API artifact acceptance now aligns with chain exchange windows using explicit block height checks instead of relying on phase alone. Fixes a gap where chain accepted nonces longer than API.
PR #708 IBC Upgrade to v8.7.0
- Upgrades IBC stack to v8.7.0.
- Aligns chain interoperability components with current IBC release line.
PR #723 Testnet bridge setup scripts
- Adds bridge setup scripts for testnet operations.
- Improves reproducibility of bridge deployment and validation workflows.
PR #666 Artifact storage throughput optimization
- Improves PoC artifact storage throughput.
PR #688 Punishment statistics from on-chain data
- Uses on-chain data for punishment statistics with dynamic table selection.
PR #697 Portable BLST build for macOS test builds
- Uses a portable BLST build path for macOS test binaries.
- Improves reliability of local/test build pipeline on macOS hosts.
PR #712 Require proto-go generation matches committed code
- Enforces proto-go generation consistency in development flow.
- Prevents accidental drift between generated and committed protobuf code.
PR #711 PoC test params from chain state
- Replaces hardcoded PoC test defaults with chain state parameters.
PR #641 Streamvesting transfer with vesting
- Adds
MsgTransferWithVestingRPC and message type in thestreamvestingmodule. Enables sender-to-recipient token transfers with vesting over N epochs (default: 180 epochs when not specified). - Adds safety limits to prevent abusive requests: max
3650vesting epochs and max10coin denoms per transfer.
API hardening and reliability fixes
- PR #634: add request body size limits to reduce DoS risk.
- PR #727: follow-up for #634, pass response writer to
http.MaxBytesReaderand align tests. - PR #638: fix unsafe type assertions in request processing.
- PR #644: avoid rewriting static config on each startup.
- PR #661: prevent API crash on short network drops.
- PR #640: add unit tests for node version endpoint behavior.
- PR #622: propagate refund errors in
InvalidateInference. - PR #639: add missing return after error in task claiming path.
- PR #643: sanitize nil participants in executor selection.
- PR #545: minor bug fixes in API flow.
Other fixes
- PR #659: model assignment checks previous-epoch rewards.
- PR #716: rename PoC weight function for clarity and correctness.
Proposed Bounties
| PR/Issue | Sum GNK | Bounty Explanation |
|---|---|---|
| PR #661 | 500 | Valid fix for minor vulnerability that was previously reported in issue #422 |
| PR #644 | 700 | Planned task, not a vulnerability, important for the network. |
| PR #659 | 10,000 | Detailed report and fix for a Medium risk vulnerability. |
| Report | 5,000 | First report of the vulnerability fixed in #659 |
| PR #545 | 1,000 | Report and fix of low risk vulnerability. Extra appreciation for discovering and reporting it during the review of another PR. |
| PR #640 | 100 | Valid minor bug fix. |
| Issue #422 | 500 | First report and suggested fix. Fixed in PR #661 |
| PR #638 | 100 | Valid minor bug fix. |
| PR #634 | 100 | Valid minor bug fix. |
| Report | 5,000 | Independent report on the issue addressed by PR #710. |
| PR #643 | 500 | Report and fix of low risk vulnerability. |
| PR #641 | 1,500 | Valid implementation of a planned task. |
| PR #622 | 700 | Valid minor vulnerability report and fix. |
| PR #688 | 1,500 | Valid implementation of a planned task with adjusting scope, important for the network. |
Final Tally
Messages
| # | Type |
|---|---|
| 1 | /cosmos.upgrade.v1beta1.MsgSoftwareUpgrade |
Contract Details
[
{
"@type": "/cosmos.upgrade.v1beta1.MsgSoftwareUpgrade",
"authority": "gonka10d07y265gmmuvt4z0w9aw880jnsr700j2h5m33",
"plan": {
"name": "v0.2.10",
"time": "0001-01-01T00:00:00Z",
"height": "2712600",
"info": "{\n \"binaries\": {\n \"linux/amd64\": \"https://github.com/gonka-ai/gonka/releases/download/release%2Fv0.2.10/inferenced-amd64.zip?checksum=sha256:b118610cfa1f45f9dfb4eb112a01a91ad886333b73aac49fee20abc0c3f1998a\"\n },\n \"api_binaries\": {\n \"linux/amd64\": \"https://github.com/gonka-ai/gonka/releases/download/release%2Fv0.2.10/decentralized-api-amd64.zip?checksum=sha256:47d6b64424f34242ba12d04aa367f3a7d3933961b55f9d2434b36399d0faf18f\"\n }\n }",
"upgraded_client_state": null
}
}
]