| title | IC interface spec changelog | ||||
|---|---|---|---|---|---|
| description | Version history and changes to the IC Interface Specification | ||||
| sidebar |
|
- The management canister method
canister_infocan now also be invoked via non-replicated (query) calls by external users and from composite query methods (it remains callable by canisters via inter-canister calls and remains rejected for ingress messages). Retrieving canister information is not subject to any access control, so any principal, including the anonymous one, can call it.
- Two new paths in the certified state tree,
/canister/<canister_id>/canister_creation_timestamp(the time at which the canister was created) and/canister/<canister_id>/last_install_timestamp(the time at which the canister's code was most recently deployed or a snapshot was loaded onto it), both expressed in nanoseconds since 1970-01-01. Both can be requested viaread_stateif<canister_id>matches the effective canister id of the request. - Composite query methods and their callbacks can call the management canister query methods
canister_status,canister_metrics,fetch_canister_logs, andlist_canisters. Such a call is always executed against the state of the subnet hosting the calling canister and it is subject to the same access control as the corresponding query call submitted by a user, with the calling canister as the caller. Calls to all other management canister methods are rejected.
- New canister setting
status_visibilitycontrolling who can read a canister's status via thecanister_statusendpoint:controllers(default) restricts access to the canister's controllers,publicallows anyone, andallowed_viewersgrants access to a list of up to 10 principals in addition to the controllers. The canister itself and subnet admins can always read the status.
- New optional
permissionsfield in request delegations restricting the kinds of requests the delegation applies for: the value"queries"restricts the delegation to query calls andread_staterequests, so update calls carrying such a delegation in their chain of delegations are not accepted; the value"all"permits all kinds of requests, same as omitting the field. Requests of any kind carrying a delegation with any other value of thepermissionsfield are not accepted. wasm_memory_thresholdin canister settings is now bounded by 248, analogously towasm_memory_limit.- New canister setting
minimum_incoming_canister_call_cycles: if set, inter-canister calls from a different canister that attach fewer cycles than this threshold are rejected withCANISTER_ERRORand all attached cycles are refunded. Ingress messages and self-calls are not affected.
- Support for the HTTP method
PATCHin canisterhttp_requestin non-replicated mode.
- Inter-canister response callback messages might still be executed after the condition for
canister_on_low_wasm_memoryis triggered and before the functioncanister_on_low_wasm_memoryis executed. - Allow EdDSA on curve Ed25519 as a third WebAuthn signature scheme (alongside ECDSA P-256 and RSA PKCS#1v1.5).
- New management canister endpoint
canister_metrics.
- Canister signatures from canisters on subnets of type
cloud_engineare not valid. - New HTTP endpoints for update calls (to create a canister by subnet admins) and query calls (to list all canisters on a subnet by subnet admins) whose URL contains the (effective) subnet ID on which the canister is created or whose canisters should be enumerated.
- Update and query calls by users authenticated via canister signatures can carry
auxiliary information signed by a canister signature issued by the same canister.
That information is passed via a new
sender_infofield of the user HTTP request and available to the callee via new system APIic0.msg_caller_info_data_size,ic0.msg_caller_info_data_copy,ic0.msg_caller_info_signer_size, andic0.msg_caller_info_signer_copy. - Added query call for subnet admins to list all canisters on a subnet.
- Added subnet admins who can start, stop, uninstall, delete a canister and request its status.
- Added canister snapshot visibility settings.
- Support for the HTTP methods
PUTandDELETEin canisterhttp_requestin non-replicated mode. - Added subnet type to the certified state tree at the path
/subnet/<subnet_id>/type.
- Support for canister renaming (required for canister ID migration from one subnet to another subnet).
- The management canister's endpoint
take_canister_snapshotcan uninstall code atomically after taking canister snapshot. - The canister system API
ic0.msg_reject_codeis available in cleanup callbacks.
- New execution context
TQfor canister http transform functions to specify that no IC certificate is available in such executions.
- Canister memory allocation does not limit canister memory usage.
- Management canister endpoint
canister_statuscan be invoked as a query call.
- Allow loading a canister snapshot onto a different canister on the same subnet.
- New management canister API providing canister metadata (contained in canister WASM custom sections).
- New HTTP handler endpoints to support canister migration (by providing sharded routing table in certificates):
/api/v4/canister/<effective_canister_id>/call,/api/v3/canister/<effective_canister_id>/read_state,/api/v3/subnet/<effective_subnet_id>/read_state, and/api/v3/canister/<effective_canister_id>/query. - The following existing HTTP handler endpoints are marked as deprecated:
/api/v3/canister/<effective_canister_id>/call,/api/v2/canister/<effective_canister_id>/read_state,/api/v2/subnet/<effective_subnet_id>/read_state, and/api/v2/canister/<effective_canister_id>/query. - Paths with prefix
/subnet/<subnet_id>/canister_ranges(legacy routing table) can only be requested via the deprecated endpoints or if<subnet_id>is the root subnet. - Paths with prefix
/canister_ranges/<subnet_id>(sharded routing table) can only be requested via/api/v{2,3}/subnet/.../read_state, i.e., not via/api/v{2,3}/canister/.../read_state. - All paths with prefix
/canister_ranges/<subnet_id>must refer to the same subnet ID<subnet_id>.
- Added support for non-replicated canister HTTP outcalls.
- Added support for canister environment variables in canister settings and new System API for accessing environment variables
(
ic0.env_var_count,ic0.env_var_name_size,ic0.env_var_name_copy, andic0.env_var_value_size).
- Management canister API for downloading and uploading canister snapshots.
- The management canister method
canister_statusreturns two new fields:versionindicating the canister version, andready_for_migrationindicating whether a canister's queues are empty and its streams flushed. The value only makes sense when the canister status isstopped. - Canister history provides the source of a snapshot in the entry for loading the snapshot.
- Canister ranges of every subnet are now available at a dedicated prefix
/canister_rangesin the state tree, facilitating fragmentation due to canister migration.
- The management canister method
subnet_inforeturns a new fieldregistry_versionproviding the registry version of the corresponding subnet.
- VetKD API is considered stable.
- New system API
ic0.root_key_{size, copy}for fetching the public key of the IC root key.
- Management canister API for threshold key derivation (vetKD).
- Non-ASCII characters are allowed in the URL of canister http outcalls.
- The transformed response size of canister http outcalls must not exceeded
max_response_bytes(if provided).
- Threshold Schnorr API, composite query methods, and canister logs management canister API are considered stable.
- Reverted a lower bound of one week on the canister's freezing threshold.
- Introduced a lower bound of one week on the canister's freezing threshold.
- Bounded-wait calls.
- New system API
ic0.canister_liquid_cycle_balance128returning the current amount of cycles that is available for spending in calls and execution. - A canister can have multiple snapshots.
- New canister method
canister_on_low_wasm_memoryinvoked when the canister is low on main memory according to a newwasm_memory_thresholdin canister settings. - New system APIs
ic0.cost_call,ic0.cost_create_canister,ic0.cost_http_request,ic0.cost_sign_with_ecdsa,ic0.cost_sign_with_schnorr, andic0.cost_vetkd_derive_encrypted_keyfor cycles cost calculation. - New field
memory_metricsproviding detailed metrics on the memory consumption of a canister in the response of the management canister'scanister_statusendpoint.
- New system API
ic0.subnet_self_sizeandic0.subnet_self_copy.
- Allow accepting and burning cycles in replicated queries.
- Add support for Schnorr auxiliary inputs
- Add management canister endpoint
subnet_info. - Support for wasm64: 64-bit system API.
- Allow anonymous query and read state requests with invalid
ingress_expiry. - Add allowed viewers variant to canister log visibility.
- Deprecate the Bitcoin API of the management canister.
- Add new management canister methods for canister snapshot support.
- EXPERIMENTAL: Management canister API to fetch Bitcoin block headers.
- Synchronous update call API at
/api/v3/canister/.../call.
- EXPERIMENTAL: Management canister API for threshold Schnorr signatures.
- Query call statistics.
- New
wasm_memory_persistenceoption for canister upgrades. - Rename
num_blocks_totaltonum_blocks_proposed_totalin node metrics served by the management canister. - Management canister query call to fetch canister logs.
- WASM heap memory limit in canisters settings.
- 32-bit stable memory System API is marked DEPRECATED.
- Remove the management canister query calls
bitcoin_get_balance_queryandbitcoin_get_utxos_query.
- Wrap chunk hash for install chunked code in a record and rename
storage_canistertostore_canister. - Update subnet read state request conditions on requested paths.
- Fix: allow inter-canister calls (requests) to be spontaneously rejected in the abstract spec.
- The maximum length of a nonce in an ingress message is 32 bytes.
- Update specification of responses from the endpoint
/api/v2/status. - Stop canister calls might be rejected upon timeout.
- The IC sends a
user-agentheader with the valueic/1.0in canister HTTPS outcalls if the canister does not provide one. - Add a management canister method for retrieving node metrics.
- Specify the resource reservation mechanism.
- Allow
in_replicated_executionsystem API method to be executed duringcanister_start. - Set the maximum depth of a delegation in a read_state response/certified variable certificate to 1.
- Canister version is guaranteed to increase if the canister's running status changes.
- Calls to frozen canisters are rejected with
SYS_TRANSIENTinstead ofCANISTER_ERROR. - Add API boundary nodes information into the certified state tree.
- Add metrics on subnet usage into the certified state tree and a new HTTP endpoint
/api/v2/subnet/<subnet_id>/read_statefor retrieving them. - Add management canister methods to support installing large WebAssembly modules split into chunks.
- Add a system API method to determine if the canister is running in replicated or non-replicated mode.
- Add a system API method to burn cycles of the canister that calls this method.
- Add a check that a canister receiving an ingress message is Running before the ingress message is marked as Received.
- Increase the maximum number of globals in a canister's WASM.
- Add per-call context performance counter.
- Update the computation of the representation-independent hash for the case of maps with nested maps.
- Remove
sendersfield from user delegations.
- Canister cycle balance cannot decrease below the freezing limit after executing
install_codeon the management canister. - System API calls
ic0.msg_caller_sizeandic0.msg_caller_copycan be called in all contexts except for (start) function. - Added note on confidentiality of values in the certified state tree.
- Update algorithm computing the request and response hash in the HTTP Gateway including clarification of when the HTTP Gateway can allow for arbitrary certification version in the canister's response.
- Update conditions on requested paths in HTTP read state requests.
- Added new query methods in the Bitcoin API.
- Added node public keys to certified state and node signatures to query call responses.
- Added a new mode for canister upgrades skipping pre-upgrade method's execution.
- IC Bitcoin API, ECDSA API, canister HTTPS outcalls API, and 128-bit cycles System API are considered stable.
- Add conditions on requested paths in read state requests.
- Add composite queries.
- Specify that the canister version is incremented upon every successful message execution except for successful message execution of a query method.
- canister version can be specified in some management canister calls (canister creation, canister code changes, canister settings changes)
- IC records canister history (canister creation, canister code changes, and canister controllers changes)
- added a new
canister_infomanagement canister call returning current module hash, current controllers, and canister history - added a new system API call
ic0.is_controller(checking if a principal is a controller of the canister) - stable memory System API calls can be invoked in the WebAssembly module
(start)function - the system API call
ic0.global_timer_setcan be invoked in canister pre-upgrade - added modeling WASM start function in the concrete
CanisterModulespecification - WebAssembly module requirements have been revised (relaxed max number of declared functions and globals, added conditions on exported functions)
- certified variables are cleared if a canister is reinstalled
- a canister having an open call context marked as deleted cannot reach Stopped state
- a desired canister ID of the canister created by
provisional_create_canister_with_cycles(in testing environments) can be specified usingspecified_id - conditions on envelope delegations have been revised (relaxed max number of delegations, restricted max number of targets per delegation, forbidden cycles in the delegation chain)
- added a new optional field
sendersin envelope delegations (restricting users to which a delegation applies) - all
/request_status/<request_id>paths must refer to the samerequest_idin aread_staterequest - IC protocol execution error conditions (such as failing
inspect_messagemethod of a canister) are returned as 200 HTTP responses with a cbor body describing the error (instead of 4xx or 5xx HTTP responses)
- Global timers
- Canister version
- Clarifications for HTTP requests & Bitcoin integration costs
- Updated HTTP request API
- Canister status available to canister
- 64-bit stable memory is no longer experimental
- HTTP request API
- Reserved principals
- Canister access to performance metrics
- Query calls are rejected when the canister is frozen
- Support for implementation-specific error codes for requests
- Deleted call contexts do not prevent canister from reaching Stopped state
- Update effective canister id checks in certificate delegations
- Formal model in Isabelle
- Idle consumption of resources in cycles per day can be obtain via
canister_statusmethod of the management canister - Include the HTTP Gateway Protocol in this spec
- Clarifications in definition of cycles consumption
- Canister cycle balances are represented by 128 bits, and no system-defined upper limit exists anymore
- Canister modules can be gzip-encoded
- Expose Wasm custom sections in the state tree
- EXPERIMENTAL: Canister API for accessing Bitcoin transactions
- EXPERIMENTAL: Canister API for threshold ECDSA signatures
- New System API which uses 128-bit values to represent the amount of cycles
- Subnet delegations include a canister id scope
- Canister heartbeat
- Terminology changes
- Support for 64-bit stable memory
- Support RSA PKCS#1 v1.5 signatures in web authentication
- Spec clarification: Fix various typos and improve textual clarity
- A canister has a set of controllers, instead of always one
- Canister Signatures are introduced
- Spec clarification: the signature in the WebAuthn scheme is prefixed by the CBOR self-identifying tag
- Cycle-depleted canisters are forcibly uninstalled
- Canister settings in
create_canisterandupdate_settings.install_codeno longer takes allocation settings. - A freezing threshold can be configured via the canister settings
- The cleanup callback is introduced
- New http v2 API that allows for stateless boundary nodes
- The system may impose limits on the number of globals and functions
- No ingress messages towards empty canisters are accepted
- No ingress messages towards
raw_randanddeposit_cyclesare accepted - A memory allocation of
0means “best effort”
- deposit_cycles(): any caller allowed
- Ingress message filtering
- Add ECDSA signatures on curve secp256k1
- Clarify that the
ic0.data_certificate_presentsystem function may be called in all contexts.
- Expose module hash and controller via
read_state
- The document is renamed to “Internet Computer Interface Spec”
- Support for raw Ed25519 keys is removed
- The default
memory_allocationbecomes unspecified
- Support for funds is scaled back to only support cycles
- The
ic0.msg_cycles_acceptsystem call now returns the actually accepted cycles - The
provisional_management calls are introduced
- The
ic0.canister_statussystem call
- Delegation between user public keys
- Certification (also removes “request-status” request)
- User authentication method based on WebAuthn is introduced
- User authentication can use ECDSA
- Public keys are DER-encoded
- Return more information in the
canister_statusmanagement call
- Anonymous requests must have the sender field set
- The
deposit_fundscall
- Inter-canister calls are now performed using a builder-like API
- Support for funds (balances and transfers)
- The anonymous user is introduced
- Forward-port changes from 0.9.3
- Users can set/update a memory allocation when installing/upgrading a canister.
- The
expiryfield is added to requests
- The management canister supports the
raw_randmethod
- Canister controllers can stop/start canisters and can query their status.
- Canister controllers can delete canisters
- Forward-port changes from 0.8.2
- Introduction of a domain separator (again)
- The calculation of “derived ids” has changed
- The self-authenticating and derived id forms use a truncated hash
- The textual representation of principals has changed
- Installing code via
reinstallworks also on the empty canister
- Reflect refined process in README and intro.
ic0.timeadded
- Revert the introduction of a domain separator
- Fix meaning-changing typos in
ic.did
- Make all canister ids system-chosen
- HTTP requests for management features are removed
- (editorial) the term “principal” is now used for the id of a canister or user, not the canister or user itself
- The signature of a request needs to be calculated using a domain separator
- Describe the
controllerattribute, add a request to change it - The IC management canister is introduced
- More tests about calls from query methods
- Bugfix: Mode should be
reinstall, notreplace
- Include section with CDDL description
- simplify versioning (only three components), skip 0.2.2 to avoid confusion with 0.2.0.2
- Clarification:
replyfield is always present - General cleanup based on front-to-back reading
- This is the first release. Subsequent releases will include a changelog.