<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.internetcomputer.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Akhi</id>
	<title>Internet Computer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.internetcomputer.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Akhi"/>
	<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/wiki/Special:Contributions/Akhi"/>
	<updated>2026-04-08T16:30:31Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Internet_Computer_wiki&amp;diff=1121</id>
		<title>Internet Computer wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Internet_Computer_wiki&amp;diff=1121"/>
		<updated>2021-11-26T08:23:51Z</updated>

		<summary type="html">&lt;p&gt;Akhi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Welcome to the Internet Computer Wiki!&amp;lt;/strong&amp;gt; Feel free to join in. All are welcome!&lt;br /&gt;
== Topics Central ==&lt;br /&gt;
&lt;br /&gt;
* [[Internet computer]]&lt;br /&gt;
* [[Internet Computer vision]]&lt;br /&gt;
* [[Index of dapps on the Internet Computer]]&lt;br /&gt;
* [[ICP token]]&lt;br /&gt;
* [[Internet Identity]]&lt;br /&gt;
* [https://dashboard.internetcomputer.org/ Internet Computer dashboard] &lt;br /&gt;
* [[Internet Computer Performance]]&lt;br /&gt;
* [[DFINITY]]&lt;br /&gt;
* [[Custody, Staking, and Voting]]&lt;br /&gt;
*[[Network Nervous System]]&lt;br /&gt;
*ICP is expected to outgrow every crypto in the known universe. ICP coins will be used to power the future of the world. &lt;br /&gt;
== For blockchain &amp;amp; crypto enthusiasts ==&lt;br /&gt;
* [[Myths and facts]]&lt;br /&gt;
* [https://www.reddit.com/r/dfinity/ r/dfinity]&lt;br /&gt;
* [[How to stake on the Internet computer]]&lt;br /&gt;
* [[Tokenomics of the Internet Computer]]&lt;br /&gt;
* [[Governance of the Internet Computer]]&lt;br /&gt;
&lt;br /&gt;
== For dapp developers ==&lt;br /&gt;
* [[Internet Computer for dapp developers]]&lt;br /&gt;
* [[Canister smart contracts]]&lt;br /&gt;
* [https://forum.dfinity.org/ IC community developer forum]&lt;br /&gt;
* [[Best practices for a high traffic dapp launch]]&lt;br /&gt;
* [[Best practices for NFT drops]]&lt;br /&gt;
* [[Current limitations of the IC]]&lt;br /&gt;
&lt;br /&gt;
== For computer scientists ==&lt;br /&gt;
* [[The Internet Computer for Computer Scientists]]&lt;br /&gt;
&lt;br /&gt;
== For node owners ==&lt;br /&gt;
* [[Internet Computer for node owners]]&lt;br /&gt;
&lt;br /&gt;
== FAQs ==&lt;br /&gt;
&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
== How-To section ==&lt;br /&gt;
How-Tos are step-by-step instructions for specific, narrow goals.&lt;br /&gt;
* [[How-To: Claim neurons for seed participants]]&lt;br /&gt;
&lt;br /&gt;
== Tutorial section ==&lt;br /&gt;
Tutorials are guided introductions to user stories, intended for first-time users and characterized by a shallow learning curve.&lt;br /&gt;
* [[Tutorial: Neuron control]]&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
&lt;br /&gt;
=== Housekeeping Rules ===&lt;br /&gt;
&lt;br /&gt;
* Please refrain from redundancy, such as referring to the Internet Computer in article titles. This is, after all, the Internet Computer Wiki.&lt;br /&gt;
* Please carefully consider your use of capitalisation. Most words in titles should be capitalised. DFINITY is always stylised in all-caps.&lt;br /&gt;
&lt;br /&gt;
=== How to Contribute ===&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
Use this page to test editing&lt;br /&gt;
* [[Test editing the Internet Computer Wiki]]&lt;br /&gt;
&lt;br /&gt;
Number of articles: {{NUMBEROFARTICLES}}&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Known_limitations_of_the_IC&amp;diff=1120</id>
		<title>Known limitations of the IC</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Known_limitations_of_the_IC&amp;diff=1120"/>
		<updated>2021-11-26T08:23:26Z</updated>

		<summary type="html">&lt;p&gt;Akhi: Akhi moved page Known limitations of the IC to Current limitations of the IC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Current limitations of the IC]]&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1119</id>
		<title>Current limitations of the Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1119"/>
		<updated>2021-11-26T08:23:26Z</updated>

		<summary type="html">&lt;p&gt;Akhi: Akhi moved page Known limitations of the IC to Current limitations of the IC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Below we list the common set of limitations that anyone developing on top of the IC should be familiar with.  The team hopes to be able to address these limitations in the future.  In some cases, it is not clear what is the best way to address the limitations and further design discussions are needed. &lt;br /&gt;
&lt;br /&gt;
== Bugs in pre_upgrade hooks ==&lt;br /&gt;
If there is a bug in your pre_upgrade hook that causes it to panic, then the canister can no longer be upgraded. This is because the pre_upgrade hook is part of the currently deployed wasm module and the system will always execute it before deploying the new wasm module and if the pre_upgrade hook fails, then the system will fail the whole upgrade.&lt;br /&gt;
&lt;br /&gt;
Currently we do not have a good mitigation around this issue other than urging developers to make sure that their pre_upgrade is bug free by doing a lot of testing.&lt;br /&gt;
&lt;br /&gt;
== Long running upgrades ==&lt;br /&gt;
Generally speaking, when a canister is being upgraded, the logic in the pre_upgrade hook serialises state from the wasm heap to stable memory and the logic in the post_upgrade hook deserialises it from stable memory back to wasm heap. There is an instructions bound on how long the upgrade process can run for. So it is possible that if the canister has too much state or the [de]serialising logic is not very efficient, then the whole process does not finish in time.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== [de]serialiser requiring additional wasm memory==&lt;br /&gt;
[https://github.com/dfinity/motoko/issues/2909 Related issue in Motoko]. Generally speaking, it is possible that the serialising logic requires some additional wasm heap to run. Let’s say that the canister has 3.5GiB of wasm heap and the serialising logic requires an additional 600MiB to serialise the data, given that the wasm heap is limited to 4GiB, the upgrade process will again fail. Note that this issue will also be present for canisters written in Rust.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to again ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== Only upgrading stopped canisters ==&lt;br /&gt;
Generally speaking, it is only safe to upgrade stopped canisters i.e. canisters that do not have any outstanding responses.  This is because it is possible that the new wasm module will not be compatible with the response that refers to an earlier state of the canister and could corrupt the current state of the canister.  The current implementation of the IC allows canisters that are not stopped to be upgraded (with the assumption being that the canister developer has taken sufficient precautions to ensure the above mentioned corruption cannot happen).&lt;br /&gt;
&lt;br /&gt;
== Calling potentially malicious or buggy canisters can prevent canisters from upgrading ==&lt;br /&gt;
If a canister can only be safely upgraded when it is stopped, it can run into the follow issue.  If a canister `A` sends a `Request` to another canister `B` and `B` is buggy or malicious, it can create a situation where it does not send a `Response` back to `A` for arbitrarily long time.  `B` can keep the call context alive if it keeps sending out `Request`s of its own.  As long as `A` has an outstanding `Response`, upgrading it may not be safe. &lt;br /&gt;
&lt;br /&gt;
== Loops in call graphs ==&lt;br /&gt;
The current implementation of the IC allows canisters to be called in a loop.  For example, A can B, B can call C, and C can call A.  There can be subtle issues when one attempts to do canister management in a loop though.  If A sends a request (Req1) to B, while processing Req1 from A, B sends a StopCanister message to stop A, the canisters will effectively deadlock.  When the StopCanister message is processed, A will be put in the Stopping state.  It will only fully stop, when it has received a response for Req1.  It will not receive a response for Req1 till B gets a response for its StopCanister message, and B will not get that response till A is stopped.&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1118</id>
		<title>Current limitations of the Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1118"/>
		<updated>2021-11-26T08:21:28Z</updated>

		<summary type="html">&lt;p&gt;Akhi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Below we list the common set of limitations that anyone developing on top of the IC should be familiar with.  The team hopes to be able to address these limitations in the future.  In some cases, it is not clear what is the best way to address the limitations and further design discussions are needed. &lt;br /&gt;
&lt;br /&gt;
== Bugs in pre_upgrade hooks ==&lt;br /&gt;
If there is a bug in your pre_upgrade hook that causes it to panic, then the canister can no longer be upgraded. This is because the pre_upgrade hook is part of the currently deployed wasm module and the system will always execute it before deploying the new wasm module and if the pre_upgrade hook fails, then the system will fail the whole upgrade.&lt;br /&gt;
&lt;br /&gt;
Currently we do not have a good mitigation around this issue other than urging developers to make sure that their pre_upgrade is bug free by doing a lot of testing.&lt;br /&gt;
&lt;br /&gt;
== Long running upgrades ==&lt;br /&gt;
Generally speaking, when a canister is being upgraded, the logic in the pre_upgrade hook serialises state from the wasm heap to stable memory and the logic in the post_upgrade hook deserialises it from stable memory back to wasm heap. There is an instructions bound on how long the upgrade process can run for. So it is possible that if the canister has too much state or the [de]serialising logic is not very efficient, then the whole process does not finish in time.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== [de]serialiser requiring additional wasm memory==&lt;br /&gt;
[https://github.com/dfinity/motoko/issues/2909 Related issue in Motoko]. Generally speaking, it is possible that the serialising logic requires some additional wasm heap to run. Let’s say that the canister has 3.5GiB of wasm heap and the serialising logic requires an additional 600MiB to serialise the data, given that the wasm heap is limited to 4GiB, the upgrade process will again fail. Note that this issue will also be present for canisters written in Rust.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to again ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== Only upgrading stopped canisters ==&lt;br /&gt;
Generally speaking, it is only safe to upgrade stopped canisters i.e. canisters that do not have any outstanding responses.  This is because it is possible that the new wasm module will not be compatible with the response that refers to an earlier state of the canister and could corrupt the current state of the canister.  The current implementation of the IC allows canisters that are not stopped to be upgraded (with the assumption being that the canister developer has taken sufficient precautions to ensure the above mentioned corruption cannot happen).&lt;br /&gt;
&lt;br /&gt;
== Calling potentially malicious or buggy canisters can prevent canisters from upgrading ==&lt;br /&gt;
If a canister can only be safely upgraded when it is stopped, it can run into the follow issue.  If a canister `A` sends a `Request` to another canister `B` and `B` is buggy or malicious, it can create a situation where it does not send a `Response` back to `A` for arbitrarily long time.  `B` can keep the call context alive if it keeps sending out `Request`s of its own.  As long as `A` has an outstanding `Response`, upgrading it may not be safe. &lt;br /&gt;
&lt;br /&gt;
== Loops in call graphs ==&lt;br /&gt;
The current implementation of the IC allows canisters to be called in a loop.  For example, A can B, B can call C, and C can call A.  There can be subtle issues when one attempts to do canister management in a loop though.  If A sends a request (Req1) to B, while processing Req1 from A, B sends a StopCanister message to stop A, the canisters will effectively deadlock.  When the StopCanister message is processed, A will be put in the Stopping state.  It will only fully stop, when it has received a response for Req1.  It will not receive a response for Req1 till B gets a response for its StopCanister message, and B will not get that response till A is stopped.&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1113</id>
		<title>Current limitations of the Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1113"/>
		<updated>2021-11-22T11:24:43Z</updated>

		<summary type="html">&lt;p&gt;Akhi: /* [de]serialiser requiring additional wasm memory */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Below we list the common set of limitations that anyone developing on top of the IC should be familiar with.  The team hopes to be able to address these limitations in the future.  In some cases, it is not clear what is the best way to address the limitations and further design discussions are needed. &lt;br /&gt;
&lt;br /&gt;
== Bugs in pre_upgrade hooks ==&lt;br /&gt;
If there is a bug in your pre_upgrade hook that causes it to panic, then the canister can no longer be upgraded. This is because the pre_upgrade hook is part of the currently deployed wasm module and the system will always execute it before deploying the new wasm module and if the pre_upgrade hook fails, then the system will fail the whole upgrade.&lt;br /&gt;
&lt;br /&gt;
Currently we do not have a good mitigation around this issue other than urging developers to make sure that their pre_upgrade is bug free by doing a lot of testing.&lt;br /&gt;
&lt;br /&gt;
== Long running upgrades ==&lt;br /&gt;
Generally speaking, when a canister is being upgraded, the logic in the pre_upgrade hook serialises state from the wasm heap to stable memory and the logic in the post_upgrade hook deserialises it from stable memory back to wasm heap. There is an instructions bound on how long the upgrade process can run for. So it is possible that if the canister has too much state or the [de]serialising logic is not very efficient, then the whole process does not finish in time.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== [de]serialiser requiring additional wasm memory==&lt;br /&gt;
[https://github.com/dfinity/motoko/issues/2909 Related issue in Motoko]. Generally speaking, it is possible that the serialising logic requires some additional wasm heap to run. Let’s say that the canister has 3.5GiB of wasm heap and the serialising logic requires an additional 600MiB to serialise the data, given that the wasm heap is limited to 4GiB, the upgrade process will again fail. Note that this issue will also be present for canisters written in Rust.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to again ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== Only upgrading stopped canisters ==&lt;br /&gt;
Generally speaking, it is only safe to upgrade stopped canisters i.e. canisters that do not have any outstanding responses.  This is because it is possible that the new wasm module will not be compatible with the response that refers to an earlier state of the canister and could corrupt the current state of the canister.  The current implementation of the IC allows canisters that are not stopped to be upgraded (with the assumption being that the canister developer has taken sufficient precautions to ensure the above mentioned corruption cannot happen).&lt;br /&gt;
&lt;br /&gt;
== Loops in call graphs ==&lt;br /&gt;
The current implementation of the IC allows canisters to be called in a loop.  For example, A can B, B can call C, and C can call A.  There can be subtle issues when one attempts to do canister management in a loop though.  If A sends a request (Req1) to B, while processing Req1 from A, B sends a StopCanister message to stop A, the canisters will effectively deadlock.  When the StopCanister message is processed, A will be put in the Stopping state.  It will only fully stop, when it has received a response for Req1.  It will not receive a response for Req1 till B gets a response for its StopCanister message, and B will not get that response till A is stopped.&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1112</id>
		<title>Current limitations of the Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1112"/>
		<updated>2021-11-22T10:55:54Z</updated>

		<summary type="html">&lt;p&gt;Akhi: /* Loops in the call graphs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Below we list the common set of limitations that anyone developing on top of the IC should be familiar with.  The team hopes to be able to address these limitations in the future.  In some cases, it is not clear what is the best way to address the limitations and further design discussions are needed. &lt;br /&gt;
&lt;br /&gt;
== Bugs in pre_upgrade hooks ==&lt;br /&gt;
If there is a bug in your pre_upgrade hook that causes it to panic, then the canister can no longer be upgraded. This is because the pre_upgrade hook is part of the currently deployed wasm module and the system will always execute it before deploying the new wasm module and if the pre_upgrade hook fails, then the system will fail the whole upgrade.&lt;br /&gt;
&lt;br /&gt;
Currently we do not have a good mitigation around this issue other than urging developers to make sure that their pre_upgrade is bug free by doing a lot of testing.&lt;br /&gt;
&lt;br /&gt;
== Long running upgrades ==&lt;br /&gt;
Generally speaking, when a canister is being upgraded, the logic in the pre_upgrade hook serialises state from the wasm heap to stable memory and the logic in the post_upgrade hook deserialises it from stable memory back to wasm heap. There is an instructions bound on how long the upgrade process can run for. So it is possible that if the canister has too much state or the [de]serialising logic is not very efficient, then the whole process does not finish in time.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== [de]serialiser requiring additional wasm memory==&lt;br /&gt;
Related issue in Motoko: GC: Reserve Wasm memory for upgrading canisters · Issue #2909 · dfinity/motoko · GitHub. Generally speaking, it is possible that the serialising logic requires some additional wasm heap to run. Let’s say that the canister has 3.5GiB of wasm heap and the serialising logic requires an additional 600MiB to serialise the data, given that the wasm heap is limited to 4GiB, the upgrade process will again fail. Note that this issue will also be present for canisters written in Rust.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to again ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== Only upgrading stopped canisters ==&lt;br /&gt;
Generally speaking, it is only safe to upgrade stopped canisters i.e. canisters that do not have any outstanding responses.  This is because it is possible that the new wasm module will not be compatible with the response that refers to an earlier state of the canister and could corrupt the current state of the canister.  The current implementation of the IC allows canisters that are not stopped to be upgraded (with the assumption being that the canister developer has taken sufficient precautions to ensure the above mentioned corruption cannot happen).&lt;br /&gt;
&lt;br /&gt;
== Loops in call graphs ==&lt;br /&gt;
The current implementation of the IC allows canisters to be called in a loop.  For example, A can B, B can call C, and C can call A.  There can be subtle issues when one attempts to do canister management in a loop though.  If A sends a request (Req1) to B, while processing Req1 from A, B sends a StopCanister message to stop A, the canisters will effectively deadlock.  When the StopCanister message is processed, A will be put in the Stopping state.  It will only fully stop, when it has received a response for Req1.  It will not receive a response for Req1 till B gets a response for its StopCanister message, and B will not get that response till A is stopped.&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1111</id>
		<title>Current limitations of the Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1111"/>
		<updated>2021-11-22T10:55:43Z</updated>

		<summary type="html">&lt;p&gt;Akhi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Below we list the common set of limitations that anyone developing on top of the IC should be familiar with.  The team hopes to be able to address these limitations in the future.  In some cases, it is not clear what is the best way to address the limitations and further design discussions are needed. &lt;br /&gt;
&lt;br /&gt;
== Bugs in pre_upgrade hooks ==&lt;br /&gt;
If there is a bug in your pre_upgrade hook that causes it to panic, then the canister can no longer be upgraded. This is because the pre_upgrade hook is part of the currently deployed wasm module and the system will always execute it before deploying the new wasm module and if the pre_upgrade hook fails, then the system will fail the whole upgrade.&lt;br /&gt;
&lt;br /&gt;
Currently we do not have a good mitigation around this issue other than urging developers to make sure that their pre_upgrade is bug free by doing a lot of testing.&lt;br /&gt;
&lt;br /&gt;
== Long running upgrades ==&lt;br /&gt;
Generally speaking, when a canister is being upgraded, the logic in the pre_upgrade hook serialises state from the wasm heap to stable memory and the logic in the post_upgrade hook deserialises it from stable memory back to wasm heap. There is an instructions bound on how long the upgrade process can run for. So it is possible that if the canister has too much state or the [de]serialising logic is not very efficient, then the whole process does not finish in time.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== [de]serialiser requiring additional wasm memory==&lt;br /&gt;
Related issue in Motoko: GC: Reserve Wasm memory for upgrading canisters · Issue #2909 · dfinity/motoko · GitHub. Generally speaking, it is possible that the serialising logic requires some additional wasm heap to run. Let’s say that the canister has 3.5GiB of wasm heap and the serialising logic requires an additional 600MiB to serialise the data, given that the wasm heap is limited to 4GiB, the upgrade process will again fail. Note that this issue will also be present for canisters written in Rust.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to again ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== Only upgrading stopped canisters ==&lt;br /&gt;
Generally speaking, it is only safe to upgrade stopped canisters i.e. canisters that do not have any outstanding responses.  This is because it is possible that the new wasm module will not be compatible with the response that refers to an earlier state of the canister and could corrupt the current state of the canister.  The current implementation of the IC allows canisters that are not stopped to be upgraded (with the assumption being that the canister developer has taken sufficient precautions to ensure the above mentioned corruption cannot happen).&lt;br /&gt;
&lt;br /&gt;
== Loops in the call graphs ==&lt;br /&gt;
The current implementation of the IC allows canisters to be called in a loop.  For example, A can B, B can call C, and C can call A.  There can be subtle issues when one attempts to do canister management in a loop though.  If A sends a request (Req1) to B, while processing Req1 from A, B sends a StopCanister message to stop A, the canisters will effectively deadlock.  When the StopCanister message is processed, A will be put in the Stopping state.  It will only fully stop, when it has received a response for Req1.  It will not receive a response for Req1 till B gets a response for its StopCanister message, and B will not get that response till A is stopped.&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1110</id>
		<title>Current limitations of the Internet Computer</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Current_limitations_of_the_Internet_Computer&amp;diff=1110"/>
		<updated>2021-11-22T10:42:48Z</updated>

		<summary type="html">&lt;p&gt;Akhi: Created page with &amp;quot;Below we list the common set of limitations that anyone developing on top of the IC should be familiar with.  The team hopes to be able to address these limitations in the fut...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Below we list the common set of limitations that anyone developing on top of the IC should be familiar with.  The team hopes to be able to address these limitations in the future.  In some cases, it is not clear what is the best way to address the limitations and further design discussions are needed. &lt;br /&gt;
&lt;br /&gt;
== Bugs in pre_upgrade hooks ==&lt;br /&gt;
If there is a bug in your pre_upgrade hook that causes it to panic, then the canister can no longer be upgraded. This is because the pre_upgrade hook is part of the currently deployed wasm module and the system will always execute it before deploying the new wasm module and if the pre_upgrade hook fails, then the system will fail the whole upgrade.&lt;br /&gt;
&lt;br /&gt;
Currently we do not have a good mitigation around this issue other than urging developers to make sure that their pre_upgrade is bug free by doing a lot of testing.&lt;br /&gt;
&lt;br /&gt;
== Long running upgrades ==&lt;br /&gt;
Generally speaking, when a canister is being upgraded, the logic in the pre_upgrade hook serialises state from the wasm heap to stable memory and the logic in the post_upgrade hook deserialises it from stable memory back to wasm heap. There is an instructions bound on how long the upgrade process can run for. So it is possible that if the canister has too much state or the [de]serialising logic is not very efficient, then the whole process does not finish in time.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;br /&gt;
&lt;br /&gt;
== [de]serialiser requiring additional wasm memory==&lt;br /&gt;
Related issue in Motoko: GC: Reserve Wasm memory for upgrading canisters · Issue #2909 · dfinity/motoko · GitHub. Generally speaking, it is possible that the serialising logic requires some additional wasm heap to run. Let’s say that the canister has 3.5GiB of wasm heap and the serialising logic requires an additional 600MiB to serialise the data, given that the wasm heap is limited to 4GiB, the upgrade process will again fail. Note that this issue will also be present for canisters written in Rust.&lt;br /&gt;
&lt;br /&gt;
The recommended mitigation here is to again ensure that the state that needs to be persisted across upgrades does not exceed what the canister can [de]serialise during the upgrade process.&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
	<entry>
		<id>https://wiki.internetcomputer.org/w/index.php?title=Best_practices_for_a_high_traffic_dapp_launch&amp;diff=1022</id>
		<title>Best practices for a high traffic dapp launch</title>
		<link rel="alternate" type="text/html" href="https://wiki.internetcomputer.org/w/index.php?title=Best_practices_for_a_high_traffic_dapp_launch&amp;diff=1022"/>
		<updated>2021-11-17T08:33:41Z</updated>

		<summary type="html">&lt;p&gt;Akhi: Start describing stress testing.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
&lt;br /&gt;
==Starting the project==&lt;br /&gt;
&lt;br /&gt;
===Choosing a programming language===&lt;br /&gt;
&lt;br /&gt;
====Motoko====&lt;br /&gt;
&lt;br /&gt;
====Rust====&lt;br /&gt;
&lt;br /&gt;
==Writing the dapp==&lt;br /&gt;
&lt;br /&gt;
==Getting help==&lt;br /&gt;
&lt;br /&gt;
There are few resources where developers get help while building a dapp:&lt;br /&gt;
&lt;br /&gt;
* [https://forum.dfinity.org/ Developer forum]&lt;br /&gt;
* Developer Discord&lt;br /&gt;
&lt;br /&gt;
==Testing the dapp==&lt;br /&gt;
&lt;br /&gt;
=== Stress testing ===&lt;br /&gt;
The IC does not have a testnet.  Instead developers are encouraged to use the mainnet for test purposes.  Before developers deploy the production ready dapp to mainnet and enable access to it to the world, they should first deploy test versions to mainnet.  They should then stress it by emulating the anticipated load on it and see how well the dapp and the platform in general fares.  If the desired performance is not achieved, developers are encouraged to get help by using the links provided above.  Often times, the desired performance can be achieved by performing minor tweaks to the dapps.  &lt;br /&gt;
&lt;br /&gt;
==Deploying the dapp==&lt;br /&gt;
&lt;br /&gt;
==Launching the dapp to the world==&lt;br /&gt;
&lt;br /&gt;
==Monitoring the dapp==&lt;br /&gt;
&lt;br /&gt;
==Lessons from past launches==&lt;br /&gt;
&lt;br /&gt;
# Use most recent Motoko version&lt;br /&gt;
Motoko is a language being actively developed so it is recommended to use the latest version of Motoko to get maximal stability and performance.&lt;/div&gt;</summary>
		<author><name>Akhi</name></author>
	</entry>
</feed>