Skip to content

Commit 9d2b0ad

Browse files
committed
docs(canister-management): improve subnet selection guide
Addresses all issues raised in #233: - Rename "Colocation with an existing canister" to "Colocation via proxy canister" and expand it with three targeted fixes: - Clarify that --proxy and --subnet are mutually exclusive - Add the full ProxyArgs/ProxyResult Candid interface so developers know exactly what their proxy canister must implement - Explain the cycles model: --cycles passes a value through ProxyArgs.cycles and is paid from the proxy canister's own balance, not the caller's wallet - Fix the "by default" phrasing in troubleshooting: replace with "without using icp canister migrate-id" - Add a direct link to the canister migration guide in the troubleshooting entry and in Next steps
1 parent 1756b54 commit 9d2b0ad

1 file changed

Lines changed: 40 additions & 6 deletions

File tree

‎docs/guides/canister-management/subnet-selection.md‎

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,48 @@ The `--subnet` flag only affects canister creation. If a canister already exists
8484

8585
> **Tip:** Subnet principal IDs can change over time. Always verify the current ID for a named subnet on the [ICP Dashboard](https://dashboard.internetcomputer.org/subnets) before using it in production scripts.
8686
87-
## Colocation with an existing canister
87+
## Colocation via proxy canister
8888

89-
To create a new canister on the same subnet as an existing canister, use the `--proxy` flag with `icp canister create`. This routes the creation call through the existing canister and places the new canister on the same subnet:
89+
To create a new canister on the same subnet as an existing canister, use the `--proxy` flag with `icp canister create`. This routes the creation call through a proxy canister, and the new canister is placed on that proxy's subnet:
9090

9191
```bash
92-
icp canister create my_new_canister -e ic --proxy <EXISTING_CANISTER_ID>
92+
icp canister create my_new_canister -e ic --proxy <PROXY_CANISTER_ID>
93+
94+
# With a custom cycle allocation for the new canister (proxy pays from its own balance):
95+
icp canister create my_new_canister -e ic --proxy <PROXY_CANISTER_ID> --cycles 3T
9396
```
9497

95-
This is useful when you already have a deployed canister and want new canisters to live on the same subnet. The proxy canister must implement a `proxy` method that forwards management canister calls.
98+
`--proxy` and `--subnet` are mutually exclusive: the CLI rejects any call that specifies both.
99+
100+
### Proxy interface requirement
101+
102+
The target canister must expose a `proxy` method with this exact Candid interface. An arbitrary canister will reject the call:
103+
104+
```candid
105+
type ProxyArgs = record {
106+
canister_id : principal;
107+
method : text;
108+
args : blob;
109+
cycles : nat;
110+
};
111+
112+
type ProxyResult = variant {
113+
Ok : record { result : blob };
114+
Err : variant {
115+
InsufficientCycles : record { available : nat; required : nat };
116+
CallFailed : record { reason : text };
117+
UnauthorizedUser;
118+
};
119+
};
120+
121+
service : {
122+
proxy : (ProxyArgs) -> (ProxyResult);
123+
}
124+
```
125+
126+
### Cycles model
127+
128+
The `--cycles` value specifies how many cycles to allocate to the new canister. Those cycles are drawn from the proxy canister's own balance, not from your wallet. Ingress messages on ICP cannot carry cycles; the value is passed as data in `ProxyArgs.cycles`, and the proxy spends from its own cycle balance when forwarding the management canister call. Ensure the proxy canister is adequately funded before use.
96129

97130
## Storage capacity considerations
98131

@@ -110,10 +143,10 @@ Verify the subnet ID is correct. Some subnets (including all system subnets) do
110143

111144
### Canister is on the wrong subnet
112145

113-
Canisters cannot be moved between subnets while keeping the same canister ID by default. Your options depend on whether you can accept a new ID:
146+
Canisters cannot be moved between subnets while keeping the same canister ID without using `icp canister migrate-id`. Your options depend on whether you can accept a new ID:
114147

115148
- **New canister ID is acceptable**: Transfer state via [canister snapshots](snapshots.md) to a new canister on the correct subnet.
116-
- **Canister ID must be preserved**: Transfer state via snapshots, copy settings, then use `icp canister migrate-id` to move the ID to the new canister.
149+
- **Canister ID must be preserved**: Transfer state via snapshots, copy settings, delete the snapshot on the target, then run `icp canister migrate-id` to move the ID to the new canister. See the [canister migration guide](https://cli.internetcomputer.org/0.2/guides/canister-migration) for the complete step-by-step workflow, including the cycle warning, the snapshot deletion requirement before `migrate-id`, NNS controller cleanup, and how to recover from interruptions.
117150

118151
Note that any canister ID change means losing access to any threshold signature keys (tECDSA, tSchnorr) and vetKeys derived by the original canister: these are cryptographically bound to the canister ID. Any assets or encrypted data tied to those keys become permanently inaccessible under the new ID.
119152

@@ -122,6 +155,7 @@ Note that any canister ID change means losing access to any threshold signature
122155
- [Cycles costs](../../references/cycles-costs.md#replication-factors): Cost tables and the subnet multiplier formula
123156
- [Subnet types reference](../../references/subnet-types.md): Full reference for all subnet types with node counts and properties
124157
- [Canister snapshots](snapshots.md): Transfer state between canisters when migrating subnets
158+
- [Canister migration](https://cli.internetcomputer.org/0.2/guides/canister-migration): Complete workflow for moving a canister to a different subnet, with or without preserving the canister ID
125159
- [Network overview](../../concepts/network-overview.md): How subnets fit into the ICP architecture
126160

127161
<!-- Upstream: informed by dfinity/portal docs/building-apps/developing-canisters/deploy-specific-subnet.mdx; dfinity/icp-cli docs/guides/deploying-to-specific-subnets.md -->

0 commit comments

Comments
 (0)