# NNS Update: February 13, 2025

**URL:** <https://forum.dfinity.org/t/nns-update-february-13-2025/41144>\
**Category:** Developers\
**Tags:** nns\
**Created:** [February 13, 2025, 2:38pm UTC](https://forum.dfinity.org/t/nns-update-february-13-2025/41144 "2025-02-13T14:38:44Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![aterga](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/aterga/32/4143_2.png) [@aterga](https://forum.dfinity.org/u/aterga)\
**Post date:** [February 13, 2025, 2:38pm UTC](https://forum.dfinity.org/t/nns-update-february-13-2025/41144/1 "2025-02-13T14:38:44Z")

</div>

The Governance Team submitted the following proposal. DFINITY plans to vote on this proposal later today, Thursday, February 13th.

[https://dashboard.internetcomputer.org/proposal/135300](https://dashboard.internetcomputer.org/proposal/135300)

This is a shorter than usual voting period, as there was a security-related fix.

This is an amendment of the hotfix proposal announced [yesterday](https://forum.dfinity.org/t/nns-update-february-12-2025/41125). In other words, 135300 includes the changes from 135286, plus another small fix. To avoid confusion, DFINITY plans to adopt 135300 and reject 135286.

We will provide more info about the fix shortly.

## Proposals to be Submitted

````markdown
# Upgrade the Registry Canister to Commit 4f60863

__Proposer__ : arshavir.ter.gabrielyan at dfinity.org

__Source code__ : [4f60863183c418782800fc8ffacf41be494a9a15][new-commit]

[new-commit]: https://github.com/dfinity/ic/tree/4f60863183c418782800fc8ffacf41be494a9a15

## Features & Fixes

### Fixed

#### Disable replacement of nodes that are active in subnets

Direct node replacements of nodes that are active in a subnet may result in unexpected behavior and potential problems in the current Consensus code.
So to be on the safe side we need to disable the functionality on the Registry side until the rest of the core protocol can handle it safely.

## New Commits

```
$ git log --format="%C(auto) %h %s" 2d4bcba47ea10520ff21ce54a8acb9cdb0629317..4f60863183c418782800fc8ffacf41be494a9a15 -- ./rs/registry/canister
 4f60863183 fix(registry): disable replacement of nodes that are active in subnets (#3935)
 8a3737fa65 fix(registry): Update the correct node operator ID in node removal (#3924)
 527f4adf99 chore: Quotation in error messages (#3828)
 4c20acbce9 chore(nervous-system): Update changelog for release 2025-02-07 (#3867)
```

## Current Version

__Current git hash__ : 2d4bcba47ea10520ff21ce54a8acb9cdb0629317

__Current wasm hash__ : f8b2aba5d7217cc07a84d59a18af825c2a8813dd38073b96456b2e83d1e78e37

## Verification

See the general instructions on [how to verify] proposals like this. A "quick
start" guide is provided here.

[how to verify]: https://github.com/dfinity/ic/tree/4f60863183c418782800fc8ffacf41be494a9a15/rs/nervous_system/docs/proposal_verification.md

### WASM Verification

See ["Building the code"][prereqs] for prerequisites.

[prereqs]: https://github.com/dfinity/ic/tree/4f60863183c418782800fc8ffacf41be494a9a15/README.adoc#building-the-code

```
# 1. Get a copy of the code.
git clone git@github.com:dfinity/ic.git
cd ic
# Or, if you already have a copy of the ic repo,
git fetch
git checkout 4f60863183c418782800fc8ffacf41be494a9a15

# 2. Build canisters.
./ci/container/build-ic.sh -c

# 3. Fingerprint the result.
sha256sum ./artifacts/canisters/registry-canister.wasm.gz
```

This should match `wasm_module_hash` field of this proposal.

````

Please note that the release notes for commits 4c20acbce9-8a3737fa65 were omitted form the Features & Fixes section by mistake, but those commits are indeed part of this release, as announced yesterday. They should have read as follows:

```markdown
### Update the correct node operator ID in do_remove_node_directly

Fix for the do_remove_node_directly function to update the correct node operator ID record.
In the past the caller_id and the node_operator_id for the node were always the same.
However, since #3285 the caller_id and the node_operator_id for the removed node may differ,
and this introduces a bug in this edge case.

The bug resulted in a node reward discrepancy for a few operator records, identified in the
regular administrative checks before the reward distribution and [described in the forum](https://forum.dfinity.org/t/issue-with-node-provider-rewards/41109/2) and
mitigated with a few NNS proposals referenced in the forum thread.

```

---

<div class="post-metadata">

**Author:** ![sat](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/sat/32/816_2.png) [@sat](https://forum.dfinity.org/u/sat)\
**Post date:** [February 13, 2025, 4:05pm UTC](https://forum.dfinity.org/t/nns-update-february-13-2025/41144/2 "2025-02-13T16:05:36Z")

</div>

A bit more context around the issue, now that the proposal has been adopted.  
Earlier today we got an alert from our monitoring stack that an unexpected behavior has been encountered and we tracked it down to the recently added functionality:

> <https://github.com/dfinity/ic/pull/3377>
>
> \### Summary
> This PR resolves a long-standing issue faced by many node providers…, that a node cannot be replaced if it's currently in a subnet.
> However, if the IP address of the node matches, this means that the new node is a direct replacement for the old node, which also means that the subnet decentralization is unaffected. Therefore, we now allow a direct replacement of nodes that are in a subnet. Direct removal of such nodes is still not allowed though, since that would change the subnet decentralization.
> 
> \### Changes
> \- \*\*Node Addition\*\*: 
> - If there is exactly one node with the same IP, prepare node remove mutations \`make\_remove\_or\_replace\_node\_mutations\`.
> - Atomically remove and add nodes (change in behavior compared to before).
> - Adjusts node allowance based on nodes removed and added.
> 
> \- \*\*Node Removal & Replacement\*\*:
> - Implements \`do\_replace\_node\_with\_another\` method for replacing nodes within a subnet, for testing purposes.
> - Adjusts node operator's node allowance after node mutations.
> 
> \- \*\*Tests\*\*:
> - Enhances test coverage to verify node replacement in subnets.
> - Adds tests to validate allowance update during node replacements.
> 
> \### Miscellaneous
> \- Internal private methods adapted to support new logic without breaking existing functionality.

Without disabling this functionality in some edge cases it might come to consensus stalling, and requiring subnet recovery.

The reason we introduced this functionality in the first place is mostly around [Proposal: Update Interim Gen-1 Node Provider Remuneration After 48 months](https://forum.dfinity.org/t/proposal-update-interim-gen-1-node-provider-remuneration-after-48-months/35001/) and the related node redeployments.  
The need to go through the NNS proposals for these node redeployments significantly increases the friction and worsens the UX for node providers.  
So we will give our best to re-enable the functionality as soon as possible.

---

<div class="post-metadata">

**Author:** ![Zane](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/zane/32/6541_2.png) [@Zane](https://forum.dfinity.org/u/Zane)\
**Post date:** [February 14, 2025, 10:53am UTC](https://forum.dfinity.org/t/nns-update-february-13-2025/41144/3 "2025-02-14T10:53:14Z")

</div>

# Proposal 135300 - Zane | CodeGov

Vote: ADOPT  
Reason: Build completes successfully, both hashes and reviewed commits match their descriptions.

![135300](https://us1.discourse-cdn.com/flex023/uploads/dfn/optimized/3X/c/0/c0de9c41c9e0dd590df6e21611ad7ed720f98a19_2_690x36.png)

[4f60863183](https://github.com/dfinity/ic/commit/4f60863183) Temporarily disabled direct replacement of already deployed nodes functionality in `make_remove_or_replace_node_mutations` and annotated related tests with ignore attribute.

[8a3737fa65](https://github.com/dfinity/ic/commit/8a3737fa65) In `make_remove_or_replace_node_mutations` retrieve node operator record using operator id instead of the caller id. Updated tests to ensure node operator record allowance is properly updated after node removal.

[527f4adf99](https://github.com/dfinity/ic/commit/527f4adf99) Improved readability for CalledTrap type errors.

[4c20acbce9](https://github.com/dfinity/ic/commit/4c20acbce9) Update changelog files.

> **About CodeGov**
>
> CodeGov has a team of developers who review and vote independently on the following proposal topics: IC-OS Version Election, Protocol Canister Management, Subnet Management, Node Admin, and Participant Management. The [CodeGov NNS known neuron](https://www.codegov.org/codegov-nns-neuron) is configured to follow our reviewers on these technical topics. We also have a group of Followees who vote independently on the Governance and the SNS & Neuron’s Fund topics. We strive to be a credible and reliable Followee option that votes on every proposal and every proposal topic in the NNS. We also support decentralization of SNS projects such as WaterNeuron, KongSwap, and Alice with a known neuron and credible Followees.  
>   
> Learn more about CodeGov and its mission at [codegov.org](https://www.codegov.org/).

---

<div class="post-metadata">

**Author:** ![1eo](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/1eo/32/25778_2.png) [@1eo](https://forum.dfinity.org/u/1eo)\
**Post date:** [February 17, 2025, 12:36pm UTC](https://forum.dfinity.org/t/nns-update-february-13-2025/41144/4 "2025-02-17T12:36:00Z")

</div>

# Approve [135300](https://nns.ic0.app/proposal/?u=qoctq-giaaa-aaaaa-aaaea-cai&proposal=135300)

## Proposal

- Canister id `rwlgt-iiaaa-aaaaa-aaaaa-cai` is indeed the registry canister.
- The upgrade args correspond to the empty args.
- The install mode is indeed `upgrade`.
- The wasm hash is reproducible.

![Screenshot 2025-02-17 at 13.27.30](https://us1.discourse-cdn.com/flex023/uploads/dfn/optimized/3X/e/e/eededea59fb051fa09fb5e7337f66be40b27e893_2_690x28.png)

## Code Review

The direct replacement of already deployed nodes in the `make_remove_or_replace_node_mutations` function has been temporarily disabled, and related tests have been annotated with the ignore attribute.

Additionally, the `make_remove_or_replace_node_mutations` function now retrieves the node operator record using the operator ID instead of the caller ID, with tests updated to ensure that the node operator record allowance is properly updated after node removal.

Readability improvements have been made for `CalledTrap` type errors. Lastly, the changelog files have been updated to reflect these changes.

---

<div class="post-metadata">

**Author:** ![ZackDS](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/zackds/32/40368_2.png) [@ZackDS](https://forum.dfinity.org/u/ZackDS)\
**Post date:** [February 17, 2025, 3:59pm UTC](https://forum.dfinity.org/t/nns-update-february-13-2025/41144/5 "2025-02-17T15:59:13Z")

</div>

## Proposal #[135300](https://dashboard.internetcomputer.org/proposal/135300) for registry — Zack | CodeGov

**Vote** : Adopted

**Reason** : Builds fine and the wasm hash is a match.

 ![Screenshot 2025-02-17 174021](https://us1.discourse-cdn.com/flex023/uploads/dfn/original/3X/3/6/3677c53926119914931f5012e7e033b1dde51fce.png)

`4f60863183`  
The main fix temporaily disables direct active nodes replacements by setting `replacements_of_nodes_in_subnets_enabled` to false.

`8a3737fa65`  
Uses the correct `node_operator_id` that not always matched `caller_id` for node removal in `do_remove_node_directly.rs`.

`527f4adf99`  
Added single quotes to the trapp error messsages to improve readability.

`4c20acbce9`  
Updates the changelog files to latest executed Proposals.

> **About CodeGov**
>
> CodeGov has a team of developers who review and vote independently on the following proposal topics: IC-OS Version Election, Protocol Canister Management, Subnet Management, Node Admin, and Participant Management. The [CodeGov NNS known neuron](https://www.codegov.org/codegov-nns-neuron) is configured to follow our reviewers on these technical topics. We also have a group of Followees who vote independently on the Governance and the SNS & Neuron’s Fund topics. We strive to be a credible and reliable Followee option that votes on every proposal and every proposal topic in the NNS. We also support decentralization of SNS projects such as WaterNeuron, KongSwap, and Alice with a known neuron and credible Followees.  
>   
> Learn more about CodeGov and its mission at [codegov.org](https://www.codegov.org/).

---

<div class="post-metadata">

**Author:** ![LaCosta](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/lacosta/32/20232_2.png) [@LaCosta](https://forum.dfinity.org/u/LaCosta)\
**Post date:** [February 19, 2025, 9:54am UTC](https://forum.dfinity.org/t/nns-update-february-13-2025/41144/6 "2025-02-19T09:54:27Z")

</div>

# [Proposal 135300](https://dashboard.internetcomputer.org/proposal/135300) – LaCosta | CodeGov

**Vote: ADOPT**

 ![image](https://us1.discourse-cdn.com/flex023/uploads/dfn/original/3X/f/9/f973de2bd8eaf0efd1821f1d8d180a6be298dece.png)  
**Reason:**  
Build successful and hashes match, commits look great and match the description. Found no issues.

[[4f60863183](https://github.com/dfinity/ic/commit/4f60863183)]: Temporarly disables replacement of `Active` nodes in subnets until the protocol can handle this safely by using the variable `replacements_of_nodes_in_subnets_enabled` which is set to false.

[[8a3737fa65](https://github.com/dfinity/ic/commit/8a3737fa65)]: Since the `caller_id` previously used as the variable for Node Operator ID may differ from it , the PR [#3285](https://github.com/dfinity/ic/pull/3285) changed restrictions to allow checking the Node Provider ID and DC of the caller. But there was a stage that retrieved the NO record and incremented it by 1 that was still using the `caller_id` instead of the `node_operator` in the payload.

[[527f4adf99](https://github.com/dfinity/ic/commit/527f4adf99)]: Improved error messages format

[[4c20acbce9](https://github.com/dfinity/ic/commit/4c20acbce9)]: Moved added features and fixes from `unrealeased_changelog.md` to `CHANGELOG.md` in the form of proposals that were released.

> **About CodeGov**
>
> CodeGov has a team of developers who review and vote independently on the following proposal topics: IC-OS Version Election, Protocol Canister Management, Subnet Management, Node Admin, and Participant Management. The [CodeGov NNS known neuron](https://www.codegov.org/codegov-nns-neuron) is configured to follow our reviewers on these technical topics. We also have a group of Followees who vote independently on the Governance and the SNS & Neuron’s Fund topics. We strive to be a credible and reliable Followee option that votes on every proposal and every proposal topic in the NNS. We also support decentralization of SNS projects such as WaterNeuron, KongSwap, and Alice with a known neuron and credible Followees.  
>   
> Learn more about CodeGov and its mission at [codegov.org](https://www.codegov.org/).
