For AI agents: Documentation index at /llms.txt

Skip to content

IC interface spec changelog

  • New management canister endpoint subnet_metrics returning subnet-wide metrics for a given subnet: the latest certified height, the number of canisters, the total canister state size, the total cycles consumed, and the total number of processed transactions. All fields except the certified height were previously only readable by external users via the certified state tree path /subnet/<subnet_id>/metrics. The API is EXPERIMENTAL.
  • New optional permissions field in request delegations restricting the kinds of requests the delegation applies for: the value "queries" restricts the delegation to query calls and read_state requests, 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 the permissions field are not accepted.
  • wasm_memory_threshold in canister settings is now bounded by 248, analogously to wasm_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 with CANISTER_ERROR and all attached cycles are refunded. Ingress messages and self-calls are not affected.
  • Support for the HTTP method PATCH in canister http_request in non-replicated mode.
  • Inter-canister response callback messages might still be executed after the condition for canister_on_low_wasm_memory is triggered and before the function canister_on_low_wasm_memory is 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_engine are 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_info field of the user HTTP request and available to the callee via new system API ic0.msg_caller_info_data_size, ic0.msg_caller_info_data_copy, ic0.msg_caller_info_signer_size, and ic0.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 PUT and DELETE in canister http_request in 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_snapshot can uninstall code atomically after taking canister snapshot.
  • The canister system API ic0.msg_reject_code is available in cleanup callbacks.
  • New execution context TQ for 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_status can 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, and ic0.env_var_value_size).
  • Management canister API for downloading and uploading canister snapshots.
  • The management canister method canister_status returns two new fields: version indicating the canister version, and ready_for_migration indicating whether a canister’s queues are empty and its streams flushed. The value only makes sense when the canister status is stopped.
  • 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_ranges in the state tree, facilitating fragmentation due to canister migration.
  • The management canister method subnet_info returns a new field registry_version providing 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_balance128 returning 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_memory invoked when the canister is low on main memory according to a new wasm_memory_threshold in 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, and ic0.cost_vetkd_derive_encrypted_key for cycles cost calculation.
  • New field memory_metrics providing detailed metrics on the memory consumption of a canister in the response of the management canister’s canister_status endpoint.
  • New system API ic0.subnet_self_size and ic0.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_persistence option for canister upgrades.
  • Rename num_blocks_total to num_blocks_proposed_total in 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_query and bitcoin_get_utxos_query.
  • Wrap chunk hash for install chunked code in a record and rename storage_canister to store_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-agent header with the value ic/1.0 in 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_execution system API method to be executed during canister_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_TRANSIENT instead of CANISTER_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_state for 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 senders field from user delegations.
  • Canister cycle balance cannot decrease below the freezing limit after executing install_code on the management canister.
  • System API calls ic0.msg_caller_size and ic0.msg_caller_copy can 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_info management 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_set can be invoked in canister pre-upgrade
  • added modeling WASM start function in the concrete CanisterModule specification
  • 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 using specified_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 senders in envelope delegations (restricting users to which a delegation applies)
  • all /request_status/<request_id> paths must refer to the same request_id in a read_state request
  • IC protocol execution error conditions (such as failing inspect_message method 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_status method 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_canister and update_settings. install_code no 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_rand and deposit_cycles are accepted
  • A memory allocation of 0 means “best effort”
  • deposit_cycles(): any caller allowed
  • Ingress message filtering
  • Add ECDSA signatures on curve secp256k1
  • Clarify that the ic0.data_certificate_present system 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_allocation becomes unspecified
  • Support for funds is scaled back to only support cycles
  • The ic0.msg_cycles_accept system call now returns the actually accepted cycles
  • The provisional_ management calls are introduced
  • The ic0.canister_status system 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_status management call
  • Anonymous requests must have the sender field set
  • The deposit_funds call
  • 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 expiry field is added to requests
  • The management canister supports the raw_rand method
  • 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 reinstall works also on the empty canister
  • Reflect refined process in README and intro.
  • ic0.time added
  • 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 controller attribute, add a request to change it
  • The IC management canister is introduced
  • More tests about calls from query methods
  • Bugfix: Mode should be reinstall, not replace
  • Include section with CDDL description
  • simplify versioning (only three components), skip 0.2.2 to avoid confusion with 0.2.0.2
  • Clarification: reply field is always present
  • General cleanup based on front-to-back reading
  • This is the first release. Subsequent releases will include a changelog.