<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog</id>
    <title>Internet Computer Blog</title>
    <updated>2025-09-16T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog"/>
    <subtitle>Internet Computer Blog</subtitle>
    <icon>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/img/favicon-32x32.png</icon>
    <entry>
        <title type="html"><![CDATA[New ICP Developer Newsletter]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/09/16/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/09/16/news-and-updates/update"/>
        <updated>2025-09-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today marks the final edition of the developer weekly update blog. We invite you to subscribe to the ICP Dev News instead.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 16, 2025" src="/assets/images/dev-update-blog-sept-16-945729a5dfa900cb48192f850992b6cc.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this final edition of the developer weekly update blog.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-newsletter">New Newsletter<a href="#new-newsletter" class="hash-link" aria-label="Direct link to New Newsletter" title="Direct link to New Newsletter">​</a></h2><p>We have created a new developer newsletter to keep you up to date with developer news. Subscribe to keep receiving updates.</p><p>Use the link below to sign up. If you already subscribe to the DFINITY newsletter and want to receive this new newsletter, please update your preferences.</p><p><a href="https://dfinity.us16.list-manage.com/subscribe?u=33c727489e01ff5b6e1fb6cc6&amp;id=7e9469a315" target="_blank" rel="noopener noreferrer">Subscribe to the new ICP Dev News newsletter</a></p><p>Thank you for following the weekly updates. We look forward to sharing more exciting news with you in the new newsletter.</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 25, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/06/25/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/06/25/news-and-updates/update"/>
        <updated>2025-06-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there's an exciting proposal to launch 30 new subnets on the network, an upcoming event for Caffeine's Alpha launch, and a beta release candidate for Azle v0.32.0.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 25, 2025" src="/assets/images/dev-update-blog-june-25-75e9ed6e18f598eb993a94346a281087.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there's an exciting proposal to launch 30 new subnets on the network, an upcoming event for Caffeine's Alpha launch, and a beta release candidate for Azle v0.32.0. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="proposal-30-new-subnets">Proposal: 30 new subnets<a href="#proposal-30-new-subnets" class="hash-link" aria-label="Direct link to Proposal: 30 new subnets" title="Direct link to Proposal: 30 new subnets">​</a></h2><p>In preparation for the upcoming Caffeine AI release, DFINITY is proposing an expansion of the network that will increase the number of application subnets from 30 to 60, ensuring ICP can support both current traffic and future growth.</p><p>The rollout would take place gradually over the coming weeks, with an initial analysis that indicates the network has enough spare capacity to support the additional subnets.</p><p><a href="https://forum.dfinity.org/t/adjusting-target-topology-for-caffeine-scaling-60-application-subnets-and-a-us-subnet/51540" target="_blank" rel="noopener noreferrer">Learn more on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="hello-self-writing-internet-event">Hello, self-writing internet event<a href="#hello-self-writing-internet-event" class="hash-link" aria-label="Direct link to Hello, self-writing internet event" title="Direct link to Hello, self-writing internet event">​</a></h2><p>On July 15th, 2025, join a full-day event in San Francisco (or livestreamed globally) dedicated to exploring the "self-writing internet" with Caffeine, the first tech stack built entirely for AI-driven, conversation-based development. Spanning three interactive floors, the event welcomes AI enthusiasts, developers, and visionaries to experience:</p><ul><li><p>Keynotes, demos, and panels on the Main Stage</p></li><li><p>Hands-on coding and collaboration during the Caffeine Hackathon</p></li><li><p>Relaxed networking over specialty drinks and immersive visuals.</p></li></ul><p><a href="https://lu.ma/hello-swi" target="_blank" rel="noopener noreferrer">Register for the event</a> to make sure you don't miss it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="azle-v0320-release-candidate">Azle v0.32.0 release candidate<a href="#azle-v0320-release-candidate" class="hash-link" aria-label="Direct link to Azle v0.32.0 release candidate" title="Direct link to Azle v0.32.0 release candidate">​</a></h2><p>Azle has officially moved from beta to the release candidate phase with version 0.32.0, marking a major step toward its 1.0 release. This milestone reflects growing confidence from Demergent Labs in Azle's stability, performance, and suitability for general-purpose TypeScript or JavaScript canisters on ICP.</p><p>Azle is not yet fully recommended for production use. Upcoming changes will focus on testing, documentation, security reviews, and cleanup, with minimal alterations to the codebase.</p><p><a href="https://x.com/lastmjs/status/1937865438836519246" target="_blank" rel="noopener noreferrer">Read more on Twitter</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 18, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/06/18/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/06/18/news-and-updates/update"/>
        <updated>2025-06-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there are new releases of the stable-structures library and Canbench, plus a new feature for auto-adding cycles to calls to the management canister.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 18, 2025" src="/assets/images/dev-update-blog-june-18-b2d19b6d4b426f6de8ed723e8a482c1b.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there are new releases of the <code>stable-structures</code> library and Canbench, plus a new feature for auto-adding cycles to calls to the management canister. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="stable-structures-v069"><code>stable-structures</code> v0.6.9<a href="#stable-structures-v069" class="hash-link" aria-label="Direct link to stable-structures-v069" title="Direct link to stable-structures-v069">​</a></h2><p>A new release of the <code>stable-structures</code> library has been published! This release includes dozens of changes and updates. Here are some of the highlights:</p><ul><li><p>Performance improvements for read-heavy cases other smaller performance upgrades.</p></li><li><p>New BTreeSet structure.</p></li><li><p>Initial publication of the Stable Structures Book.</p></li><li><p>Improved benchmarks.</p></li><li><p>CI and codebase improvements.</p></li></ul><p><a href="https://github.com/dfinity/stable-structures/releases/tag/v0.6.9" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="canbench-v020">Canbench v0.2.0<a href="#canbench-v020" class="hash-link" aria-label="Direct link to Canbench v0.2.0" title="Direct link to Canbench v0.2.0">​</a></h2><p>Alongside the new <code>stable-structures</code> library, a new version of Canbench has also been released. Highlights of <code>v0.2.0</code> include:</p><ul><li><p>Cleaner benchmark output.</p></li><li><p>Summary reports that show final status, total benchmarks, improvements, regressions, etc.</p></li><li><p>Support for CSV reports through <code>--csv</code> flag.</p></li><li><p>GitHub CI integration scripts.</p></li></ul><p><a href="https://forum.dfinity.org/t/canbench-0-2-0-released-improved-output-ci-integration-and-a-breaking-change/50511" target="_blank" rel="noopener noreferrer">Read the full details on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="automatic-cycles-attachment-to-management-canister-calls">Automatic cycles attachment to management canister calls<a href="#automatic-cycles-attachment-to-management-canister-calls" class="hash-link" aria-label="Direct link to Automatic cycles attachment to management canister calls" title="Direct link to Automatic cycles attachment to management canister calls">​</a></h2><p>Motoko package <code>ic</code> v2.1.0 has an exciting new feature: Automatic cycle calculation!</p><p>For example, instead of hardcoding cycles amounts:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">await</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token keyword" style="color:#EB318A">with</span><span class="token plain"> cycles </span><span class="token operator">=</span><span class="token plain"> 230_949_972_000</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> IC</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">http_request</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#F1EEF5">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Now, you can use:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> IC </span><span class="token string" style="color:#F68E5F">"mo:ic/Call"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">await</span><span class="token plain"> IC</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">httpRequest</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#F1EEF5">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>This will calculate the minimum amount of cycles needed and automatically attach them to the call.</p><p><a href="https://mops.one/ic/docs/Call" target="_blank" rel="noopener noreferrer">Learn more in the <code>ic</code> Mops package documentation</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 11, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/06/11/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/06/11/news-and-updates/update"/>
        <updated>2025-06-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a new release of Motoko, the production key release for vetKeys, and proposed new management canister endpoints to support sleeping in update calls.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 11, 2025" src="/assets/images/dev-update-blog-june-11-95e5afce8fc97fb280f14976cc8bef2c.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a new release of Motoko, the production key release for vetKeys, and proposed new management canister endpoints to support sleeping in update calls. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v01412">Motoko v0.14.12<a href="#motoko-v01412" class="hash-link" aria-label="Direct link to Motoko v0.14.12" title="Direct link to Motoko v0.14.12">​</a></h2><p>A new version of Motoko has been released! The new version, <code>v0.14.12</code>, includes:</p><ul><li><p>Optimizations for <code>--enhanced-orthogonal-persistence</code>.</p></li><li><p>Bug fixes for <code>-fshared-code</code> and stack overflow prevention for large EOP canisters.</p></li><li><p><code>rootKey</code> primitive has been added.</p></li></ul><p><a href="https://github.com/dfinity/motoko/releases/tag/0.14.12" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="vetkeys-production-key-release">vetKeys production key release<a href="#vetkeys-production-key-release" class="hash-link" aria-label="Direct link to vetKeys production key release" title="Direct link to vetKeys production key release">​</a></h2><p>vetKeys has been in testing for the past several weeks on the <code>2fq7c</code> and <code>fuqsr</code> subnets. Testing has been successful and workflows such as end-to-end key derivation have been validated.</p><p>Therefore, it is now proposed to generate a production key to be used with vetKeys. The production key will be held on subnet <code>pzp6e</code>, the same subnet that holds the production ECDSA and Schnorr keys.</p><p>As part of the proposal, the production key must be backed up to another subnet. During this backup, the subnet must be temporarily paused. The subnet that will be paused, <code>uzr34</code>, also hosts the Internet Identity canister, meaning Internet Identity will be unavailable for approximately 5-10 minutes.</p><p><a href="https://forum.dfinity.org/t/vetkeys-production-key-and-ii-subnet-downtime/50370" target="_blank" rel="noopener noreferrer">Learn more about the proposed production key and important notes about the scheduled downtime</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="proposal-for-new-management-canister-endpoints">Proposal for new management canister endpoints<a href="#proposal-for-new-management-canister-endpoints" class="hash-link" aria-label="Direct link to Proposal for new management canister endpoints" title="Direct link to Proposal for new management canister endpoints">​</a></h2><p>To support sleeping during update calls, two new management canister endpoints have been proposed. These endpoints would be:</p><ul><li><p><code>observe</code>: Introduces an <code>await</code> condition. This endpoint would only be called by a controller of a given canister or the canister itself. It would only be called through bounded-wait calls.</p></li><li><p><code>notify</code>: Used to notify callers of the <code>observe</code> endpoint of the number of pending calls with a matching canister ID and event ID. This endpoint would only be called by a controller of a given canister or the canister itself. </p></li></ul><p><a href="https://forum.dfinity.org/t/sleeping-in-update-calls/50345" target="_blank" rel="noopener noreferrer">Read more about the proposal and view examples of how they may be implemented</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 4, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/06/04/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/06/04/news-and-updates/update"/>
        <updated>2025-06-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a new ic-cdk release, a new feature from the CycleOps platform, and a recap of the World Computer Summit 2025.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 4, 2025" src="/assets/images/dev-update-blog-june-4-f719246387f83b68b7456354004f26a8.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a new <code>ic-cdk</code> release, a new feature from the CycleOps platform, and a recap of the World Computer Summit 2025. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ic-cdk-v0183">ic-cdk v0.18.3<a href="#ic-cdk-v0183" class="hash-link" aria-label="Direct link to ic-cdk v0.18.3" title="Direct link to ic-cdk v0.18.3">​</a></h2><p>A new release of the <code>ic-cdk</code> has been released. Version 0.18.3 introduces support for the <code>root_key</code> API and updates the Bitcoin regtest settings to mirror those used on the mainnet. There are also a few updates to address corner case issues from the <code>0.18.2</code> release.</p><p>Read the full release notes on the <a href="https://forum.dfinity.org/t/ic-cdk-0-18-3-released/49637" target="_blank" rel="noopener noreferrer">developer forum</a> and read the <a href="https://github.com/dfinity/cdk-rs/blob/0.18.3/ic-cdk/V18_GUIDE.md" target="_blank" rel="noopener noreferrer">migration guide</a> if you are updating from <code>0.17</code> or older.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-cycleops-feature">New CycleOps feature<a href="#new-cycleops-feature" class="hash-link" aria-label="Direct link to New CycleOps feature" title="Direct link to New CycleOps feature">​</a></h2><p>A new CycleOps feature has been released! Creating new canisters has never been easier. Now, forget about cycle wallets or <code>dfx canister create</code> commands. Through the <a href="https://cycleops.dev" target="_blank" rel="noopener noreferrer">CycleOps</a> dashboard, use a few clicks to select a subnet and create a new canister. All canisters created with this workflow automatically come configured with cycle monitoring, email metric reports, and canister management.</p><p><a href="https://forum.dfinity.org/t/create-canisters-easier-than-ever/49642" target="_blank" rel="noopener noreferrer">Learn more on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="world-computer-summit--caffeine-demo">World Computer Summit &amp; Caffeine demo<a href="#world-computer-summit--caffeine-demo" class="hash-link" aria-label="Direct link to World Computer Summit &amp; Caffeine demo" title="Direct link to World Computer Summit &amp; Caffeine demo">​</a></h2><p>The World Computer Summit 2025 took place on June 3rd and celebrated ICP's 4th birthday. The day was filled with exciting panels, ecosystem demos, and meaningful networking opportunities.</p><p>To close out the event, Dominic Williams presented a demo of Caffeine, a long-awaited AI project for creating and deploying canister smart contracts. The demo was live-streamed on X, which you can watch <a href="https://x.com/caffeineai/status/1930228469004210221" target="_blank" rel="noopener noreferrer">here</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 28, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/05/28/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/05/28/news-and-updates/update"/>
        <updated>2025-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there are new documentation pages on the vetKeys feature, an update on the Solana RPC canister, and a request for feedback from the community.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 28, 2025" src="/assets/images/dev-update-blog-may-28-d0c432f98813d7abd8433344891d4aab.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there are new documentation pages on the vetKeys feature, an update on the Solana RPC canister, and a request for feedback from the community. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="vetkeys-documentation">vetKeys documentation<a href="#vetkeys-documentation" class="hash-link" aria-label="Direct link to vetKeys documentation" title="Direct link to vetKeys documentation">​</a></h2><p>Documentation for the new vetKeys feature has been published! Dive into the new feature and learn about different use cases through these new pages:</p><ul><li><p><a href="/building-apps/network-features/vetkeys/introduction">What are vetKeys?</a> Learn about what vetKeys are, their benefits and use cases, and examples of applications that utilize them.</p></li><li><p><a href="/building-apps/network-features/vetkeys/api">vetKD API</a>: Reference documentation for the vetKeys API endpoints.</p></li><li><p><a href="/building-apps/network-features/vetkeys/dkms">Distributed key management service</a>: Learn about the ready-to-use KeyManager solution that offers access control and vetKey derivation.</p></li><li><p><a href="/building-apps/network-features/vetkeys/encrypted-onchain-storage">Encrypted onchain storage</a>: Learn about the ready-to-use EncryptedMaps solution for encrypted onchain storage.</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sol-rpc-canister">SOL RPC canister<a href="#sol-rpc-canister" class="hash-link" aria-label="Direct link to SOL RPC canister" title="Direct link to SOL RPC canister">​</a></h2><p>The Solana RPC canister is ready for testing on the mainnet! At a very high level, the SOL RPC canister offers the same services to canisters as if a Solana RPC node were directly available on the ICP mainnet.</p><p>Check out the <a href="https://github.com/dfinity/sol-rpc-canister/blob/main/README.md" target="_blank" rel="noopener noreferrer">SOL RPC canister README</a> for detailed usage instructions, including how to query data and how to sign and submit SOL transactions.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="request-for-feedback-icrc-103-query-allowances-on-the-icp-ledger">Request for feedback: ICRC-103 (query allowances) on the ICP ledger<a href="#request-for-feedback-icrc-103-query-allowances-on-the-icp-ledger" class="hash-link" aria-label="Direct link to Request for feedback: ICRC-103 (query allowances) on the ICP ledger" title="Direct link to Request for feedback: ICRC-103 (query allowances) on the ICP ledger">​</a></h2><p>Attention developers! We're asking for your feedback regarding ICRC-103 (query allowances) on the ICP ledger. </p><p>Do you a practical, minimal path that solves immediate concerns while preserving privacy and stability, or do you think it’s worth pushing toward ICRC-103 compliance, even with the limitations and transitional pain?</p><p>Read all the details and give your input on the <a href="https://forum.dfinity.org/t/standard-for-managing-icrc-2-approvals-a-challenge-for-the-icp-ledger/32997/13?u=marc0olo" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 21, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/05/21/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/05/21/news-and-updates/update"/>
        <updated>2025-05-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a new release of Motoko, a new release of the ICP dashboard, AMD SEV virtual machine support, and a community survey about Bitcoin testnet usage.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 21, 2025" src="/assets/images/dev-update-blog-may-21-53765299de3f745d18c87b63ce05eb12.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a new release of Motoko, a new release of the ICP dashboard, AMD SEV virtual machine support, and a community survey about Bitcoin testnet usage. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko--v01411">Motoko  <code>v0.14.11</code><a href="#motoko--v01411" class="hash-link" aria-label="Direct link to motoko--v01411" title="Direct link to motoko--v01411">​</a></h2><p>A new release of Motoko is available! In this version, there are:</p><ul><li><p>Enhancements to syntax error messages with examples.</p></li><li><p>Functionality for fields in the language server.</p></li><li><p>A bug fix where <code>mo-doc</code> now correctly extracts record-patterned function arguments.</p></li></ul><p><a href="https://github.com/dfinity/motoko/releases/tag/0.14.11" target="_blank" rel="noopener noreferrer">Read more in the release notes.</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dashboard-release-v603">Dashboard release <code>v6.0.3</code><a href="#dashboard-release-v603" class="hash-link" aria-label="Direct link to dashboard-release-v603" title="Direct link to dashboard-release-v603">​</a></h2><p>A new version of the ICP dashboard has been released. New features include:</p><ul><li><p>Improved navigation bar.</p></li><li><p>Upgraded NextJS</p></li><li><p>Row-level clicking for the ICP transaction table.</p></li><li><p>Token page URL updates.</p></li><li><p>Cycle burn rate has been added to the home page.</p></li></ul><p><a href="https://dashboard.internetcomputer.org/" target="_blank" rel="noopener noreferrer">Check out the ICP dashboard to view these changes.</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="amd-sev-virtual-machine-support">AMD SEV virtual machine support<a href="#amd-sev-virtual-machine-support" class="hash-link" aria-label="Direct link to AMD SEV virtual machine support" title="Direct link to AMD SEV virtual machine support">​</a></h2><p>AMD SEV virtual machine support is coming soon! SEV can be used to create encryption keys that protect a node’s state. These keys are connected to the hash of the running replica code and cannot be taken out of the replica’s virtual machine. That means that when there’s a new release with a different hash, it won’t be able to read the state from the previous release.</p><p>To support SEV, the replica upgrade workflow must be redesigned to allow securely sharing encryption keys between community-approved releases. The release process also needs to be extended to support computing SEV hashes for each release, meaning the NNS registry will need to be modified to store that additional information.</p><p><a href="https://forum.dfinity.org/t/amd-sev-virtual-machine-support/6156/65?u=marc0olo" target="_blank" rel="noopener noreferrer">Learn more on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bitcoin-usage-survey">Bitcoin usage survey<a href="#bitcoin-usage-survey" class="hash-link" aria-label="Direct link to Bitcoin usage survey" title="Direct link to Bitcoin usage survey">​</a></h2><p>Attention, devs! We're asking for your feedback regarding how you utilize Bitcoin testnets during your ICP development. Please fill out the following survey to help us evaluate the testnet options that are available to developers:</p><p><a href="http://bit.ly/3GYpfRp" target="_blank" rel="noopener noreferrer">http://bit.ly/3GYpfRp</a></p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 14, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/05/14/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/05/14/news-and-updates/update"/>
        <updated>2025-05-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there are new releases of PocketIC, dfx, and Juno, and the launch of vetKeys on the mainnet for testing.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 14, 2025" src="/assets/images/dev-update-blog-may-14-3ad9825d2481bf613db4572b870290b7.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there are new releases of PocketIC, <code>dfx</code>, and Juno, and the launch of vetKeys on the mainnet for testing. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pocketic-v901">PocketIC v9.0.1<a href="#pocketic-v901" class="hash-link" aria-label="Direct link to PocketIC v9.0.1" title="Direct link to PocketIC v9.0.1">​</a></h2><p>A new release of PocketIC is available! This version focuses on a new feature that supports reusing PocketIC state in tests. Additional changes include:</p><ul><li><p>New type for time that ensures nanosecond precision.</p></li><li><p>VetKD support.</p></li><li><p>The Rust library has been upgraded to use the <code>ic-management-canister-types</code> crate <code>v0.3.0</code>.</p></li></ul><p><a href="https://github.com/dfinity/ic/blob/f195ba756bc3bf170a2888699e5e74101fdac6ba/rs/pocket_ic_server/CHANGELOG.md#901---2025-04-30" target="_blank" rel="noopener noreferrer">View the changelog for the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0261"><code>dfx</code> v0.26.1<a href="#dfx-v0261" class="hash-link" aria-label="Direct link to dfx-v0261" title="Direct link to dfx-v0261">​</a></h2><p>The latest version of <code>dfx</code> (<code>v0.26.1</code>) is now promoted! This release includes bug fixes and the latest Motoko compiler <code>v0.14.8</code>.</p><p>The next release of <code>dfx</code> will remove the local replica in favor of PocketIC.</p><p><a href="https://github.com/dfinity/sdk/releases/tag/0.26.1" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="juno-v0049">Juno v0.0.49<a href="#juno-v0049" class="hash-link" aria-label="Direct link to Juno v0.0.49" title="Direct link to Juno v0.0.49">​</a></h2><p>A new release of Juno introduces new updates to the Console UI, including the addition of a new subsection of 'Monitoring' called 'Health Check' and a clearer breakdown of memory metrics.</p><p>The description of "auto-refill threshold" has been improved, and the hosting wizard's "authorization domain" step has been simplified.</p><p><a href="https://forum.dfinity.org/t/latest-juno-releases/36771/28" target="_blank" rel="noopener noreferrer">Read more on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="vetkeys-launch-on-the-mainnet-for-testing">vetKeys launch on the mainnet for testing!<a href="#vetkeys-launch-on-the-mainnet-for-testing" class="hash-link" aria-label="Direct link to vetKeys launch on the mainnet for testing!" title="Direct link to vetKeys launch on the mainnet for testing!">​</a></h2><p>The vetKeys feature has been launched on the mainnet for testing purposes!</p><p>To launch the feature, a test vetKD master key was created when <a href="https://dashboard.internetcomputer.org/proposal/136589" target="_blank" rel="noopener noreferrer">proposal 136589</a> was accepted. This key is stored on the 13-node application subnet <code>2fq7c</code>.</p><p>vetKeys functionality on the mainnet enables extensive testing of vetKeys on the mainnet, including operational procedures like key backup and recovery.</p><p>It is important to note that at this time, the vetKey feature is strictly intended for testing purposes, as it is still undergoing internal audits and security reviews. It should not be used in production, and it is strongly recommended to limit its use to non-critical testing scenarios only.</p><p><a href="https://forum.dfinity.org/t/threshold-key-derivation-privacy-on-the-ic/16560/206?u=marc0olo" target="_blank" rel="noopener noreferrer">Learn more on the developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 7, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/05/07/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/05/07/news-and-updates/update"/>
        <updated>2025-05-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there are new releases of the ICP and ICRC Rosetta containers and information about this year's World Computer Summit.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 7, 2025" src="/assets/images/dev-update-blog-may-7-5ebe08120b2d7ec5ec1b25bb3399b430.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there are new releases of the ICP and ICRC Rosetta containers and information about this year's World Computer Summit. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-rosetta-v214">ICP Rosetta v2.1.4<a href="#icp-rosetta-v214" class="hash-link" aria-label="Direct link to ICP Rosetta v2.1.4" title="Direct link to ICP Rosetta v2.1.4">​</a></h2><p>A new version of the ICP Rosetta container is available! Notable updates in this release include:</p><ul><li><p>Improvements to the container's reliability.</p></li><li><p>Watchdog threats now guarantee synchronization threads are not stuck.</p></li><li><p>Improved metrics.</p></li><li><p>Tip validation delay handling has been enhanced.</p></li></ul><p><a href="https://forum.dfinity.org/t/rosetta-icp-and-icrc1-updates/46512" target="_blank" rel="noopener noreferrer">Read more on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icrc-rosetta-v121">ICRC Rosetta v1.2.1<a href="#icrc-rosetta-v121" class="hash-link" aria-label="Direct link to ICRC Rosetta v1.2.1" title="Direct link to ICRC Rosetta v1.2.1">​</a></h2><ul><li><p>Connects with multiple ledgers in a single instance.</p></li><li><p>Exports per-token metrics in <code>/metrics</code>.</p></li><li><p>A new algorithm is used to check for gaps.</p></li><li><p>Watchdog threats now guarantee synchronization threads are not stuck.</p></li></ul><p><a href="https://forum.dfinity.org/t/rosetta-icp-and-icrc1-updates/46512" target="_blank" rel="noopener noreferrer">Read more on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="world-computer-summit-2025">World Computer Summit 2025<a href="#world-computer-summit-2025" class="hash-link" aria-label="Direct link to World Computer Summit 2025" title="Direct link to World Computer Summit 2025">​</a></h2><p>The annual World Computer Summit will take place in Zurich on June 3rd, 2025! This will be the 4th annual summit and will feature several exciting discussions and presentations. You can register on the <a href="https://lu.ma/wcs25" target="_blank" rel="noopener noreferrer">World Summit event page</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 30, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/30/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/30/news-and-updates/update"/>
        <updated>2025-04-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there are new releases of Motoko, Python pocket-ic, and the ICP dashboard, plus an exciting pre-release of the SOL RPC canister.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="April 30, 2025" src="/assets/images/dev-update-blog-april-30-1876cd13685103d20ae942c0c7484d42.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there are new releases of Motoko, Python pocket-ic, and the ICP dashboard, plus an exciting pre-release of the SOL RPC canister. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0149">Motoko v0.14.9<a href="#motoko-v0149" class="hash-link" aria-label="Direct link to Motoko v0.14.9" title="Direct link to Motoko v0.14.9">​</a></h2><p>A new release of Motoko is available! v0.14.9 introduces new primitives for exploding fixed-width numbers to bytes:</p><ul><li><p><code>explodeNat16</code></p></li><li><p><code>explodeInt16</code></p></li><li><p><code>explodeNat32</code></p></li><li><p><code>explodeInt32</code></p></li><li><p><code>explodeNat64</code></p></li><li><p><code>explodeInt64</code></p></li></ul><p><a href="https://github.com/dfinity/motoko/releases/tag/0.14.9" target="_blank" rel="noopener noreferrer">Read more in the release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="python-pocket-ic-v31">Python pocket-ic v3.1<a href="#python-pocket-ic-v31" class="hash-link" aria-label="Direct link to Python pocket-ic v3.1" title="Direct link to Python pocket-ic v3.1">​</a></h2><p>A new version of Python pocket-ic has been released! This release adds support for PocketIC server v9.0 plus the ability to store and load state to and from a local directory on your computer.</p><p><a href="https://pypi.org/project/pocket-ic/3.1.0/" target="_blank" rel="noopener noreferrer">Try it out yourself or update your project to use the latest version</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dashboard-v60">Dashboard v6.0<a href="#dashboard-v60" class="hash-link" aria-label="Direct link to Dashboard v6.0" title="Direct link to Dashboard v6.0">​</a></h2><p>The ICP Dashboard has gotten a <em>major</em> redesign! With updates to almost all dashboard pages, widgets, and components, the dashboard now includes exciting features like:</p><ul><li><p>A new Networks page that shows the decentralization of the network through an interactive globe that can be used to select data centers and view details.</p></li><li><p>If you select a node or subnet, a Nakamoto coefficient score is displayed for each, describing how decentralized each component is.</p></li><li><p>A new Tokens page that shows information about all ICP, SNS, and chain-key tokens.</p></li></ul><p>The blog post <a href="https://medium.com/dfinity/internet-computer-dashboard-making-icp-data-more-accessible-07784d15108d" target="_blank" rel="noopener noreferrer">Making ICP data more accessible</a> goes into detail about each change with screenshots. Definitely give it a read!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sol-rpc-canister-v01-pre-release">SOL RPC canister v0.1 pre-release<a href="#sol-rpc-canister-v01-pre-release" class="hash-link" aria-label="Direct link to SOL RPC canister v0.1 pre-release" title="Direct link to SOL RPC canister v0.1 pre-release">​</a></h2><p>Attention SOL devs! The SOL RPC canister has been pre-released and is ready for you to test and play with! During this pre-release, the canister is deployed as a staging canister (titvo-eiaaa-aaaar-qaogq-cai) controlled by the DFINITY team. Upon official release, a production canister will be controlled by the NNS.</p><p>Supported methods for this RPC canister include:</p><ul><li><p><code>getAccountInfo</code></p></li><li><p><code>getBalance</code></p></li><li><p><code>getBlock</code></p></li><li><p><code>getSlot</code></p></li><li><p><code>getTransaction</code></p></li><li><p><code>sendTransaction</code></p></li><li><p><code>jsonRequest</code></p></li></ul><p>Want to learn more? <a href="https://forum.dfinity.org/t/sol-rpc-canister/41896/2?u=gregory-demay" target="_blank" rel="noopener noreferrer">Check out the announcement on the developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 23, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/23/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/23/news-and-updates/update"/>
        <updated>2025-04-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a new release of Motoko, an update to the community project CycleOps, and a reminder about OISY wallet.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="April 23, 2025" src="/assets/images/dev-update-blog-april-23-8997b424b4a1bca3f820bf10827f9418.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a new release of Motoko, an update to the community project CycleOps, and a reminder about OISY wallet. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0148">Motoko <code>v0.14.8</code><a href="#motoko-v0148" class="hash-link" aria-label="Direct link to motoko-v0148" title="Direct link to motoko-v0148">​</a></h2><p>A new version of Motoko is available in the latest beta release of <code>dfx</code> (0.26.1-beta.1).</p><p>This release concludes the beta testing of enhanced orthogonal persistence and adds random-access indexing of <code>Blob</code>s. This update also includes some parser and type checker improvements implemented by the Serokell team.</p><p>Lastly, autogenerated Candid now compiles into more readable JavaScript/TypeScript thanks to fewer type synonyms and preservation of named function arguments.</p><p><a href="https://forum.dfinity.org/t/some-notable-features-in-the-new-moc-0-14-8/44302" target="_blank" rel="noopener noreferrer">Read the full release notes for more information.</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cycleops-update">CycleOps update<a href="#cycleops-update" class="hash-link" aria-label="Direct link to CycleOps update" title="Direct link to CycleOps update">​</a></h2><p>The CycleOps team has released an exciting update for topping up your canisters: ICRC deposits! Now, you can fund your canister's automated top-ups directly from an SNS's treasury funds.</p><p><a href="https://docs.cycleops.dev/changelog/icrc-deposits" target="_blank" rel="noopener noreferrer">You can read the full details on the CycleOps changelog.</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="oisy-wallet">OISY wallet<a href="#oisy-wallet" class="hash-link" aria-label="Direct link to OISY wallet" title="Direct link to OISY wallet">​</a></h2><p>Have you created an OISY wallet yet? OISY is a fully onchain, browser-based wallet designed for seamless access to DeFi. Learn more about how to create an OISY wallet, how to use it, or how it works on the <a href="https://docs.oisy.com/using-oisy-wallet/how-tos/creating-a-wallet" target="_blank" rel="noopener noreferrer">OISY documentation</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 16, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/16/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/16/news-and-updates/update"/>
        <updated>2025-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have an exciting update on enhanced orthogonal persistence, a new Pic-js release, and two new NNS dapp features.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="April 16, 2025" src="/assets/images/dev-update-blog-april-16-227e28334843d60a359e124f171ad35f.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have an exciting update on enhanced orthogonal persistence, a new Pic-js release, and two new NNS dapp features. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="enhanced-orthogonal-persistence-blessed-for-production">Enhanced orthogonal persistence: Blessed for production!<a href="#enhanced-orthogonal-persistence-blessed-for-production" class="hash-link" aria-label="Direct link to Enhanced orthogonal persistence: Blessed for production!" title="Direct link to Enhanced orthogonal persistence: Blessed for production!">​</a></h2><p>Enhanced orthogonal persistence has been blessed for production with Motoko compiler version 0.14.4 and newer.</p><p>Previous versions of Motoko introduced some components of orthogonal persistence, including persistent actors and stable variables, but the introduction of enhanced orthogonal persistence introduces significant safety and scalability enhancements to Motoko.</p><p>EOP was designed to provide developers with a simple, safe, and scalable way to deal with stable memory and canister upgrades. With EOP, transitively reachable data structures of any first-order type are automatically persisted across upgrades without needing to configure stable memory or use stable data structures. The ICP runtime system routinely checks type compatibility for canister upgrades and supports data changes through implicit migration. Lastly, upgrades have become significantly faster because the main memory is simply retained on an upgrade. No copying to and from stable memory is needed.</p><p>You can learn more about EOP on the <a href="https://forum.dfinity.org/t/officializing-enhanced-orthogonal-persistence-eop/43675" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pic-js-release-v0120">Pic-js release v0.12.0<a href="#pic-js-release-v0120" class="hash-link" aria-label="Direct link to Pic-js release v0.12.0" title="Direct link to Pic-js release v0.12.0">​</a></h2><p>Pic-js has two important updates: A new release (v0.12.0) and it has moved to a <a href="https://github.com/dfinity/pic-js" target="_blank" rel="noopener noreferrer">new GitHub repo</a> under the DFINITY organization.</p><p>The new release includes:</p><ul><li><p>Support for the <code>set_certified_time</code> endpoint.</p></li><li><p><code>Support for the </code>get_controllers` endpoint.</p></li><li><p>The following methods are now async:</p><ul><li>getTopology()</li><li>getBitcoinSubnet()</li><li>getFiduciarySubnet()</li><li>getInternetIdentitySubnet()</li><li>getNnsSubnet()</li><li>getSnsSubnet()</li><li>getApplicationSubnets()</li><li>getSystemSubnets()</li><li>getControllers()</li></ul></li></ul><p>Along with the new repo, there is also a new NPM package and new documentation:</p><p>Old NPM: <a href="https://www.npmjs.com/package/@hadronous/pic" target="_blank" rel="noopener noreferrer">@hadronous/pic</a>
New NPM: <a href="https://www.npmjs.com/package/@dfinity/pic" target="_blank" rel="noopener noreferrer">@dfinity/pic</a></p><p>Old docs: <a href="https://hadronous.github.io/pic-js/" target="_blank" rel="noopener noreferrer">hadronous.github.io</a>
New docs: <a href="https://dfinity.github.io/pic-js/" target="_blank" rel="noopener noreferrer">dfinity.github.io</a></p><p>It is recommended that all users migrate to the new package and repo to get the latest updates and support.</p><p>Read more on the <a href="https://forum.dfinity.org/t/pic-js-has-moved-to-the-dfinity-github-organization/43792" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-nns-dapp-features">New NNS dapp features<a href="#new-nns-dapp-features" class="hash-link" aria-label="Direct link to New NNS dapp features" title="Direct link to New NNS dapp features">​</a></h2><p>Easter has come early for the NNS dapp with two new exciting features.</p><p>First, a new card on the Portfolio page that displays ongoing proposals for launching new SNSes.</p><p>The second feature is an easter egg for desktop users. Play with your keyboard to try and find the hidden new feature, and check back in on the <a href="https://forum.dfinity.org/t/proposal-136220-to-upgrade-the-nns-dapp-11-04-2025/43683" target="_blank" rel="noopener noreferrer">developer forum</a> after the holiday to see the reveal of the feature.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 9, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/09/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/09/news-and-updates/update"/>
        <updated>2025-04-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week we have an exciting new community tool called ic-test, a reminder about SNS custom proposal types, and a new release of ICRC Rosetta.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="April 9, 2025" src="/assets/images/dev-update-blog-april-9-6640a7035a7d8a5b6905426f1e9e79be.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week we have an exciting new community tool called <code>ic-test</code>, a reminder about SNS custom proposal types, and a new release of ICRC Rosetta. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ic-test"><code>ic-test</code><a href="#ic-test" class="hash-link" aria-label="Direct link to ic-test" title="Direct link to ic-test">​</a></h2><p><code>ic-test</code> is a new community tool that can automate canister boilerplate generation and setup for creating canister and cross-chain tests. First, it reads your project's <code>dfx.json</code> and <code>foundry.toml</code> files to learn your project's setup, then it generates Rust types from your canister's Candid files and creates Solidity interfaces from your contract definitions. Under the hood, it uses <code>pocket-ic</code> and <code>foundry</code> to run tests using a basic API to interact with your canister's Wasm files.</p><p>You can install <code>ic-test</code> with cargo: <code>cargo install ic-test</code>.</p><p>Then, use <code>dfx</code> to build your project: <code>dfx build</code>.</p><p>Lastly, create a new test workspace with <code>ic-test new tests</code>. This workspace will include bindings for each canister and EVM smart contract within your project.</p><p>Here's a quick "Hello, world!" example:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx new hello --type rust</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ic-test new</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Edit <code>tests.rs</code> to include the actual test logic, such as:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:#707070">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">async</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">setup</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">test</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">IcpTest</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">Env</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> icp_user </span><span class="token operator">=</span><span class="token plain"> test</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">icp</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">test_user</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token number">0</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> hello_backend </span><span class="token operator">=</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">hello_backend</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">deploy</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token operator">&amp;</span><span class="token plain">icp_user</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">call</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token keyword" style="color:#EB318A">await</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> hello_frontend </span><span class="token operator">=</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">hello_frontend</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">deploy</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token operator">&amp;</span><span class="token plain">icp_user</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// init args</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token class-name">None</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">call</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token keyword" style="color:#EB318A">await</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// Additional setup steps</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token class-name">Env</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        test</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        hello_backend</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        hello_frontend</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token attribute attr-name" style="color:#F8F8F2">#[tokio::test]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">async</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">test_greet</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> </span><span class="token class-name">Env</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        test</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        hello_backend</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        hello_frontend</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#26D76D">setup</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">IcpTest</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">new</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token keyword" style="color:#EB318A">await</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token keyword" style="color:#EB318A">await</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// Call the greet method</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> result</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> hello_backend</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">greet</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"ic-test"</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">to_owned</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">call</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token keyword" style="color:#EB318A">await</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property">assert_eq!</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"Hello, ic-test!"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Run the tests with <code>cargo test</code>.</p><p>You can learn more about <code>ic-test</code> on the <a href="https://forum.dfinity.org/t/introducing-ic-test-a-tool-for-testing-cross-chain-ic-projects/43479" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sns-custom-proposal-type-reminder">SNS custom proposal type reminder<a href="#sns-custom-proposal-type-reminder" class="hash-link" aria-label="Direct link to SNS custom proposal type reminder" title="Direct link to SNS custom proposal type reminder">​</a></h2><p>Attention devs! This is a reminder that SNSes should categorize existing, custom type proposals to topics.</p><p>In the upcoming SNS topics release, SNS proposals with known topics are guaranteed to continue working seamlessly. Proposals submitted without a known topic may be disallowed in the near future until they are assigned to a topic using <code>SetTopicsForCutsomProposals</code>.</p><p><a href="https://forum.dfinity.org/t/action-required-please-assign-topics-for-your-custom-sns-proposals/42469/2" target="_blank" rel="noopener noreferrer">Learn more</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icrc-rosetta-release">ICRC Rosetta release<a href="#icrc-rosetta-release" class="hash-link" aria-label="Direct link to ICRC Rosetta release" title="Direct link to ICRC Rosetta release">​</a></h2><p>A new version of ICRC Rosetta has been released! This latest update, <code>v1.2.0</code> adds support for multiple tokens within a single instance. View the <a href="/defi/rosetta/icrc_rosetta/#step-3-start-the-integration-software">usage guide</a> for detailed instructions on how to use this new feature, or [view the release notes to learn more(<a href="https://github.com/dfinity/ic/releases/tag/rosetta-icrc-release-1.2.0" target="_blank" rel="noopener noreferrer">https://github.com/dfinity/ic/releases/tag/rosetta-icrc-release-1.2.0</a>).</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 2, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/02/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/04/02/news-and-updates/update"/>
        <updated>2025-04-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a new Motoko release, an exciting ICP Ninja announcement, and a community fundraising event for Motoko EVM.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="April 2, 2025" src="/assets/images/dev-update-blog-april-2-65fda98bc94a3e86ef098d2c267c8f25.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a new Motoko release, an exciting ICP Ninja announcement, and a community fundraising event for Motoko EVM. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0146">Motoko v0.14.6<a href="#motoko-v0146" class="hash-link" aria-label="Direct link to Motoko v0.14.6" title="Direct link to Motoko v0.14.6">​</a></h2><p>A new version of Motoko has been released! Highlights of the latest update include:</p><ul><li><p>Stable fields are no longer dropped or promoted to lossy supertypes to implicitly prevent data loss. Removing a stable variable or promoting its type to a lossy supertype now requires explicit migration.</p></li><li><p>Fields in literal objects and record extensions that are inaccessible due to user-specified type constraints now return a warning.</p></li><li><p>Release artifacts for Darwin-arm64 and Linux-aarch64 platforms</p></li></ul><p><a href="https://github.com/dfinity/motoko/releases/tag/0.14.6" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-ninja-update">ICP Ninja update<a href="#icp-ninja-update" class="hash-link" aria-label="Direct link to ICP Ninja update" title="Direct link to ICP Ninja update">​</a></h2><p>Have a cool project that you're proud of and want to share? What about a simple boilerplate project that showcases a new ICP feature? ICP Ninja now accepts submissions for example projects that will be showcased on the <a href="https://icp.ninja" target="_blank" rel="noopener noreferrer">ICP Ninja homepage</a>.</p><p>It is recommended that you build your example directly within ICP Ninja, such that it starts out with the correct tooling, structure, and configuration. If you do that, your project will naturally be in the correct format and can be easily added.</p><p>Read the full instructions for <a href="https://github.com/dfinity/examples/blob/master/NINJA_CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">contributing an example on GitHub.</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-evm-fundraising">Motoko EVM fundraising<a href="#motoko-evm-fundraising" class="hash-link" aria-label="Direct link to Motoko EVM fundraising" title="Direct link to Motoko EVM fundraising">​</a></h2><p>The Motoko EVM project has begun fundraising through Gitcoin Grants and is asking for your support!</p><p>The project aims to provide a virtual machine that integrates the functionalities of the Ethereum Virtual Machine into ICP alongside ICP-specific features and capabilities. It strives to provide an environment for L2 and L3 appchains to utilize ICP's security from their initial deployment.</p><p><a href="https://forum.dfinity.org/t/gitcoin-grants-23-motoko-evm-fundraising-starts-today/43307" target="_blank" rel="noopener noreferrer">Read the full project details on the forum</a>.</p><p>How you can support:</p><ul><li><p>Donate to the project via Gitcoin Grants.</p></li><li><p>Spread the word on X.</p></li><li><p>Leave feedback about the project on the <a href="https://forum.dfinity.org/t/gitcoin-grants-23-motoko-evm-fundraising-starts-today/43307" target="_blank" rel="noopener noreferrer">forum</a>.</p></li></ul><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 26, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/03/26/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/03/26/news-and-updates/update"/>
        <updated>2025-03-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a motion to pause the NNS Neurons' Fund, a new beta release of dfx, and a few new updates to Juno.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="March 26, 2025" src="/assets/images/dev-update-blog-march-26-7e3dfaad23899ba0fb23be480f986db9.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a motion to pause the NNS Neurons' Fund, a new beta release of <code>dfx</code>, and a few new updates to Juno. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motion-to-pause-nns-neurons-fund">Motion to pause NNS Neurons' Fund<a href="#motion-to-pause-nns-neurons-fund" class="hash-link" aria-label="Direct link to Motion to pause NNS Neurons' Fund" title="Direct link to Motion to pause NNS Neurons' Fund">​</a></h2><p>A proposal has been submitted to pause the Neurons' Fund to prevent the creation of SNS proposals that request a Neurons' Fund contribution. SNSes will still be able to launch without a Neurons' Fund.</p><p>The motivation behind pausing the Neurons' Fund stems from a problem that arises when a dapp owner participates in an SNS swap with their own tokens and makes the project look more valuable than it might be. The community has raised concern regarding the design of the Neurons' Fund matched funding, and as a result, some have begun to distrust the SNS framework and its authenticity.</p><p>The Neurons' Fund mechanism will be reconsidered, and discussions will begin regarding how it can be improved in the future.</p><p><a href="https://forum.dfinity.org/t/motion-proposal-to-pause-the-neurons-fund/43014" target="_blank" rel="noopener noreferrer">Learn more on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-0260-beta1-release"><code>dfx 0.26.0-beta.1</code> release<a href="#dfx-0260-beta1-release" class="hash-link" aria-label="Direct link to dfx-0260-beta1-release" title="Direct link to dfx-0260-beta1-release">​</a></h2><p>A new version of <code>dfx</code> has been released for beta testing. Important new features of <code>v0.26.0</code> include:</p><ul><li><p><code>dfx</code> now uses <code>--pocketic</code> by default rather than running a local replica itself.</p></li><li><p><code>dfx</code> now reports telemetry data to a DFINITY server by default. This can be disabled or configured to collect only local development data. For more information or to comment, please see <a href="https://forum.dfinity.org/t/dfx-telemetry-proposal-2025/41569" target="_blank" rel="noopener noreferrer">https://forum.dfinity.org/t/dfx-telemetry-proposal-2025/41569</a>.</p></li><li><p><code>dfx ledger allowance</code> subcommand has been added to comply with the ICRC-2 standard.</p></li><li><p>The VetKD test key <code>Bls12_381_G2:dfx_test_key</code> can be used when <code>dfx</code> is started locally with <code>dfx start --replica</code>.</p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.26.0-beta.1" target="_blank" rel="noopener noreferrer">Read the full release notes</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="latest-juno-release">Latest Juno release<a href="#latest-juno-release" class="hash-link" aria-label="Direct link to Latest Juno release" title="Direct link to Latest Juno release">​</a></h2><p>A new version of Juno has been released! This rather large release includes:</p><ul><li><p>Newly revamped onboarding.</p></li><li><p>Updated template dependencies.</p></li><li><p>Local dev is now the default for applications.</p></li><li><p>Scaffold serverless functions are now available.</p></li></ul><p><a href="https://forum.dfinity.org/t/latest-juno-releases/36771/23" target="_blank" rel="noopener noreferrer">Learn more about Juno</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 19, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/03/19/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/03/19/news-and-updates/update"/>
        <updated>2025-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there are eight newly proposed ICRC standards created by ICDevs.org, new block types to capture specific ledger events, and the Coulomb milestone achievement.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="March 19, 2025" src="/assets/images/dev-update-blog-march-19-bfb51ae27c48c2c10a2e03ac5c5576c8.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there are eight newly proposed ICRC standards created by ICDevs.org, new block types to capture specific ledger events, and the Coulomb milestone achievement. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="newly-proposed-icrc-standards">Newly proposed ICRC standards<a href="#newly-proposed-icrc-standards" class="hash-link" aria-label="Direct link to Newly proposed ICRC standards" title="Direct link to Newly proposed ICRC standards">​</a></h2><p>ICDevs have designed and proposed eight new ICRC standards that would focus on transparency, traceability, auditability, and provenance of canister Wasm files. Collectively, these standards would provide developers with the ability to:</p><ul><li>Create a canister app type.</li><li>Upload new versions of that app.</li><li>Have others verify the app's build.</li><li>Deploy and orchestrate the canister.</li><li>Upgrade or roll back the canister.</li><li>Track upgrades or reinstallations in an itemized log.</li><li>Create a fully auditable canister where every interaction is stored within a transaction log.</li></ul><p>The eight proposed standards are:</p><ul><li><p><a href="https://forum.dfinity.org/t/icrc-105-enhancing-canister-installation-configuration-transparency/42588/1" target="_blank" rel="noopener noreferrer">ICRC-105</a>: Installation and configuration history block definitions.</p></li><li><p><a href="https://forum.dfinity.org/t/icrc-118-wasm-registry-definition-for-version-control-and-history/42589/1" target="_blank" rel="noopener noreferrer">ICRC-118</a>: Wasm registry definition for version control and history.</p></li><li><p><a href="https://forum.dfinity.org/t/icrc-119-wasm-registry-block-specification/42590/1" target="_blank" rel="noopener noreferrer">ICRC-119</a>: Wasm registry block specification.</p></li><li><p><a href="https://forum.dfinity.org/t/icrc-120-canister-wasm-orchestration-service/42591/1" target="_blank" rel="noopener noreferrer">ICRC-120</a>: Canister Wasm orchestration service specification.</p></li><li><p><a href="https://forum.dfinity.org/t/icrc-121-wasm-orchestration-service-block-specification/42593/1" target="_blank" rel="noopener noreferrer">ICRC-121</a>: Wasm orchestration service block specification.</p></li><li><p><a href="https://forum.dfinity.org/t/icrc-126-wasm-verification/42592/1" target="_blank" rel="noopener noreferrer">ICRC-126</a>: Wasm verification.</p></li><li><p><a href="https://forum.dfinity.org/t/icrc-127-generic-bounty-system/42594/1" target="_blank" rel="noopener noreferrer">ICRC-127</a>: Generic bounty system for verification.</p></li><li><p><a href="https://forum.dfinity.org/t/icrc-133-generic-input-capture-and-state-change-extends-icrc3/42595/1" target="_blank" rel="noopener noreferrer">ICRC-133</a>: Generic input capture and state change (extends ICRC-3).</p></li></ul><p>You can learn more on the <a href="https://forum.dfinity.org/t/icrc-105-and-its-seven-cousins/42596" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-blocks-for-ledgers">New blocks for ledgers<a href="#new-blocks-for-ledgers" class="hash-link" aria-label="Direct link to New blocks for ledgers" title="Direct link to New blocks for ledgers">​</a></h2><p>Token ledger standards are undergoing improvements to support the development of Real-World Asset (RWA) ledgers and the essential features for tokenized asset management. One of these improvements is the upcoming introduction of new block types that will be used to capture specific ledger events beyond standard transactions. These include:</p><ul><li>Fee collection.</li><li>Authorized mint and burn blocks.</li><li>Governance or compliance blocks.</li></ul><p>This change matters to developers who implement application logic that parses ledger blocks for transaction analysis, indexing, or history. The introduction of these new blocks may interfere with your current implementation.</p><p>For more information, <a href="https://forum.dfinity.org/t/upcoming-new-block-types-for-icp-ledgers-important-for-wallets-dashboards-indexers/42567/1" target="_blank" rel="noopener noreferrer">read the full details on the forum.</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="coulomb-milestone-achievement">Coulomb milestone achievement<a href="#coulomb-milestone-achievement" class="hash-link" aria-label="Direct link to Coulomb milestone achievement" title="Direct link to Coulomb milestone achievement">​</a></h2><p>The ICP Roadmap milestone Coulomb has been completed! Part of the Developer Experience Roadmap track, the Coulomb milestone focuses on the release of several new features and enhancements to ICP Ninja, a web-based IDE environment for developers to build and deploy ICP applications directly from their web browser.</p><p>In this release, ICP Ninja now features:</p><ul><li>A redesigned landing page.</li><li>Sign in with Internet Identity or GitHub.</li><li>Project saving and sharing.</li><li>Export to GitHub.</li><li>New example projects, including an EVM block explorer and an LLM chatbot.</li></ul><p>You can read the full <a href="https://medium.com/dfinity/icp-ninja-update-coulomb-milestone-unleashed-0d980651f707" target="_blank" rel="noopener noreferrer">blog post</a> or leave your thoughts <a href="https://forum.dfinity.org/t/icp-ninja-update-coulomb-milestone-unleashed/42561/" target="_blank" rel="noopener noreferrer">on the forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 12, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/03/12/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/03/12/news-and-updates/update"/>
        <updated>2025-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is an important ongoing discussion regarding reproducible builds, an API change for neuron dissolve delays, and a discussion regarding standards for deprecated SNSes.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="March 12, 2025" src="/assets/images/dev-update-blog-march-12-38f817e11488772771ba74d0d800f76a.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is an important ongoing discussion regarding reproducible builds, an API change for neuron dissolve delays, and a discussion regarding standards for deprecated SNSes. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-conversation-reproducible-builds-and-code-verification">Community conversation: Reproducible builds and code verification<a href="#community-conversation-reproducible-builds-and-code-verification" class="hash-link" aria-label="Direct link to Community conversation: Reproducible builds and code verification" title="Direct link to Community conversation: Reproducible builds and code verification">​</a></h2><p>An important community conversation regarding reproducible builds is happening on the forum. The goal of this discussion is to brainstorm ideas for a reproducible build standard, where developers will be asked to structure their code and canisters in a manner that is easily reproducible and verifiable. This standard would include parameters for builds that use Motoko, Rust, Azle, and possibly other supported CDKs.</p><p>Have ideas or questions? <a href="https://forum.dfinity.org/t/lets-discuss-reproducible-builds-and-code-verification-once-again/41918" target="_blank" rel="noopener noreferrer">Join the discussion</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dissolve-delay-api-change">Dissolve delay API change<a href="#dissolve-delay-api-change" class="hash-link" aria-label="Direct link to Dissolve delay API change" title="Direct link to Dissolve delay API change">​</a></h2><p>An upcoming API change regarding neuron minimum dissolve delay will take effect on March 17, 2025. This change may affect clients that use neurons, specifically the constraint on the minimum dissolve delay required for neurons to propose or vote.</p><p>If you have an NNS downstream client that executes neuron-related functions, it is recommended that you check if your client relies on the minimum delay constant. If so, start reading its value from the network economics API (<code>NetworkEconomics.VotingPowerEconomics.neuron_minimum_dissolve_delay_to_vote_seconds</code>) when it becomes available.</p><p>You can learn more on the <a href="https://forum.dfinity.org/t/api-change-neuron-minimum-dissolve-delay-constraint-update-release-eta-march-17-2025/42100" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="defining-sns-deprecation-standards">Defining SNS deprecation standards<a href="#defining-sns-deprecation-standards" class="hash-link" aria-label="Direct link to Defining SNS deprecation standards" title="Direct link to Defining SNS deprecation standards">​</a></h2><p>The DFINITY Governance team would like to propose a standard that defines criteria for an SNS to be considered deprecated. A deprecated SNS is any SNS that has not had a transaction or proposal activity for a specified amount of time.</p><p>Such a standard is important, as there is currently no cleanup process for SNSes that are no longer active or maintained. Before the standard can be defined, the team would like to agree upon the following:</p><ul><li><p>Types of transactions that are still relevant to users.</p><ul><li>Submitted proposals.</li><li>SNS ledger transactions.</li></ul></li><li><p>A reasonable period of inactivity before an SNS would be considered deprecated:</p><ul><li>Two months.</li></ul></li></ul><p>Join the <a href="https://forum.dfinity.org/t/defining-deprecated-snss/42105" target="_blank" rel="noopener noreferrer">forum discussion</a> for more information.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Try the new Motoko base library: feedback requested!]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/new-motoko-base</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/new-motoko-base"/>
        <updated>2025-03-05T16:09:56.000Z</updated>
        <summary type="html"><![CDATA[The new Motoko base library makes it easier for both humans and AI to read and write Motoko canisters.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://github.com/dfinity/motoko-core" target="_blank" rel="noopener noreferrer"><img loading="lazy" alt="Motoko core library" src="/assets/images/new-motoko-base-5126ee14fdbd3c197256e00390efaa12.jpg" width="1400" height="675" class="img_ev3q"></a></p><ul><li><a href="https://forum.dfinity.org/t/motoko-base-library-changes/39766" target="_blank" rel="noopener noreferrer">Developer forum topic</a></li><li><a href="https://github.com/dfinity/motoko-core" target="_blank" rel="noopener noreferrer">GitHub repository</a></li><li><a href="https://icp.ninja/s/kwKkw" target="_blank" rel="noopener noreferrer">Online starter project</a></li></ul><p>The Motoko team is excited to announce a major overhaul of the Motoko base library! Our goal is to improve the consistency and usability of Motoko’s standard library, making it easier for both humans and AI to read and write Motoko canisters.</p><p>Here is a quick summary of the biggest features and improvements:</p><ul><li>New imperative and functional data structures.</li><li>Simplified type conversions.</li><li>Data structures no longer rely on hashing.</li><li><code>range()</code> functions for each numeric type, with an exclusive upper bound.</li><li><code>VarArray</code> module for more conveniently working with mutable arrays.</li><li><code>Random</code> module with a cleaner API and optional pseudo-random number generation.</li><li>Many other changes for consistency, clarity, and convenience.</li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="try-it-yourself">Try it yourself<a href="#try-it-yourself" class="hash-link" aria-label="Direct link to Try it yourself" title="Direct link to Try it yourself">​</a></h2><p>Last week, we released a preview of the new core library with a few different options for trying it out. One is through the <a href="https://mops.one/core" target="_blank" rel="noopener noreferrer"><code>core</code></a> Mops package. Add the following to your <code>mops.toml</code> config file:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">core = "0.0.0" # Check https://mops.one/core for the latest version</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Alternatively, you can directly replace the <code>mo:base</code> imports in an existing project:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">base = "https://github.com/dfinity/motoko-core"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Let us know if you run into anything unexpected by opening a <a href="https://github.com/dfinity/motoko-core/issues" target="_blank" rel="noopener noreferrer">GitHub issue</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="whats-changed">What's changed?<a href="#whats-changed" class="hash-link" aria-label="Direct link to What's changed?" title="Direct link to What's changed?">​</a></h2><p>Below is a detailed overview of the most notable changes and additions.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="persistent-data-structures">Persistent data structures<a href="#persistent-data-structures" class="hash-link" aria-label="Direct link to Persistent data structures" title="Direct link to Persistent data structures">​</a></h3><p>The base library now includes both imperative (mutable) and purely functional (immutable) data structures which can all be used in stable memory. Because Motoko is a multi-paradigm language, we wanted to reflect this in the base library by providing data structures similar to those in imperative languages (JS, Java, C#, C++) and functional languages (Haskell, Elixir, OCaml, F#).</p><p>Check out <a href="https://learn.microsoft.com/en-us/dotnet/standard/linq/functional-vs-imperative-programming" target="_blank" rel="noopener noreferrer">this article</a> for a refresher on the differences between imperative vs. functional programming, both of which are supported in Motoko.</p><p>We chose implementations with good all-round performance, deferring specialized implementations to the <a href="https://mops.one/" target="_blank" rel="noopener noreferrer">Mops</a> package ecosystem. We also updated function names for consistency and familiarity from other languages such as JS, Python, Java, and Rust.</p><p>Below is an example of using the new imperative <code>List</code> module, derived from the <a href="https://mops.one/vector" target="_blank" rel="noopener noreferrer"><code>vector</code></a> Mops package (big thanks to <a href="https://github.com/research-ag" target="_blank" rel="noopener noreferrer">Andrii Stepanov and Timo Hanke</a>):</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/List"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Nat"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">stable</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> list </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">empty</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// Persistent data structure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 5</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">toText</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">toText</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"[5]"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The above code snippet can be rewritten as a new <code>persistent</code> actor:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/List"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">persistent</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> list </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">empty</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// Persistent data structure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can also use the purely functional <code>List</code> module:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> PureList </span><span class="token string" style="color:#F68E5F">"mo:core/pure/List"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">persistent</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">var</span><span class="token plain"> list </span><span class="token operator">=</span><span class="token plain"> PureList</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">empty</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// Persistent data structure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  list </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token operator">=</span><span class="token plain"> PureList</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">pushFront</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"Hi"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> PureList</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">size</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> 1</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> PureList</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">all</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">func</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">n</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"> n </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"Hi"</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>We also included an efficient <a href="https://github.com/canscale/StableHeapBTreeMap" target="_blank" rel="noopener noreferrer">stable BTree map implementation</a> (big thanks to <a href="https://github.com/ByronBecker" target="_blank" rel="noopener noreferrer">Byron Becker</a>):</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Map</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Map"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Text"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Array</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Array"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">persistent</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> map </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Map</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">empty</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin" style="color:#29ABE2">Map</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">map</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">compare</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"key"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 123</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Map</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">size</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">map</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> 1</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin" style="color:#29ABE2">Array</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">fromIter</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token builtin" style="color:#29ABE2">Map</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">entries</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">map</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"key"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 123</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Here's the complete list of data structures in the new base library:</p><ul><li><code>List</code> (adapted from <a href="https://mops.one/vector" target="_blank" rel="noopener noreferrer"><code>vector</code></a> Mops package)</li><li><code>Map</code> (adapted from <a href="https://mops.one/stableheapbtreemap" target="_blank" rel="noopener noreferrer"><code>StableHeapBTreeMap</code></a> Mops package)</li><li><code>Queue</code></li><li><code>Set</code></li><li><code>Stack</code></li><li><code>pure/List</code></li><li><code>pure/Map</code></li><li><code>pure/Queue</code></li><li><code>pure/Set</code></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-type-conversions">New type conversions<a href="#new-type-conversions" class="hash-link" aria-label="Direct link to New type conversions" title="Direct link to New type conversions">​</a></h3><p>Since the new base library includes imperative and functional data structures,
we made it easy to convert between them:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/List"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> PureList </span><span class="token string" style="color:#F68E5F">"mo:core/pure/List"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Text"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">persistent</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> list </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">singleton</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"A"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> pureList </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">toPure</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> PureList</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">toArray</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">pureList</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token string" style="color:#F68E5F">"A"</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">List</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">equal</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token builtin" style="color:#29ABE2">List</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">fromPure</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">pureList</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> list</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">equal</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>We also added missing primitive type conversions such as those between <code>Int</code> and <code>Nat</code>:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Int</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Int"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Nat"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">persistent</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> number </span><span class="token operator">=</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">5</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Int</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">toNat</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token operator">-</span><span class="token plain">number</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> 5</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// Nat.fromInt() also exists</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> </span><span class="token operator">-</span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">toInt</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">5 </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> number</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// Int.fromNat() also exists</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="hashing">Hashing<a href="#hashing" class="hash-link" aria-label="Direct link to Hashing" title="Direct link to Hashing">​</a></h3><p>We removed 32-bit hashing from the base library in favor of comparison-based data structures. This solves a number of problems such as hash-collision attacks which can rapidly drain cycles from a canister. The idea is for Mops packages to supply hashing functions which are best suited for a particular use case. </p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="range-functions">Range functions<a href="#range-functions" class="hash-link" aria-label="Direct link to Range functions" title="Direct link to Range functions">​</a></h3><p><code>Iter.range()</code> has been removed in favor of type-specific range functions such as <code>Nat.range()</code>, <code>Int.range()</code>, <code>Nat32.range()</code>, etc. These functions have an <strong>exclusive upper bound</strong>, in contrast to the original inclusive upper bound of <code>Iter.range()</code>. </p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Int</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Int"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Debug</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Debug"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">persistent</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:#707070">// Iterate through -3, -2, -1, 0, 1, 2 (exclusive upper bound)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">number </span><span class="token keyword" style="color:#EB318A">in</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Int</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">range</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token operator">-</span><span class="token plain">3</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 3</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token builtin" style="color:#29ABE2">Debug</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">print</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token keyword" style="color:#EB318A">debug_show</span><span class="token plain"> number</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:#707070">// Iterate through -3, -2, -1, 0, 1, 2, 3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">number </span><span class="token keyword" style="color:#EB318A">in</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Int</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">rangeInclusive</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token operator">-</span><span class="token plain">3</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 3</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token builtin" style="color:#29ABE2">Debug</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">print</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token keyword" style="color:#EB318A">debug_show</span><span class="token plain"> number</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>We also included <code>rangeInclusive()</code> for use cases with an inclusive upper bound. The original <code>Iter.range()</code> corresponds to <code>Nat.rangeInclusive()</code>.</p><p>Helper functions have been added, such as <code>allValues()</code>, for each finite type in the base library. </p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="vararray-module">VarArray module<a href="#vararray-module" class="hash-link" aria-label="Direct link to VarArray module" title="Direct link to VarArray module">​</a></h3><p>For convenience, we created a separate <code>mo:core/VarArray</code> module with the same API as <code>mo:core/Array</code> but for mutable arrays. This reduces the need to convert back and forth between mutable and immutable arrays:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Array</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Array"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> VarArray </span><span class="token string" style="color:#F68E5F">"mo:core/VarArray"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Char</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Char"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Nat"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">persistent</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> array </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Array</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">repeat</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Char</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">'A'</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 3</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> array </span><span class="token operator">==</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token string" style="color:#F68E5F">'A'</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">'A'</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">'A'</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> varArray </span><span class="token operator">=</span><span class="token plain"> VarArray</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">repeat</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Char</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">'B'</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 5</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> VarArray</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">equal</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">varArray</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token keyword" style="color:#EB318A">var</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">'B'</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">'B'</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">'B'</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">'B'</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">'B'</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Char</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">equal</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> numbers </span><span class="token operator">=</span><span class="token plain"> VarArray</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">fromIter</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">range</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">0</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 4</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  VarArray</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">mapInPlace</span><span class="token operator">&lt;</span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">numbers</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">func</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">i</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> i </span><span class="token operator">*</span><span class="token plain"> 3</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> VarArray</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">equal</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">numbers</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token keyword" style="color:#EB318A">var</span><span class="token plain"> 0</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 3</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 6</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> 9</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Nat</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">equal</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>It's now possible to use <code>.values()</code> as an alias for <code>.vals()</code>. Each data structure has a corresponding <code>values()</code> function, e.g. <code>List.values(list)</code>.</p><p>We also fixed naming inconsistencies in functions by replacing <code>ArrayMut</code> with <code>VarArray</code> across the base library.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="random-module">Random module<a href="#random-module" class="hash-link" aria-label="Direct link to Random module" title="Direct link to Random module">​</a></h3><p>We completely redesigned the <code>Random</code> module, which is now a lot simpler to use:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Random</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Random"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> random </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Random</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">crypto</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// Cryptographic random numbers from ICP runtime</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">public</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">func</span><span class="token plain"> coinFlip</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">async</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Bool</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">await</span><span class="token operator">*</span><span class="token plain"> random</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">bool</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">public</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">func</span><span class="token plain"> randomItem</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">items </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">async</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    items</span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token keyword" style="color:#EB318A">await</span><span class="token operator">*</span><span class="token plain"> random</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">natRange</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">0</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> items</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">size</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Now, you can use pseudo-random number generation, adapted from the <a href="https://mops.one/prng" target="_blank" rel="noopener noreferrer"><code>prng</code></a> Mops package (big thanks to <a href="https://github.com/research-ag" target="_blank" rel="noopener noreferrer">Andrii Stepanov and Timo Hanke</a>):</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Random</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:core/Random"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">actor</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> seed </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Nat64</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> 12345</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> random </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Random</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">fast</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">seed</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// Pseudo-random number generator from a seed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">public</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">func</span><span class="token plain"> coinFlip</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">async</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Bool</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    random</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">bool</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">public</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">func</span><span class="token plain"> randomItem</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">items </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">async</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Text</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    items</span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token plain">random</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">natRange</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">0</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> items</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">size</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>It's worth mentioning that the <code>Random</code> module is likely to see more changes in the future, such as adding a way to persist the state of pseudo-random number generation.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="whats-next">What's next?<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?">​</a></h2><p>Before replacing the current Motoko base library, we have a list of follow-up improvements:</p><ul><li>Creating a migration guide for a smooth transition from the original base library.</li><li>Updating the documentation with more examples and detailed explanations.</li><li>Improving test coverage of new functionality.</li><li>Adding new language capabilities for more convenient design patterns.</li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="contributions-and-feedback">Contributions and feedback<a href="#contributions-and-feedback" class="hash-link" aria-label="Direct link to Contributions and feedback" title="Direct link to Contributions and feedback">​</a></h2><p>We want to give a huge thanks to the community members who provided high-quality code contributions to the new base library repository:</p><ul><li><a href="https://github.com/research-ag" target="_blank" rel="noopener noreferrer">MR Research AG (A. Stepanov, T. Hanke)</a>: <a href="https://github.com/research-ag/vector" target="_blank" rel="noopener noreferrer"><code>vector</code></a>, <a href="https://github.com/research-ag/prng" target="_blank" rel="noopener noreferrer"><code>prng</code></a></li><li><a href="https://github.com/ByronBecker" target="_blank" rel="noopener noreferrer">Byron Becker</a>: <a href="https://github.com/canscale/StableHeapBTreeMap" target="_blank" rel="noopener noreferrer"><code>StableHeapBTreeMap</code></a></li><li><a href="https://github.com/ZenVoich" target="_blank" rel="noopener noreferrer">Zen Voich</a>: <a href="https://github.com/ZenVoich/test" target="_blank" rel="noopener noreferrer"><code>test</code></a></li></ul><p>Please consider providing feedback on the <a href="https://forum.dfinity.org/t/motoko-base-library-changes/39766" target="_blank" rel="noopener noreferrer">developer forum topic</a> or <a href="https://github.com/dfinity/motoko-core/discussions" target="_blank" rel="noopener noreferrer">GitHub discussions page</a>. This is the best time to voice your opinion, since we have the most flexibility now before we lock in the final design. </p><p>Thank you for reading, and we look forward to hearing your feedback on the new base library!</p>]]></content>
        <category label="Motoko" term="Motoko"/>
        <category label="New features" term="New features"/>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 5, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/03/05/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/03/05/news-and-updates/update"/>
        <updated>2025-03-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, the new Motoko base library has been released, there is an update from the boundary node team, and there are a few important discussions happening on the forum.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="March 5, 2025" src="/assets/images/dev-update-blog-march-5-a00bbea7e4840e3d4015a45a5eced2b1.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, the new Motoko base library has been released, there is an update from the boundary node team, and there are a few important discussions happening on the forum. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motokos-new-base-library-release">Motoko's new base library release<a href="#motokos-new-base-library-release" class="hash-link" aria-label="Direct link to Motoko's new base library release" title="Direct link to Motoko's new base library release">​</a></h2><p>The new Motoko base library has been released for testing! The new base library has been published under the Mops package <code>new-base</code> and introduces a major overhaul of several Motoko features and syntax. A summary of these changes can be found below:</p><ul><li>New imperative and functional data structures.</li><li>Simplified type conversions.</li><li>Data structures no longer rely on hashing.</li><li><code>range()</code> functions for each numeric type, with an exclusive upper bound.</li><li><code>VarArray</code> module for more conveniently working with mutable arrays.</li><li><code>Random</code> module with a cleaner API and optional pseudo-random number generation.</li><li>Many other changes for consistency, clarity, and convenience.</li></ul><p>A full breakdown with important details has been published as a separate blog post: <a href="https://internetcomputer.org/blog/features/new-motoko-base" target="_blank" rel="noopener noreferrer">Try the new Motoko base library: feedback requested!</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="discussion-reproducible-builds-and-code-verification">Discussion: Reproducible builds and code verification<a href="#discussion-reproducible-builds-and-code-verification" class="hash-link" aria-label="Direct link to Discussion: Reproducible builds and code verification" title="Direct link to Discussion: Reproducible builds and code verification">​</a></h2><p>An important community discussion is happening on the developer forum. Recently, a <a href="https://github.com/research-ag/motoko-build-template" target="_blank" rel="noopener noreferrer">Motoko reproducible build template</a> was introduced, intending to standardize how code can be structured to ensure accurate reproduction and verification.</p><p>The forum discussion proposes a few ideas of how this template can be expanded upon further and what parameters for standardization could be considered.</p><p>Please check out the <a href="https://forum.dfinity.org/t/lets-discuss-reproducible-builds-and-code-verification-once-again/41918?u=marc0olo" target="_blank" rel="noopener noreferrer">forum post and leave your thoughts.</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="boundary-node-update">Boundary node update<a href="#boundary-node-update" class="hash-link" aria-label="Direct link to Boundary node update" title="Direct link to Boundary node update">​</a></h2><p>The new decentralized boundary node architecture plans to introduce enhanced observability, as observability is crucial for diagnosing issues and providing developers insight into usage patterns. The network's API boundary nodes handle every incoming request to ICP, making them a good candidate to offer developers valuable data without compromising privacy.</p><p>As part of the ICP Levitron roadmap milestone, the API boundary nodes plan to implement a new data hashing workflow that will collect observability data and anonymize it.</p><p>You can read more details on the <a href="https://forum.dfinity.org/t/observability-with-the-new-boundary-node-architecture/41725" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="request-for-feedback-websocket-support-in-azle">Request for feedback: WebSocket support in Azle<a href="#request-for-feedback-websocket-support-in-azle" class="hash-link" aria-label="Direct link to Request for feedback: WebSocket support in Azle" title="Direct link to Request for feedback: WebSocket support in Azle">​</a></h2><p>The Demergent Labs team is asking for your input on the upcoming Azle 1.0 release. Let the team know if IC WebSocket support is something that you'd like to see in the upcoming Azle release or not:</p><p><a href="https://forum.dfinity.org/t/opinion-poll-ic-websocket-support-in-azle/41734" target="_blank" rel="noopener noreferrer">https://forum.dfinity.org/t/opinion-poll-ic-websocket-support-in-azle/41734</a></p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 26, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/02/26/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/02/26/news-and-updates/update"/>
        <updated>2025-02-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is an important update on canister migration, a new proposal for dfx telemetry, and an exciting community project to showcase.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Febuary 26, 2025" src="/assets/images/dev-update-blog-feb-26-87e085fd872fe9407ca79f755629d44c.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is an important update on canister migration, a new proposal for <code>dfx</code> telemetry, and an exciting community project to showcase. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="canister-migration">Canister migration<a href="#canister-migration" class="hash-link" aria-label="Direct link to Canister migration" title="Direct link to Canister migration">​</a></h2><p>Work on the highly anticipated canister migration feature has begun! Canister migration will enable developers to move a canister from one subnet to another while preserving the canister's ID, state, and cycles balance. Canister migration will not preserve transient state such as canister metrics, logs, history, or reserved cycles.</p><p>Canister migration will be split across three phases:</p><ol><li><p>Canister state migration: A snapshot of the canister will be taken, downloaded, and then uploaded to the destination subnet. This will also enable developers to download and upload canister snapshots outside of the canister migration workflow.</p></li><li><p>Canister cycles migration: Achieved through a cycles wallet.</p></li><li><p>Canister ID migration: Achieved through a dedicated NNS system canister.</p></li></ol><p><a href="https://forum.dfinity.org/t/canister-migration/41585" target="_blank" rel="noopener noreferrer">Read all the details on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="telemetry-for-dfx">Telemetry for dfx<a href="#telemetry-for-dfx" class="hash-link" aria-label="Direct link to Telemetry for dfx" title="Direct link to Telemetry for dfx">​</a></h2><p>A new proposal regarding collecting analytics for <code>dfx</code> has been introduced on the forum. Telemetry for <code>dfx</code> would collect anonymous data about how users are utilizing <code>dfx</code> for different workflows and which error messages users experience. With this data, the DFINITY SDK team that develops <code>dfx</code> can gain insight into several aspects of the tooling, such as:</p><ul><li>Understanding which versions of <code>dfx</code> are being actively used.</li><li>Learning functionality is not being used and could be deprecated.</li><li>Which bug fixes and features should be prioritized.</li></ul><p>Data that would be collected includes:</p><ul><li>A randomly generated session ID.</li><li><code>dfx</code> version.</li><li><code>dfx</code> command being executed.</li><li>Parameters passed to the command, but will not include parameter values.</li><li>Exit code.</li><li>Replica reject codes.</li><li>Execution time.</li><li>Indication of whether the cycles ledger or a cycles wallet was used.</li><li>Type of network the project was deployed to.</li><li>Number and type of canisters in the project.</li><li>Type of identity used.</li></ul><p>Users would be able to opt out of telemetry data being collected from their environment through a <code>dfx</code> environment variable or a global configuration setting.</p><p>This proposal is open to community feedback and questions. Join the discussion on the <a href="https://forum.dfinity.org/t/dfx-telemetry-proposal-2025/41569" target="_blank" rel="noopener noreferrer">forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ice-task-runner-for-icp">ICE: Task runner for ICP<a href="#ice-task-runner-for-icp" class="hash-link" aria-label="Direct link to ICE: Task runner for ICP" title="Direct link to ICE: Task runner for ICP">​</a></h2><p>This week, we're showcasing the community project ICE: a task runner for ICP that is designed to provide a developer tooling workflow that feels similar to the hardhat tooling available in the Ethereum ecosystem. ICE can be installed via npm:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">npm i -S @ice.ts/runner @ice.ts/canisters</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can view sample canister projects on <a href="https://github.com/MioQuispe/ICE-example" target="_blank" rel="noopener noreferrer">GitHub</a> to test it out with.</p><p>The core features of ICE include:</p><ul><li>Type safety throughout.</li><li>NPM install canister: Install common canisters via npm, including the ledger canisters, Internet Identity, and NNS.</li><li>Smart defaults.</li><li>VSCode extension.</li></ul><p><a href="https://forum.dfinity.org/t/introducing-ice-a-task-runner-for-the-internet-computer-like-hardhat/41579" target="_blank" rel="noopener noreferrer">Learn more on the dev forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 19, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/02/19/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/02/19/news-and-updates/update"/>
        <updated>2025-02-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week we have new releases of dfx and the ICP JavaScript agent, plus some exciting updates to ICP Ninja.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Febuary 19, 2025" src="/assets/images/dev-update-blog-feb-19-27c4e85d96d7eecd2497220fc536718a.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week we have new releases of <code>dfx</code> and the ICP JavaScript agent, plus some exciting updates to ICP Ninja. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0250">dfx v0.25.0<a href="#dfx-v0250" class="hash-link" aria-label="Direct link to dfx v0.25.0" title="Direct link to dfx v0.25.0">​</a></h2><p>A new version of <code>dfx</code> has been released! New features in this release include:</p><ul><li><p>Significant changes regarding <code>dfx</code> command output that drastically simplifies the amount of output returned to the developer. Previous, detailed output can still be accessed via the <code>-v</code> verbose flag.</p></li><li><p>PocketIC implementation of the replica API can now be used in the local development. This will become the default in a future release. PocketIC can be used via the <code>dfx start --pocketic</code> command.</p></li><li><p>PocketIC now features a new <code>--impersonate &lt;prinicpal&gt;</code> workflow for testing calls sent from different principals.</p></li><li><p>Canisters now accept the settings flag <code>--wasm-memory-threshold &lt;threshold&gt;</code>.</p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.25.0" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-javascript-agent-v230">ICP JavaScript agent v2.3.0<a href="#icp-javascript-agent-v230" class="hash-link" aria-label="Direct link to ICP JavaScript agent v2.3.0" title="Direct link to ICP JavaScript agent v2.3.0">​</a></h2><p>The latest release of the ICP JavaScript agent has been published. Important updates in this release include:</p><ul><li><p>FetchRootKey: Newly refactored logic changes how the <code>fetchrootkey</code> is awaited before the first async call is made.</p></li><li><p>ReadState expiry rollback: Reverts a bug introduced in v2.1.3 regarding a reused <code>readstate</code> request with a mismatched <code>ingress_expiry</code>.</p></li><li><p>SyncTime: HttpAgent will now use an anonymous identity for syncTime calls. This fixes a bug where clocks diverging by greater than 5 minutes could not sync their time with the replica.</p></li><li><p>HttpAgent errors: Enhanced error messages with more information for logging and debugging.</p></li></ul><p><a href="https://github.com/dfinity/agent-js/releases/tag/v2.3.0" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-ninja-february-release">ICP Ninja: February release<a href="#icp-ninja-february-release" class="hash-link" aria-label="Direct link to ICP Ninja: February release" title="Direct link to ICP Ninja: February release">​</a></h2><p>ICP Ninja has received a huge upgrade! The web IDE tool introduced several new features, plus a brand new design. New features include:</p><ul><li><p>Ability to create a new project from a blank template rather than selecting an existing project.</p></li><li><p>Ability to reset project files to their default.</p></li><li><p>Enhanced AI assistant functionality, including explaining code snippets, fixing code syntax, and improving code syntax.</p></li><li><p>Improved example projects.</p></li><li><p>New example projects, including EVM Block Explorer.</p></li></ul><p>Be sure check to out <a href="https://icp.ninja" target="_blank" rel="noopener noreferrer">ICP Ninja</a> to view the cool new branding and website design as well!</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 12, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/02/12/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/02/12/news-and-updates/update"/>
        <updated>2025-02-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week we have exciting community updates to highlight, including IC-Solana, ICP C++ bootcamp, and CycleOps canister fleets.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Febuary 12, 2025" src="/assets/images/dev-update-blog-feb-12-7439c8c77567fd306185691fae31144b.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week we have exciting community updates to highlight, including IC-Solana, ICP C++ bootcamp, and CycleOps canister fleets. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ic-solana">IC-Solana<a href="#ic-solana" class="hash-link" aria-label="Direct link to IC-Solana" title="Direct link to IC-Solana">​</a></h2><p>IC-Solana is a new community project that provides a solution for connecting ICP dapps to Solana. IC-Solana uses an RPC canister similar to the EVM RPC canister used to interact with Ethereum and EVM networks. RPC canisters use HTTPS outcalls to send JSON RPC requests to RPC providers. IC-Solana can be used to retrieve Solana-specific data like block details and account information. It can also be used to sign and submit transactions directly to Solana using threshold signatures. Other key features of the project include integrated metrics, enhanced logging, and quorum-based validation that aggregates and validates responses from different RPC providers.</p><p><a href="https://forum.dfinity.org/t/ic-solana-gateway-for-interacting-with-solana-from-the-ic/41104" target="_blank" rel="noopener noreferrer">Learn more about IC-Solana</a> on the developer forum.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-c-bootcamp">ICP C++ bootcamp<a href="#icp-c-bootcamp" class="hash-link" aria-label="Direct link to ICP C++ bootcamp" title="Direct link to ICP C++ bootcamp">​</a></h2><p>A new episode of the ICP C++ bootcamp series has been released! ICPP-PRO is a C++ canister development kit (CDK) for building canisters written in C++. To help onboard users and get them started, the ICP C++ bootcamp series is designed to walk through the necessary developer environment setup and tooling.</p><p><a href="https://www.youtube.com/playlist?list=PLzpzHgGOuycIsK0mOiHMXLKq8Gf1VytkJ" target="_blank" rel="noopener noreferrer">You can find the full series on YouTube</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cycleops-canister-fleets">CycleOps canister fleets<a href="#cycleops-canister-fleets" class="hash-link" aria-label="Direct link to CycleOps canister fleets" title="Direct link to CycleOps canister fleets">​</a></h2><p>CycleOps has released a new exciting feature: canister fleets! To upload a canister fleet, CycleOps now supports adding hundreds of canisters at once through the new CSV upload capability. Once a fleet of canisters has been uploaded, the CycleOps dashboard will automatically aggregate the metrics for all canisters for easy access to key information like how many total cycles burned and which canisters have a healthy cycles balance.</p><p>View the full details about these changes on the <a href="https://docs.cycleops.dev/changelog/canister-fleets" target="_blank" rel="noopener noreferrer">CycleOps changelog</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 5, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/02/05/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/02/05/news-and-updates/update"/>
        <updated>2025-02-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a pre-release of Motoko v0.14.0, a new beta release of dfx, and proposals for SNS updates.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="February 5, 2025" src="/assets/images/dev-update-blog-feb-5-73d8aab94c0fca338d8246c570055c51.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a pre-release of Motoko <code>v0.14.0</code>, a new beta release of <code>dfx</code>, and new proposals for SNS updates. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0140">Motoko v0.14.0<a href="#motoko-v0140" class="hash-link" aria-label="Direct link to Motoko v0.14.0" title="Direct link to Motoko v0.14.0">​</a></h2><p>A new Motoko version has been pre-released and is available for testing on the <a href="https://play.motoko.org/" target="_blank" rel="noopener noreferrer">Motoko playground</a>!</p><p>This new version includes:</p><ul><li>Add <code>.values()</code> as an alias to <code>.vals()</code> for Arrays and Blobs.</li><li>Support explicit, safe migration of persistent data allowing arbitrary transformations on a selected subset of stable variables.</li><li>Additional static checks warn against possible data loss.</li></ul><p><a href="https://forum.dfinity.org/t/pre-release-moc-0-14-0-available-in-playground/40857" target="_blank" rel="noopener noreferrer">View the forum post</a> and <a href="https://github.com/dfinity/motoko/releases" target="_blank" rel="noopener noreferrer">full release notes</a> for more details.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0250-beta1">dfx v0.25.0-beta.1<a href="#dfx-v0250-beta1" class="hash-link" aria-label="Direct link to dfx v0.25.0-beta.1" title="Direct link to dfx v0.25.0-beta.1">​</a></h2><p>A new release of <code>dfx</code> is ready for beta testing! This release is jam-packed with new features and bug fixes. A small sample of new features includes:</p><ul><li>Streamlined output for asset synchronization.</li><li><code>dfx info pocketic-config-port</code>.</li><li>Streamlined output for <code>dfx new</code>.</li><li>Impersonating sender of requests to a local PocketIC instance.</li><li><code>dfx canister [create|update-settings] --wasm-memory-threshold</code>.</li><li><code>dfx start --pocketic</code> supports <code>--force</code> and shared networks.</li><li>Error when using insecure identity on the mainnet.</li></ul><p>Some of the bug fixes include:</p><ul><li><code>dfx canister install</code> and <code>dfx deploy with --no-asset-upgrade</code> no longer hang indefinitely when Wasm is not up to date.</li><li>Correctly detects hyphenated Rust bin crates.</li><li><code>dfx</code> downloads <code>.did</code> files for remote canisters.</li><li>Template frontends now have unsupported browser warnings, specifically for default security headers that cause Safari to break when viewing local canisters.</li><li><code>dfx deploy --by-proposal</code> no longer sends chunk data in <code>ProposeCommitBatch</code>.</li><li>All commands with <code>--all</code> parameter skip remote canisters.</li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.25.0-beta.1" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="proposals-for-sns-changes">Proposals for SNS changes<a href="#proposals-for-sns-changes" class="hash-link" aria-label="Direct link to Proposals for SNS changes" title="Direct link to Proposals for SNS changes">​</a></h2><p>Two new proposals have been submitted for SNS updates. These proposals are <a href="https://dashboard.internetcomputer.org/proposal/135067" target="_blank" rel="noopener noreferrer">135067</a> and <a href="https://dashboard.internetcomputer.org/proposal/135066" target="_blank" rel="noopener noreferrer">135066</a>. These proposals include:</p><ul><li><p>Enable SNSes to opt in for <a href="https://forum.dfinity.org/t/proposal-opt-in-mechanism-for-automatic-sns-target-version-advancement/39874" target="_blank" rel="noopener noreferrer">automatically advancing its target version</a>
to the newest version blessed by the NNS.</p></li><li><p>Do not redact chunked Wasm data in <code>ProposalInfo</code>.</p></li><li><p>The <code>LogVisibility</code> returned from <code>canister_status</code> has one more variant <code>allowed_viewers</code>, consistent with the corresponding management canister API.</p></li></ul><p><a href="https://forum.dfinity.org/t/sns-updates-2025-02-01/40743" target="_blank" rel="noopener noreferrer">Learn more on the forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 29, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/01/29/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/01/29/news-and-updates/update"/>
        <updated>2025-01-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there are some important updates regarding upgrading ledger canisters, the Inter-canister Event Utility working group, and a new agent for Elixir development.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 29, 2025" src="/assets/images/dev-update-blog-jan-29-efdeb4afa6be83efca1560c39775269e.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there are some important updates regarding upgrading ledger canisters, the Inter-canister Event Utility working group, and a new agent for Elixir development. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ledger-suite-upgrade">Ledger suite upgrade<a href="#ledger-suite-upgrade" class="hash-link" aria-label="Direct link to Ledger suite upgrade" title="Direct link to Ledger suite upgrade">​</a></h2><p>The DFINITY team has migrated the ICRC ledger suite to use stable storage for key data structures. In the past, ledgers could downgrade to the immediately previous version seamlessly. Using stable storage introduces a breaking change that makes the previous downgrade workflow no longer possible. Also, these updates implement several critical changes, meaning in order to upgrade to the latest ICRC ledger suite, you must follow a specific series of upgrade steps.</p><p>These upgrades should be applied to the ledger suite canisters Index, Ledger, and Archive in that order.</p><p>To learn more and view the important upgrade instructions, please read <a href="https://forum.dfinity.org/t/icrc-ledger-suite-upgrade/40655" target="_blank" rel="noopener noreferrer">the ledger suite upgrade forum post</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="inter-canister-event-utility-working-group">Inter-canister Event Utility working group<a href="#inter-canister-event-utility-working-group" class="hash-link" aria-label="Direct link to Inter-canister Event Utility working group" title="Direct link to Inter-canister Event Utility working group">​</a></h2><p>The Inter-canister Event Utility working group has resumed weekly meetings! This group is dedicated to discussing and developing event system architectures and workflows for ICP. One such common architecture is the PubSub structure, where one canister publishes data that another canister can subscribe to. This can be useful for canisters that want to get notifications about certain data from another canister or source, such as the ICP ledger publishing transaction info that a user can subscribe to.</p><p>The group meets every week on Wednesday at 7:00 pm CET. <a href="https://forum.dfinity.org/t/technical-working-group-inter-canister-event-utility-working-group/29048" target="_blank" rel="noopener noreferrer">Learn more</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-agent-elixir">ICP agent: Elixir<a href="#icp-agent-elixir" class="hash-link" aria-label="Direct link to ICP agent: Elixir" title="Direct link to ICP agent: Elixir">​</a></h2><p>A new ICP agent has been developed by the ICP community: the ICP agent for Elixir! Elixir is a general-purpose programming language that has grown in popularity for blockchain projects, instant messaging apps, video conferencing apps, and financial systems.</p><p>The ICP agent Elixir supports update and query calls on ICP. It authenticates calls using Secp256k1 keys.</p><p>You can learn more in the project's <a href="https://github.com/diodechain/icp_agent" target="_blank" rel="noopener noreferrer">GitHub repo</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 22, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/01/22/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/01/22/news-and-updates/update"/>
        <updated>2025-01-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have a new release of Motoko, a forum discussion regarding some changes to dfx, and an NNS proposal that adds 17 new API boundary nodes to the network.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 22, 2025" src="/assets/images/dev-update-blog-jan-22-1a6fefd57773221f2a384a240b095380.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have a new release of Motoko, a forum discussion regarding some changes to <code>dfx</code>, and an NNS proposal that adds 17 new API boundary nodes to the network. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0136">Motoko v0.13.6<a href="#motoko-v0136" class="hash-link" aria-label="Direct link to Motoko v0.13.6" title="Direct link to Motoko v0.13.6">​</a></h2><p>A new version of Motoko has been released! This release includes an important breaking change regarding orthogonal persistence:</p><ul><li>The Wasm persistence modes used internally for canister upgrades now use lowercase names <code>keep</code> and <code>replace</code> rather than <code>Keep</code> and <code>Replace</code>. If you are using actor classes with orthogonal persistence, you will need to recompile your code and upgrade it to use the latest <code>moc</code> and <code>dfx</code>.</li></ul><p>This release also includes support for low Wasm memory hooks <code>system func lowmemory() : async* () { ... } </code> and a few bug fixes:</p><ul><li><p>Mitigations and checks regarding timers.</p></li><li><p>Valid upgrades that delete a stable variable previously failed the <code>--enhanced-orthogonal-persistence</code> stable compatibility check.</p></li></ul><p><a href="https://github.com/dfinity/motoko/releases/tag/0.13.6" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="proposed-dfx-changes">Proposed <code>dfx</code> changes<a href="#proposed-dfx-changes" class="hash-link" aria-label="Direct link to proposed-dfx-changes" title="Direct link to proposed-dfx-changes">​</a></h2><p>A new change has been proposed on the forum for <code>dfx</code>: Remove the local replica with PocketIC. PocketIC is a canister testing tool that provides extensive, customizable testing capabilities in the local environment. <code>dfx</code> currently uses PocketIC in parallel with the local replica for CI testing without any substantial differences.</p><p>Replacing the replica with PocketIC will make <code>dfx</code> smaller to download, plus speed up local deployment times.</p><p>The SDK team has proposed a plan to remove the replica from <code>dfx</code> and replace it with PocketIC. You can read more about this plan on the <a href="https://forum.dfinity.org/t/dfx-replacing-the-local-replica-with-pocketic/40167" target="_blank" rel="noopener noreferrer">developer forum</a> and contribute to the discussion.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-api-boundary-nodes">New API boundary nodes<a href="#new-api-boundary-nodes" class="hash-link" aria-label="Direct link to New API boundary nodes" title="Direct link to New API boundary nodes">​</a></h2><p>NNS proposal <a href="https://dashboard.internetcomputer.org/proposal/134902" target="_blank" rel="noopener noreferrer">134902</a> has been executed, adding 17 new API boundary nodes to the ICP network. Each node was already part of the network but was previously unused before being converted into a boundary node. Nodes were chosen based on geographic location to ensure distribution across different regions.</p><p>This is a significant change and an important architecture milestone, as the network previously only had 3 API boundary nodes. With a total of 20 API boundary nodes in various regions across the globe, ICP will now feature a fully NNS-managed edge architecture, enabling clients such as <code>agent-rs</code> to connect directly to the network without relying on the traditional boundary node infrastructure.</p><p>You can learn more about this network change on <a href="https://forum.dfinity.org/t/proposal-134902-adding-17-api-boundary-nodes/40199" target="_blank" rel="noopener noreferrer">the forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 15, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/01/15/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/01/15/news-and-updates/update"/>
        <updated>2025-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have a roadmap milestone release, a few new tooling releases, and an important announcement about ETH Denver 2025.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 15, 2025" src="/assets/images/dev-update-blog-jan-15-776612524c8444219102443f9adc2bec.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have a roadmap milestone release, a few new tooling releases, and an important announcement about ETH Denver 2025. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="plasma-release-governance-milestone">Plasma release: Governance milestone<a href="#plasma-release-governance-milestone" class="hash-link" aria-label="Direct link to Plasma release: Governance milestone" title="Direct link to Plasma release: Governance milestone">​</a></h2><p>The first milestone of 2025 has been achieved! The Plasma milestone includes several new features on the NNS and new proposal types for deployed SNSes. Features in this milestone include:</p><ul><li><p>Neurons table design: New design for viewing neuron information.</p></li><li><p>Actionable proposals: Clearly see which proposals you can still vote on.</p></li><li><p>SNS name and logo change proposals: SNSes can now change their name and logo via proposal.</p></li><li><p>Canister-controlled neurons: New functionality for canisters to control a neuron.</p></li><li><p>Periodic confirmation: Facilitating active governance participation by periodically asking neurons to confirm their following configuration.</p></li><li><p>ICRC-1 token imports: Import any token that supports the ICRC-1 standard to the NNS.</p></li><li><p>Neuron visibility settings: Neurons can now be public or private. Public neurons can decide which information they expose about themselves.</p></li><li><p>Improved SNS upgrades.</p></li></ul><p>You can learn more about this milestone on the <a href="https://internetcomputer.org/roadmap#Governance%20&amp;%20Tokenomics-Plasma" target="_blank" rel="noopener noreferrer">ICP roadmap</a> or check out the <a href="https://www.youtube.com/watch?v=W01GOBBVY1w" target="_blank" rel="noopener noreferrer">milestone release livestream</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="tooling-releases">Tooling releases<a href="#tooling-releases" class="hash-link" aria-label="Direct link to Tooling releases" title="Direct link to Tooling releases">​</a></h2><p>A few new tooling releases are available:</p><ul><li><p><code>ic-repl</code> v0.7.7: <a href="https://github.com/dfinity/ic-repl/releases/tag/0.7.7" target="_blank" rel="noopener noreferrer">https://github.com/dfinity/ic-repl/releases/tag/0.7.7</a></p></li><li><p>Candid v0.10.12: <a href="https://github.com/dfinity/candid" target="_blank" rel="noopener noreferrer">https://github.com/dfinity/candid</a></p></li><li><p>Internet Identity: <a href="https://github.com/dfinity/internet-identity/releases/tag/release-2025-01-10" target="_blank" rel="noopener noreferrer">https://github.com/dfinity/internet-identity/releases/tag/release-2025-01-10</a></p></li><li><p><code>ic-wasm</code> v0.9.3: <a href="https://github.com/dfinity/ic-wasm/releases/tag/0.9.3" target="_blank" rel="noopener noreferrer">https://github.com/dfinity/ic-wasm/releases/tag/0.9.3</a></p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="eth-denver-2025">ETH Denver 2025<a href="#eth-denver-2025" class="hash-link" aria-label="Direct link to ETH Denver 2025" title="Direct link to ETH Denver 2025">​</a></h2><p>ICP will be at <a href="https://www.ethdenver.com/" target="_blank" rel="noopener noreferrer">ETH Denver 2025</a> and would love to see you there! For our developer ecosystem, we're offering some exciting opportunities to showcase your project during the event, including:</p><ul><li><p>Pitch opportunities: Demo your project at different side events that are sponsored by ICP.</p></li><li><p>Booth space: Chat with event attendees at the ICP booth, give live demos, or pass out merch.</p></li></ul><p>If you're interested in participating in either opportunity, fill out the <a href="https://docs.google.com/forms/d/e/1FAIpQLSdqWNBRiy-rW2uLt7lhW9am5a6NWidT956oBLrUjkV9gEOTJw/viewform" target="_blank" rel="noopener noreferrer">Google Form</a> to let us know!</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 8, 2025]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/01/08/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2025/01/08/news-and-updates/update"/>
        <updated>2025-01-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[To kick off the year, we have some exiting updates regarding the Motoko base library and ICP Ninja, plus a community conversation regarding ICRC-99 and ckNFTs.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 8, 2025" src="/assets/images/dev-update-blog-jan-8-d2cfab7ea0ecafcf032e44a8b6f85ec1.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and happy New Year! To kick off the year, we have some exciting updates regarding the Motoko base library and ICP Ninja, plus a community conversation regarding ICRC-99 and ckNFTs. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-base-library-changes">Motoko base library changes<a href="#motoko-base-library-changes" class="hash-link" aria-label="Direct link to Motoko base library changes" title="Direct link to Motoko base library changes">​</a></h2><p>The Motoko base library is undergoing some major changes to improve the readability of Motoko code and improve consistency. The first draft of the new API is available for the community to review and provide their input on, and it is highly recommended that you weigh in on the conversation now.</p><p>Check out the <a href="https://github.com/dfinity/new-motoko-base" target="_blank" rel="noopener noreferrer">new Motoko base library repo</a> and view the <a href="https://github.com/dfinity/new-motoko-base/discussions" target="_blank" rel="noopener noreferrer">discussion tab</a> to comment on proposals or submit your own improvements to the library.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-ninja-updates">ICP Ninja updates<a href="#icp-ninja-updates" class="hash-link" aria-label="Direct link to ICP Ninja updates" title="Direct link to ICP Ninja updates">​</a></h2><p><a href="https://icp.ninja/" target="_blank" rel="noopener noreferrer">ICP Ninja</a> has some exciting new features to enhance the web-based IDE. Some of these updates include:</p><ul><li><p>Ask AI: Chat with the ICP AI assistant directly in ICP Ninja to get info about ICP concepts, ask questions about your code, or provide the AI code to debug. Select from a variety of follow-up questions to continue the learning experience and continue to develop your skills!</p></li><li><p>New IDE design that includes support for multiple tabs, a preview of the project's frontend, and a preview of the interfaces exposed by the backend canister.</p></li><li><p>Syntax error highlighting for Motoko.</p></li><li><p>Package loading with linting.</p></li><li><p>Updates to the Hello, world! example to include orthogonal persistence.</p></li></ul><p>You can learn more about these updates <a href="https://forum.dfinity.org/t/icp-ninja-christmas-market-release/39118" target="_blank" rel="noopener noreferrer">on the forum</a> or try ICP Ninja out for yourself at <a href="https://icp.ninja" target="_blank" rel="noopener noreferrer">https://icp.ninja</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-discussion-icrc-99-and-cknfts">Community discussion: ICRC-99 and ckNFTs<a href="#community-discussion-icrc-99-and-cknfts" class="hash-link" aria-label="Direct link to Community discussion: ICRC-99 and ckNFTs" title="Direct link to Community discussion: ICRC-99 and ckNFTs">​</a></h2><p>A community conversation has been initiated on the forum regarding ckNFTs and the ICRC-99 standard. ckNFTs are a type of NFT that has been ported from an EVM chain onto ICP. In the code's current state, each source smart contract from the EVM chain would receive its own ckNFT canister that uses the ICRC-7, ICRC-37, and ICRC-3 standards. Once the NFT is on ICP, it can be cast to another EVM chain via the ICRC-99 standard, which sets parameters for casting to other networks.</p><p>One example of how this might be used is:</p><ul><li>An NFT is minted on Ethereum.</li><li>The NFT is ported to ICP and is held in its ckNFT canister.</li><li>The owner sells it on an ICRC-7 marketplace on ICP.</li><li>The buyer ports the NFT to Base, and then they can list it on another marketplace such as OpenSea.</li></ul><p>The developers working on this concept, ICDevs.org, have opened up the conversation to ask for community ideas, feedback, and creative solutions to some of the issues they're currently experiencing.</p><p><a href="https://forum.dfinity.org/t/discussion-icrc-99-and-cknfts/39480" target="_blank" rel="noopener noreferrer">Join the discussion</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update December 18, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/12/28/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/12/28/news-and-updates/update"/>
        <updated>2024-12-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're going to take a look at the road ahead for ICP developers in 2025 and dive into some roadmap items and ongoing initiatives that we'll see take the stage in the new year.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="December 18 2024" src="/assets/images/dev-update-blog-dec-18-ba25c093d2d0088339849a3e6f61e0b1.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we're going to take a look at the road ahead for ICP developers in 2025 and dive into some roadmap items and ongoing initiatives that we'll see take the stage in the new year. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="roadmap-milestones">Roadmap milestones<a href="#roadmap-milestones" class="hash-link" aria-label="Direct link to Roadmap milestones" title="Direct link to Roadmap milestones">​</a></h2><p>In 2025, ICP will work toward several roadmap milestones, including:</p><ul><li><p>Flux: Focused on increasing network compute capacity and scalability, Flux plans to implement asynchronous checkpointing and canister migration between subnets.</p></li><li><p>Ignition: Part of the decentralized AI roadmap, the Ignition milestone will expand compute and memory capabilities of canisters.</p></li><li><p>Helium: Next up in the Chain Fusion roadmap is an integration with Solana through a Solana RPC canister.</p></li><li><p>Niobium: The long-awaited vetKeys feature enabling decentralized key management.</p></li></ul><p>You can view details about the roadmap on <a href="https://internetcomputer.org/roadmap" target="_blank" rel="noopener noreferrer">internetcomputer.org</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="decentralized-ai-deai-manifesto">Decentralized AI: DeAI Manifesto<a href="#decentralized-ai-deai-manifesto" class="hash-link" aria-label="Direct link to Decentralized AI: DeAI Manifesto" title="Direct link to Decentralized AI: DeAI Manifesto">​</a></h2><p>Decentralized AI on ICP is just getting started and will be a major topic of conversation and development in 2025. Recently, the DeAI working group put together the <a href="https://deaimanifesto.com/" target="_blank" rel="noopener noreferrer">DeAI Manifesto</a>, a set of parameters and values that they believe will drive decentralized AI across all ecosystems—not just ICP. Some of these values include:</p><ul><li><p>DeAI is safe AI.</p></li><li><p>DeAI is responsible AI.</p></li><li><p>DeAI is verifiable. AI</p></li></ul><p>You can read and sign the <a href="https://deaimanifesto.com/" target="_blank" rel="noopener noreferrer">DeAI Manifesto</a> to participate in DeAI on ICP.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-developer-ecosystem-growth">ICP developer ecosystem growth<a href="#icp-developer-ecosystem-growth" class="hash-link" aria-label="Direct link to ICP developer ecosystem growth" title="Direct link to ICP developer ecosystem growth">​</a></h2><p>In the <a href="https://www.developerreport.com/developer-report" target="_blank" rel="noopener noreferrer">Electric Capital 2024 Developer Report</a>, the ICP developer community ranked highly across several different statistics, including:</p><ul><li><p>In 2024, ICP was the third largest ecosystem for new developers.</p></li><li><p>In 2024, ICP was the second highest chain for full-time developer growth.</p></li><li><p>In Africa, ICP was the third most popular blockchain ecosystem.</p></li></ul><p>More details can be found <a href="https://x.com/dfinity/status/1867619158906876252" target="_blank" rel="noopener noreferrer">on X</a>.</p><p>That'll wrap up this week and this year! Tune back in 2025 for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update December 11, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/12/11/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/12/11/news-and-updates/update"/>
        <updated>2024-12-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have an important Motoko security update, an upgrade to the NNS Chain Fusion signer canister, and a new package from Mops- regex.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="December 11 2024" src="/assets/images/dev-update-blog-dec-11-9ea9b9016d663f9a69c6f6025285f247.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have an important Motoko security update, an upgrade to the NNS Chain Fusion signer canister, and a new package from Mops: regex. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-security-fix-in-dfx-v0243">Motoko security fix in dfx v0.24.3<a href="#motoko-security-fix-in-dfx-v0243" class="hash-link" aria-label="Direct link to Motoko security fix in dfx v0.24.3" title="Direct link to Motoko security fix in dfx v0.24.3">​</a></h2><p>A security bug in Motoko was recently discovered that, under certain circumstances, may lead to unwanted memory reads or writes. This bug only affected those using the incremental garbage collector or enhanced orthogonal persistence and was hard to trigger depending on heap constellations, garbage collection scheduling, and specific language features used at a large scale.</p><p>This bug has been fixed in Motoko v0.14.3, which is included in <code>dfx</code> v0.24.3 and newer. It is highly recommended to upgrade to the latest <code>dfx</code> version if you are using the incremental garbage collector or enhanced orthogonal persistence.</p><p><a href="https://forum.dfinity.org/t/security-fix-in-motoko-dfx-0-24-3/38656/1" target="_blank" rel="noopener noreferrer">Learn more on the dev forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="upgrade-nns-canister-chain-fusion-signer">Upgrade NNS canister: Chain Fusion signer<a href="#upgrade-nns-canister-chain-fusion-signer" class="hash-link" aria-label="Direct link to Upgrade NNS canister: Chain Fusion signer" title="Direct link to Upgrade NNS canister: Chain Fusion signer">​</a></h2><p>The latest update to the Chain Fusion signer canister can be used to sign transactions from APIs directly from a web browser or off-chain client.</p><p>NNS proposal 134424 introduces Schnorr signatures to be added to the signer canister API, specifically adding the <code>schnorr_public_key()</code> and <code>schnorr_sign()</code> methods. The Schnorr API can also be used to sign Solana transactions.</p><p><a href="https://forum.dfinity.org/t/upgrade-nns-canister-chain-fusion-signer/38623/1" target="_blank" rel="noopener noreferrer">Read more on the dev forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="mops-regex-package">Mops regex package<a href="#mops-regex-package" class="hash-link" aria-label="Direct link to Mops regex package" title="Direct link to Mops regex package">​</a></h2><p>A new Mops package has been released: regex. This package allows you to use regex patterns for objects and flags. The team behind this package has published a <a href="https://www.youtube.com/watch?v=O1dOZfK6DQA" target="_blank" rel="noopener noreferrer">tutorial video</a>.</p><p>You can install the Motoko regex package with:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">mops add regex</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p><a href="https://forum.dfinity.org/t/motoko-regex-is-live-on-mops/37428/1" target="_blank" rel="noopener noreferrer">Learn more on the dev forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update December 4, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/12/04/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/12/04/news-and-updates/update"/>
        <updated>2024-12-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week we have a new release of dfx, an important update about the Bitcoin integration, and an update from the community project Juno.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="December 4 2024" src="/assets/images/dev-update-blog-dec-4-8958fd93eabf0e47f73cc3683ca729dd.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week we have a new release of <code>dfx</code>, an important update about the Bitcoin integration, and an update from the community project Juno. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0243">dfx v0.24.3<a href="#dfx-v0243" class="hash-link" aria-label="Direct link to dfx v0.24.3" title="Direct link to dfx v0.24.3">​</a></h2><p>The latest version of <code>dfx</code> is now promoted! This latest update includes new features such as:</p><ul><li><p>PocketIC now supports Bitcoin through the <code>--enable-bitcoin</code> and <code>--bitcoin-node</code> flags.</p></li><li><p>The canisters for the ICP, ckBTC, and ckETH ledger canisters can now be pulled.</p></li><li><p>The frontend canister now supports setting canister permissions in the init arguments.</p></li><li><p>Output for <code>dfx start</code> and <code>dfx cycles</code> have been improved. </p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.24.3" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bitcoin-integration-updates">Bitcoin integration updates<a href="#bitcoin-integration-updates" class="hash-link" aria-label="Direct link to Bitcoin integration updates" title="Direct link to Bitcoin integration updates">​</a></h2><p>The Bitcoin Testnet API is being migrated from Testnet v3 to Testnet v4. To support this work, the ckTestBTC minter has been stopped and the Bitcoin Testnet API has been disabled. Once the migration has finished, these features will be re-enabled.</p><p>You can stay up to date on the status via the <a href="https://forum.dfinity.org/t/direct-integration-with-bitcoin/6147/743?u=cryptoschindler" target="_blank" rel="noopener noreferrer">forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="juno-v0039">Juno v0.0.39<a href="#juno-v0039" class="hash-link" aria-label="Direct link to Juno v0.0.39" title="Direct link to Juno v0.0.39">​</a></h2><p>A new version of Juno has been released! This latest version introduces backups to Juno through the new ICP canister snapshot feature. Backups are available through both the Juno API and the Juno CLI tool.</p><p><a href="https://github.com/junobuild/juno/releases/tag/v0.0.39" target="_blank" rel="noopener noreferrer">Learn more in the Juno release notes</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 27, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/11/27/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/11/27/news-and-updates/update"/>
        <updated>2024-11-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week we have two community projects to showcase, Toolkit and Linkpin, and a reminder about developer office hours in the ICP Discord.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 27 2024" src="/assets/images/dev-update-blog-nov-27-5529569227e81dff39c41c100d791a71.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week we have two community projects to showcase, Toolkit and Linkpin, and a reminder about developer office hours in the ICP Discord. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="toolkit">Toolkit<a href="#toolkit" class="hash-link" aria-label="Direct link to Toolkit" title="Direct link to Toolkit">​</a></h2><p>Toolkit is a dapp management platform with an initial focus on providing tooling for Service Nervous System (SNS) projects. It is designed to simplify dapp development, deployment, scaling, and collaboration. It provides tools to interact with SNS treasuries, mechanisms, and proposals. Developers can also use Toolkit to experiment with dapp governance and management.</p><p><a href="https://docs.ic-toolkit.app/docs/intro" target="_blank" rel="noopener noreferrer">Learn more about Toolkit</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="linkpin">Linkpin<a href="#linkpin" class="hash-link" aria-label="Direct link to Linkpin" title="Direct link to Linkpin">​</a></h2><p>Linkpin is an onchain bookmark manager, enabling you to login with Internet Identity, save a URL as a bookmark, and then reference that bookmark at a later time. Bookmarks can be managed by alphabetical order, number of clicks, or the last time you visited them. Linkpin utilizes ICP for all data storage and uses a backend written in Motoko.</p><p>Linkpin is open source and fully customizable. Check out the code on <a href="https://github.com/tagoso/linkpin" target="_blank" rel="noopener noreferrer">GitHub</a> for more information.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-office-hours">Developer office hours<a href="#developer-office-hours" class="hash-link" aria-label="Direct link to Developer office hours" title="Direct link to Developer office hours">​</a></h2><p>Every Wednesday, the ICP Discord server hosts two office hour sessions: 9 AM CET (8 AM UTC) and 10:30 AM PST (18:30 UTC). Each office hour is hosted in a drop-in style, enabling you to drop into the conversation as you please.</p><p>Join the ICP Developer Discord: <a href="https://discord.internetcomputer.org/" target="_blank" rel="noopener noreferrer">https://discord.internetcomputer.org/</a></p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 20, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/11/20/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/11/20/news-and-updates/update"/>
        <updated>2024-11-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have tooling updates for PocketIC, dfx, and Motoko.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 20 2024" src="/assets/images/dev-update-blog-nov-20-e5699f136bef4463e0bc127410793ba7.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have tooling updates for PocketIC, dfx, and Motoko. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pocketic-700">PocketIC 7.0.0<a href="#pocketic-700" class="hash-link" aria-label="Direct link to PocketIC 7.0.0" title="Direct link to PocketIC 7.0.0">​</a></h2><p>A new version of PocketIC has been released! This version is packed with new features, including:</p><ul><li><p>Windows support for using the Rust library natively on Windows if Windows Subsystem for Linux (WSL) is installed.</p></li><li><p>New server endpoint: <code>/instances/&lt;instance_id&gt;/_/topology</code></p></li><li><p>New Rust library module for using the management canister: <code>pocket_ic::management_canister</code>.</p></li><li><p>Bitcoin integration support via the management canister.</p></li></ul><p><a href="https://forum.dfinity.org/t/pocketic-version-7-0-0-bitcoin-integration-and-windows-support/37344" target="_blank" rel="noopener noreferrer">Read more on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0242"><code>dfx v0.24.2</code><a href="#dfx-v0242" class="hash-link" aria-label="Direct link to dfx-v0242" title="Direct link to dfx-v0242">​</a></h2><p>The latest version of <code>dfx</code> has been released this past week. This release includes new features such as:</p><ul><li><p>All commands will use the <code>DFX_NETWORK</code> environment variable by default if it is set. The <code>--network</code> flag will take precedence if provided.</p></li><li><p><code>dfx generate</code> honors the <code>--network</code> flag.</p></li><li><p>Support for the canister log allowed viewer list.</p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.24.2" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0132">Motoko v0.13.2<a href="#motoko-v0132" class="hash-link" aria-label="Direct link to Motoko v0.13.2" title="Direct link to Motoko v0.13.2">​</a></h2><p>The most recent version of Motoko enables an actor's self identifier to be available in the top-level block, allowing functions to refer to self from the initializer.</p><p><a href="https://github.com/dfinity/motoko/releases/tag/0.13.2" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 13, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/11/13/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/11/13/news-and-updates/update"/>
        <updated>2024-11-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have three roadmap milestone releases, Tokamak, Beryllium, and Stellarator, changes to the periodic confirmation feature, and information about upcoming support for BIP341 taproot signatures.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 13 2024" src="/assets/images/dev-update-blog-nov-13-98e418c071a4782af44afd9bffa6bdc6.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have three roadmap milestone releases, Tokamak, Beryllium, and Stellarator, changes to the periodic confirmation feature, and information about upcoming support for BIP341 taproot signatures. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="roadmap-milestones-tokamak-beryllium-and-stellarator">Roadmap milestones: Tokamak, Beryllium, and Stellarator<a href="#roadmap-milestones-tokamak-beryllium-and-stellarator" class="hash-link" aria-label="Direct link to Roadmap milestones: Tokamak, Beryllium, and Stellarator" title="Direct link to Roadmap milestones: Tokamak, Beryllium, and Stellarator">​</a></h2><p>This week, ICP has achieved three huge, highly anticipated roadmap milestones! Tokamak, Beryllium, and Stellarator each bring new features and capabilities to the network, bringing Web3 users closer than ever to Web2-level performance and scale.</p><p>Tokamak signifies enhancements to end-to-end latency calls through abortable broadcast over QUIC, improvements to the Boundary Node routing logic, and synchronous update calls. The team wrote a fantastic <a href="https://medium.com/dfinity/tokamak-accelerating-the-internet-computer-update-call-lifecycle-f82517472709" target="_blank" rel="noopener noreferrer">blog post</a> with all the details and some latency statistics.</p><p>Beryllium includes several developer experience enhancements, several of which have been requested by the dev community for quite a while. These include canister snapshots, canister logging, backtraces, errors, and standardized response codes. <a href="https://medium.com/dfinity/elevating-the-devops-experience-on-icp-with-beryllium-785db231e4dd" target="_blank" rel="noopener noreferrer">More info</a> can be found on the blog as well.</p><p>Lastly, the Stellarator milestone unlocks 1 TiB of memory <em>per subnet</em>, enabling several new data-rich use cases that may have been previously limited by storage constraints. Stellarator contains three important components, each with a <a href="https://medium.com/dfinity/a-journey-into-stellarator-part-1-c3e0a2f2e4e7" target="_blank" rel="noopener noreferrer">dedicated blog post</a>.</p><p>Curious what's next? Check out the full <a href="/roadmap">ICP roadmap</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="periodic-confirmation-changes">Periodic confirmation changes<a href="#periodic-confirmation-changes" class="hash-link" aria-label="Direct link to Periodic confirmation changes" title="Direct link to Periodic confirmation changes">​</a></h2><p>A forum post has been released that details proposed changes to the NNS periodic confirmation feature. Within this proposal, there are changes to the API that would add a new field to neurons called <code>voting_power_refreshed_timestamp_seconds</code> which indicates when the neuron last voted, set following, or confirmed following.</p><p>You can read more about these proposed changes on the <a href="https://forum.dfinity.org/t/periodic-confirmation-api-changes-release-plan/37237" target="_blank" rel="noopener noreferrer">ICP developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="upcoming-bip341-taproot-support">Upcoming BIP341 Taproot support<a href="#upcoming-bip341-taproot-support" class="hash-link" aria-label="Direct link to Upcoming BIP341 Taproot support" title="Direct link to Upcoming BIP341 Taproot support">​</a></h2><p>ICP recently rolled out support for threshold Schnorr signatures, including BIP-340 Schnorr. This support did not include BIP-341, also known as Taproot.</p><p>The IC interface specification has drafted an extension of the <code>sign_with_schnorr</code> interface to support BIP-341. You can <a href="https://github.com/dfinity/interface-spec/pull/344" target="_blank" rel="noopener noreferrer">review the interface spec draft</a> for more information.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 6, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/11/06/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/11/06/news-and-updates/update"/>
        <updated>2024-11-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is an announcement regarding improvements to verifiable credentials, a new Developer Liftoff video, and a community spotlight for ICPTopup.com.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 6 2024" src="/assets/images/dev-update-blog-nov-6-92128c8cf76a79261f7451ff4d41239f.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is an announcement regarding improvements to verifiable credentials, a new Developer Liftoff video, and a community spotlight for ICPTopup.com. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="verifiable-credentials-new-field-and-rust-crate">Verifiable credentials: new field and Rust crate<a href="#verifiable-credentials-new-field-and-rust-crate" class="hash-link" aria-label="Direct link to Verifiable credentials: new field and Rust crate" title="Direct link to Verifiable credentials: new field and Rust crate">​</a></h2><p>A proposal has been submitted to upgrade Internet Identity and add a new field to the alias credentials for verifiable credential issuers and relying parties: <code>derivationOrigin</code>. This field contains the URL that was used to derive the verifiable credential issuer or relying party user principal. It is recommended that the verifiable credential issuer and relying party both check that this URL has the correct value.</p><p>In addition to this proposed change, the Rust crate <code>ic-verifiable-credentials</code> has been published. This crate can be used to issue verifiable credentials and verify ID alias credentials received from an identity provider.</p><p>You can <a href="https://nns.ic0.app/proposal/?u=qoctq-giaaa-aaaaa-aaaea-cai&amp;proposal=133801" target="_blank" rel="noopener noreferrer">view the proposal</a> for more information or <a href="https://crates.io/crates/ic-verifiable-credentials" target="_blank" rel="noopener noreferrer">download the Rust crate</a> to start using these features in your Rust canisters.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-developer-liftoff-52">ICP Developer Liftoff 5.2<a href="#icp-developer-liftoff-52" class="hash-link" aria-label="Direct link to ICP Developer Liftoff 5.2" title="Direct link to ICP Developer Liftoff 5.2">​</a></h2><p>A new episode of the ICP Developer Liftoff video series has been released! In this episode, "Deploying an ETH starter project on ICP," developers will learn how to use the EVM RPC canister to interact with the Ethereum network from within an ICP canister. The starter project is built using Motoko, React, and the EVM RPC canister. This tutorial is a great first step to building powerful cross-chain applications!</p><p>You can watch the <a href="https://www.youtube.com/watch?v=3XHbK5yn_8s" target="_blank" rel="noopener noreferrer">video on YouTube</a> or follow the written <a href="/tutorials/developer-liftoff/level-5/5.2-ICP-ETH-tutorial">tutorial</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-spotlight-icptopupcom">Community spotlight: ICPTopup.com<a href="#community-spotlight-icptopupcom" class="hash-link" aria-label="Direct link to Community spotlight: ICPTopup.com" title="Direct link to Community spotlight: ICPTopup.com">​</a></h2><p>From the team behind CycleOps, a new canister management tool has been released! ICPTopup.com is designed to be the easiest way to top up canisters. You can provide ICPTopup with multiple canister IDs at once, then choose the amount each canister should be topped up, add funds, and you're good to go!</p><p>ICPTopup uses ICRC-2 approvals, which allow the service to use a single API call to top up canisters.</p><p><a href="https://forum.dfinity.org/t/icptopup-com-the-easiest-way-to-top-up-canisters-with-cycles/36434" target="_blank" rel="noopener noreferrer">Learn more on the developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 30, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/30/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/30/news-and-updates/update"/>
        <updated>2024-10-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there are several exciting and important discussions happening on the ICP developer forum. In this update, we'll cover the suggested changes to improve the network's [scalability](https://learn.internetcomputer.org/hc/en-us/articles/34576974172692-Evolution-Scaling) and reduce latency, an increase in cycles cost, and a new design for SNS proposals.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 30 2024" src="/assets/images/dev-update-blog-oct-30-0e723d2a57eb8ac442906c1e5db3ee2f.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there are several exciting and important discussions happening on the ICP developer forum. In this update, we'll cover the suggested changes to improve the network's scalability and reduce latency, an increase in cycles cost, and a new design for SNS proposals. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="discussion-suggestions-to-reduce-latency-and-improve-network-scalability">Discussion: Suggestions to reduce latency and improve network scalability<a href="#discussion-suggestions-to-reduce-latency-and-improve-network-scalability" class="hash-link" aria-label="Direct link to Discussion: Suggestions to reduce latency and improve network scalability" title="Direct link to Discussion: Suggestions to reduce latency and improve network scalability">​</a></h2><p>In recent weeks, certain ICP subnets have seen an increase in subnet load. This increase has resulted in periods of high latency for canisters to send and receive messages and has led to a degraded user experience. It has also opened discussions about the network's plans for scalability.</p><p>To reduce latency on subnets with higher loads and improve the overall scalability of the network, DFINITY has proposed the following changes be considered:</p><ul><li>Remove heartbeats from SNS canisters.</li><li>Focus on improvements to the replica.</li><li>Make adjustments to the cost of resources on the network by increasing the cycles cost.</li><li>Add new subnets.</li></ul><p><a href="https://forum.dfinity.org/t/suggested-measures-to-reduce-latency-and-improve-icp-scalability/36564" target="_blank" rel="noopener noreferrer">Check out the discussion on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="proposed-cycles-increase">Proposed cycles increase<a href="#proposed-cycles-increase" class="hash-link" aria-label="Direct link to Proposed cycles increase" title="Direct link to Proposed cycles increase">​</a></h2><p>One of the proposed changes to improve network scalability is to increase the cycles cost of some resources. This proposal is to ensure that the pricing for network usage accurately reflects the operational costs. Specifically, this proposed increase would make changes to:</p><ul><li>The message base fee: Increase from 590K to 5M cycles.</li><li>Instruction fee: Increase from 0.4 to 1 cycle.</li><li>Canister installation fee: Increase from 0.1T to 0.5T cycles.</li></ul><p>If these increases are approved by the NNS and implemented, the estimated impact will range from a 15% to 70% cost increase for applications.</p><p><a href="https://forum.dfinity.org/t/evaluating-compute-pricing-in-response-to-increased-demand-on-the-internet-computer-protocol/36565/1" target="_blank" rel="noopener noreferrer">Join the discussion and leave your thoughts in the forum thread</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="changes-to-sns-proposals">Changes to SNS proposals<a href="#changes-to-sns-proposals" class="hash-link" aria-label="Direct link to Changes to SNS proposals" title="Direct link to Changes to SNS proposals">​</a></h2><p>SNS proposal voting is critical for SNSes to apply important changes or add new features. Each SNS can define custom proposal types to fit the needs of their community. If some SNSes have hundreds of proposal types, it can be hard for SNS users to setup proposal following for each proposal type.</p><p>To make SNS proposal following easier, DFINITY is proposing to allow SNS proposal types to be grouped into proposal topics, similar to how the NNS groups proposals by topic. In this design, built-in and custom proposals could be within the same topic, and a topic can be defined as 'critical', setting all proposals within that topic as 'critical' proposals.</p><p>Want to learn more? <a href="https://forum.dfinity.org/t/sns-topics-design/36779" target="_blank" rel="noopener noreferrer">Read the full details</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 23, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/23/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/23/news-and-updates/update"/>
        <updated>2024-10-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have new tooling updates for the ICP JavaScript agent and dfx, community discussions on proposed changes to the Bitcoin integration and a new ICRC standard, and an upcoming ICP hackathon.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 23 2024" src="/assets/images/dev-update-blog-oct-23-768b211b1f7be661e4f72b53783ed5fa.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have new tooling updates for the ICP JavaScript agent and dfx, community discussions on proposed changes to the Bitcoin integration and a new ICRC standard, and an upcoming ICP hackathon. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="tooling-updates">Tooling updates<a href="#tooling-updates" class="hash-link" aria-label="Direct link to Tooling updates" title="Direct link to Tooling updates">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-javascript-agent-v213">ICP JavaScript agent <code>v2.1.3</code><a href="#icp-javascript-agent-v213" class="hash-link" aria-label="Direct link to icp-javascript-agent-v213" title="Direct link to icp-javascript-agent-v213">​</a></h3><p>A new release of the ICP JavaScript agent is available! <code>v2.1.3</code> focuses on fixes and error handling adjustments, including:</p><ul><li><p>Fixed <code>read_polling</code> request failures where the request failed after the initial expiration but before the request was processed.</p></li><li><p>Regression check when calling the management canister using <code>sync_call</code>.</p></li><li><p>New <code>ActorCallError</code> class.</p></li><li><p>Fixed <code>reject_code</code> and <code>reject_message</code> not being passed correctly in synchronous call reject or trap responses.</p></li><li><p>Support for <code>AgentError</code> and <code>AgentCallError</code> <code>instanceof</code> checks.</p></li></ul><p><a href="https://github.com/dfinity/agent-js/releases/tag/v2.1.3" target="_blank" rel="noopener noreferrer">View the full release notes</a> or leave your feedback on the <a href="https://forum.dfinity.org/t/agent-js-2-1-3-is-released/36473" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0241-promoted"><code>dfx v0.24.1</code> promoted<a href="#dfx-v0241-promoted" class="hash-link" aria-label="Direct link to dfx-v0241-promoted" title="Direct link to dfx-v0241-promoted">​</a></h3><p><code>dfx v0.24.1</code> is now promoted! This release includes:</p><ul><li><p>Support for the PocketIC flags: <code>--artificial-delay</code>, <code>subnet_type</code> and <code>--enable-canister-http</code>.</p></li><li><p>Motoko enhanced orthogonal persistence.</p></li><li><p>Best-effort responses.</p></li><li><p>Canister panic backtraces.</p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.24.1" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0242-beta"><code>dfx v0.24.2</code> beta<a href="#dfx-v0242-beta" class="hash-link" aria-label="Direct link to dfx-v0242-beta" title="Direct link to dfx-v0242-beta">​</a></h3><p><code>dfx v0.24.2</code> is now available for beta testing! This version includes:</p><ul><li><p>Support for the canister log allowed viewer list. Specified users can view a canister's logs without being a controller of the canister.</p></li><li><p>Support for batch upload assets. Frontend canisters now try to batch multiple small content chunks into a single call using the <code>create_chunks</code> method.</p></li><li><p>Support for Motoko <code>0.13.2</code>.</p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.24.2-beta.0" target="_blank" rel="noopener noreferrer">View the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-discussions">Community discussions<a href="#community-discussions" class="hash-link" aria-label="Direct link to Community discussions" title="Direct link to Community discussions">​</a></h2><p>There are some notable community discussions happening on the developer forum! These include:</p><ul><li><p><a href="https://forum.dfinity.org/t/direct-integration-with-bitcoin/6147/729" target="_blank" rel="noopener noreferrer">Proposed Bitcoin integration changes</a>: Proposal to deprecate the Bitcoin API and advise developers to call Bitcoin canisters directly, migrate control of the Bitcoin testnet to DFINITY, and update the Bitcoin testnet canister from using testnet3 to testnet4.</p></li><li><p><a href="https://forum.dfinity.org/t/request-for-feedback-icrc-97-nft-metadata-standard/36423" target="_blank" rel="noopener noreferrer">Request for feedback: ICRC-97</a>: ICRC-97 proposes a standard for NFT metadata, providing a minimum standard for wallets and marketplaces to display NFTs.</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="united-nations-coding4integrity-hackathon">United Nations Coding4Integrity Hackathon<a href="#united-nations-coding4integrity-hackathon" class="hash-link" aria-label="Direct link to United Nations Coding4Integrity Hackathon" title="Direct link to United Nations Coding4Integrity Hackathon">​</a></h2><p>The United Nations Coding4Integrity Hackathon begins this Friday, October 25th, and runs through November 3rd. This virtual hackathon has two tracks that hackers can enter: AI and NFTs. Hackers can build for as long or as little as they'd like during the hackathon and enter to win a prize from the pool of $70,000.</p><p><a href="https://knowledgefound.org/hackathons/virtual/2024/" target="_blank" rel="noopener noreferrer">Learn more or register today!</a></p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 16, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/16/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/16/news-and-updates/update"/>
        <updated>2024-10-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, there is a new release of the `dfx` SNS extension, a new `dfx` beta version, and best-effort responses are now available for beta testing.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 16 2024" src="/assets/images/dev-update-blog-oct-16-e345a0fcce06a039066b3dcd682257f8.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, there is a new release of the <code>dfx</code> SNS extension, a new <code>dfx</code> beta version, and best-effort responses are now available for beta testing. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-sns-extension-version-046">dfx SNS extension version 0.4.6<a href="#dfx-sns-extension-version-046" class="hash-link" aria-label="Direct link to dfx SNS extension version 0.4.6" title="Direct link to dfx SNS extension version 0.4.6">​</a></h2><p>A new release of the <code>dfx</code> SNS extension is available! In the latest version, <code>0.4.6</code>, a new command has been added: <code>dfx sns health</code>. Running this command will display a dashboard that includes essential health metrics for every SNS. These metrics include cycles usage, memory usage, and if the SNS is behind the latest SNS release. All SNSes are shown on this dashboard, making it easy to view the information for ones you're interested in.</p><p>You can install this <code>dfx</code> extension with the command:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx extension install sns --version 0.4.6</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="best-effort-responses">Best-effort responses<a href="#best-effort-responses" class="hash-link" aria-label="Direct link to Best-effort responses" title="Direct link to Best-effort responses">​</a></h2><p>Best-effort responses are now supported in <code>dfx</code> version 0.24.1-beta.1 and can be used for experimentation locally. They are not currently supported on the mainnet.</p><p>Best-effort responses provide two immediate benefits:</p><ul><li><p>Untrusted canisters can be called safely. The callee cannot make a canister wait indefinitely for a response, meaning a canister will not be prevented from stopping or being safely upgraded.</p></li><li><p>Canister call times can now be predicted.</p></li></ul><p>There are a few use cases that need caution when using best-effort responses, however, including:</p><ul><li><p>Calls where the callee executes a state change, such as a token transfer, must be careful to ensure that the call is either safely retired or the results are obtained.</p></li><li><p>Cycles transfers must be careful that if a timeout occurs, cycles will be lost.</p></li></ul><p>You can learn more, ask questions, or provide your feedback about best-effort responses on the <a href="https://forum.dfinity.org/t/scalable-messaging-model/26920/67?u=oggy" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-0241-beta1">dfx 0.24.1-beta.1<a href="#dfx-0241-beta1" class="hash-link" aria-label="Direct link to dfx 0.24.1-beta.1" title="Direct link to dfx 0.24.1-beta.1">​</a></h2><p>A new beta release of <code>dfx</code> is available for testing! This release includes support for:</p><ul><li><p>Artificial delay and HTTP outcalls for PocketIC.</p></li><li><p>Motoko enhanced orthogonal persistence.</p></li><li><p>Best-effort responses.</p></li><li><p>Canister panic backtraces.</p></li></ul><p>Read the full <a href="https://github.com/dfinity/sdk/releases/tag/0.24.1-beta.1" target="_blank" rel="noopener noreferrer">release notes</a> or participate in the discussion on the <a href="https://forum.dfinity.org/t/dfx-0-24-1-beta-1-is-released/36091" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 9, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/09/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/09/news-and-updates/update"/>
        <updated>2024-10-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, there are several new documentation pages on the ICP dev docs, an update about developer office hours on Discord, and a community spotlight for the app KongSwap.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 9 2024" src="/assets/images/dev-update-blog-oct-9-4e3ca5ad3a0061f198c566430adc7a08.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, there are several new documentation pages on the ICP dev docs, an update about developer office hours on Discord, and a community spotlight for the app KongSwap. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="documentation-updates">Documentation updates<a href="#documentation-updates" class="hash-link" aria-label="Direct link to Documentation updates" title="Direct link to Documentation updates">​</a></h2><p>Over the past few weeks, several new documentation pages have been added to the dev docs! Here are the latest updates:</p><ul><li><p><a href="/building-apps/test/overview">Smart contract testing overview</a></p></li><li><p><a href="/motoko/motoko-tooling/canpack">Canpack developer tool</a></p></li><li><p><a href="/ecosystem?tag=AI">AI inference</a></p></li><li><p><a href="https://dashboard.internetcomputer.org/" target="_blank" rel="noopener noreferrer">ICP dashboard overview</a></p></li><li><p><a href="https://dashboard.internetcomputer.org/" target="_blank" rel="noopener noreferrer">Using the ICP dashboard</a></p></li><li><p><a href="/references/dashboard-apis">ICP dashboard APIs</a></p></li><li><p><a href="/building-apps/essentials/gas-cost">Cycles pricing calculator</a></p></li></ul><p>Check out all of the <a href="/building-apps/essentials/network-overview">ICP developer documentation</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-developer-office-hours">ICP developer office hours<a href="#icp-developer-office-hours" class="hash-link" aria-label="Direct link to ICP developer office hours" title="Direct link to ICP developer office hours">​</a></h2><p>Developer office hours are back in the ICP developer Discord server! Every Wednesday, two office hour sessions are held in the Discord server's voice chat:</p><ul><li>7:00 UTC</li><li>17:30 UTC</li></ul><p>Be sure to drop in to the session and ask questions, share your project, or simply listen in on the discussion.</p><p><a href="https://discord.internetcomputer.org" target="_blank" rel="noopener noreferrer">Join the ICP developer Discord server</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-spotlight-kongswap">Community spotlight: KongSwap<a href="#community-spotlight-kongswap" class="hash-link" aria-label="Direct link to Community spotlight: KongSwap" title="Direct link to Community spotlight: KongSwap">​</a></h2><p>KongSwap is a decentralized exchange that utilizes ICP's Chain Fusion technology to facilitate cross-chain trading without using a bridge or oracle. KongSwap offers a better, simplified user experience through features such as lower fees and decreased liquidity fragmentation. It is a fully decentralized platform deployed entire onchain with both the frontend and backend components hosted on ICP as canisters.</p><p>You can <a href="https://www.kongswap.io/?viewtab=swap&amp;pool=ICP_ckUSDT" target="_blank" rel="noopener noreferrer">try KongSwap yourself</a> or learn more about the app's architecture, design, and features on the <a href="https://forum.dfinity.org/t/introducing-kongswap/35607" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 2, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/02/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/10/02/news-and-updates/update"/>
        <updated>2024-10-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we're excited to announce a new tool for calculating project costs, `dfx v0.24.0`, and two new ICRC standards that are being discussed by the community.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 2 2024" src="/assets/images/dev-update-blog-oct-2-23671400d7acf7a94bba031d10fc36c0.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we're excited to announce a new tool for calculating project costs, <code>dfx v0.24.0</code>, and two new ICRC standards that are being discussed by the community. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-pricing-calculator">ICP pricing calculator<a href="#icp-pricing-calculator" class="hash-link" aria-label="Direct link to ICP pricing calculator" title="Direct link to ICP pricing calculator">​</a></h2><p>Curious what your project may cost once deployed on ICP? The new ICP pricing calculator now provides you with a way to estimate dapp costs depending on:</p><ul><li>Number of canisters</li><li>Amount of storage</li><li>Additional features used, such as HTTPS outcalls, ECDSA, query calls, update calls, and more.</li></ul><p>Costs are estimated in USD, but will be charged to your canister(s) in cycles. The calculator differentiates between one-time costs and reoccurring costs.</p><p>Check out the <a href="https://3d5wy-5aaaa-aaaag-qkhsq-cai.icp0.io/" target="_blank" rel="noopener noreferrer">pricing calculator</a> or learn more <a href="/building-apps/essentials/gas-cost">paying for resources in cycles</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0240">dfx v0.24.0<a href="#dfx-v0240" class="hash-link" aria-label="Direct link to dfx v0.24.0" title="Direct link to dfx v0.24.0">​</a></h2><p><code>dfx v0.24.0</code> has been released! This version includes several notable features and bug fixes, such as:</p><ul><li>Canister upgrade options are exposed in the CLI as the options <code>--skip-pre-upgrade</code> and <code>--wasm-memory-persistence</code>.</li><li><code>dfx deploy --mode</code> now accepts "install", "reinstall", "upgrade" and "auto" as possible options.</li><li>Motoko stable compatibility warnings are now reported.</li><li>PocketIC replica state is now persisted between runs.</li><li><code>dfx extension list</code> now displays all available extensions.</li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icrc-75-and-icrc-104">ICRC-75 and ICRC-104<a href="#icrc-75-and-icrc-104" class="hash-link" aria-label="Direct link to ICRC-75 and ICRC-104" title="Direct link to ICRC-75 and ICRC-104">​</a></h2><p>There are two new ICRC standard drafts ready for community review and discussion! ICRC-75 provides a minimal membership standard, while ICRC-104 defines a rule-based membership manager standard.</p><p>ICRC-75 defines the data structures and types for representing identities, permissions, and lists associated with composable identity lists on ICP. Specifically, ICRC-75 defines permissions that an identity or list can obtain and use to execute actions on other lists. Using these permissions, ICRC-75 can be used to manage access and actions that can be executed by different identities across different lists within the ICP ecosystem.</p><p>You can review the <a href="https://github.com/icdevsorg/icrc75.mo/blob/main/icrc75-standard.md" target="_blank" rel="noopener noreferrer">ICRC-75 draft</a> or participate in the <a href="https://forum.dfinity.org/t/icrc-75-minimal-membership-standard/35753" target="_blank" rel="noopener noreferrer">discussion on the forum</a>.</p><p>ICRC-104 defines a membership manager standard for manipulating memberships within the lists defined by ICRC-75. It allows developers to create adaptable and scalable applications using customizable rule sets for membership lists, manipulating lists through role rotation, house sorting, and other membership-related functions.</p><p>You can review the <a href="https://github.com/dfinity/ICRC/issues/104" target="_blank" rel="noopener noreferrer">ICRC-104 draft</a> or participate in the <a href="https://forum.dfinity.org/t/icrc-104-rule-based-membership-manager-standard/35756" target="_blank" rel="noopener noreferrer">discussion on the forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 25, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/09/25/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/09/25/news-and-updates/update"/>
        <updated>2024-09-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, there is a new ICRC standard draft open for community review and feedback, an NNS proposal to upgrade subscription utility, and a new data visualizer that demonstrates the current ICP and cycle burn rates.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 25 2024" src="/assets/images/dev-update-blog-sept-25-be297c8f9c57c06380e0fe9927baa4d6.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, there is a new ICRC standard draft open for community review and feedback, an NNS proposal to upgrade subscription utility, and a new data visualizer that demonstrates the current ICP and cycle burn rates. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icrc-72-minimal-event-driven-pub-sub-standard">ICRC-72: Minimal event-driven pub-sub standard<a href="#icrc-72-minimal-event-driven-pub-sub-standard" class="hash-link" aria-label="Direct link to ICRC-72: Minimal event-driven pub-sub standard" title="Direct link to ICRC-72: Minimal event-driven pub-sub standard">​</a></h2><p>A new ICRC standard has been created by the token standards working group and is ready for review and feedback from the community. This standard, known as ICRC-72, defines a standard for the publish-subscribe messaging pattern on ICP.</p><p>The publish-subscribe pattern, often referred to as pub-sub, allows distributed system components to exchange information asynchronously. It uses an event-driven approach that ICRC-72 leverages to provide a standard mechanism where a canister can subscribe to a specific type of message and respond to them without requiring a poll or maintaining a direct link to the origin of the message.</p><p>The ICRC-72 standard defines how different roles, such as publisher, subscriber, broadcaster, and orchestrator, interact with one another in the ICP ecosystem by detailing the methods, protocols, and data structures necessary to establish secure and effective communication.</p><p>You can read the draft of the standard on <a href="https://github.com/icdevs/ICEventsWG/blob/main/draft_proposals_current/candidate-ICRC72-20240924.md" target="_blank" rel="noopener noreferrer">GitHub</a> and leave your feedback or questions on the <a href="https://forum.dfinity.org/t/icrc-72-minimal-event-driven-pub-sub-standard-candidate-draft/35489" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-proposal-upgrade-nns-subscription-utility">NNS proposal: Upgrade NNS subscription utility<a href="#nns-proposal-upgrade-nns-subscription-utility" class="hash-link" aria-label="Direct link to NNS proposal: Upgrade NNS subscription utility" title="Direct link to NNS proposal: Upgrade NNS subscription utility">​</a></h2><p>A proposal has been submitted to the NNS that upgrades the NNS subscription utility canister <code>fe5iu-uiaaa-aaaal-ajxea-cai</code>. This proposal includes the following changes:</p><ul><li><p>Upgrades the utility to ICRC-79, which fixes query processing, bugs regarding deduping transaction code, and adds fields to the product object.</p></li><li><p>Reruns the blockchain from Genesis to remedy an error regarding a typo in an item.</p></li><li><p>Adds <code>ICRC3_supported_block_types</code>.</p></li></ul><p>You can learn more about this proposal and leave your feedback on the <a href="https://forum.dfinity.org/t/proposal-to-upgrade-nns-subscription-utility-fe5iu-uiaaa-aaaal-ajxea-cai/35500" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-burn-speed-visualizer">ICP burn speed visualizer<a href="#icp-burn-speed-visualizer" class="hash-link" aria-label="Direct link to ICP burn speed visualizer" title="Direct link to ICP burn speed visualizer">​</a></h2><p>It's no secret that the ICP cycles burn rate has been going to the moon recently, with projects like <a href="https://bob.fun/" target="_blank" rel="noopener noreferrer">bob.fun</a> and <a href="https://burn.msq.tech/" target="_blank" rel="noopener noreferrer">Burn</a> gaining popularity. Want to get a better idea of how fast the burn rate actually is?</p><p>The ICP burn speed visualizer tool does just that! Using a simple, open-source interface, you can see a real-time visualization of the current burn rates for both cycles and ICP. The visualizer also shows the rate at which cycles and ICP tokens are being minted, so you can compare the rate of minting to the rate of burning.</p><p><a href="https://ic.tago.so/" target="_blank" rel="noopener noreferrer">Check out the visualizer yourself</a> or view the <a href="https://observablehq.com/@tagoso/icp-burn" target="_blank" rel="noopener noreferrer">open-source code</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 18, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/09/18/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/09/18/news-and-updates/update"/>
        <updated>2024-09-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, there is a new release of the ICP JavaScript agent, a new release of Pocket IC, and a new tool for estimating the costs of HTTPS outcalls.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 18 2024" src="/assets/images/dev-update-blog-sept-18-1d1833729925d0da393f02571ac7fe17.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, there is a new release of the ICP JavaScript agent, a new release of Pocket IC, and a new tool for estimating the costs of HTTPS outcalls. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-javascript-agent-v210">ICP JavaScript agent v2.1.0<a href="#icp-javascript-agent-v210" class="hash-link" aria-label="Direct link to ICP JavaScript agent v2.1.0" title="Direct link to ICP JavaScript agent v2.1.0">​</a></h2><p>A new version of the ICP JavaScript agent has been released! This release features the new synchronous call API, allowing calls to the mainnet to bypass polling. This release also includes allowing HttpAgent to set and read the replicaTime value, allowing for improvements regarding time disagreements between client and replica. Other notable additions include:</p><ul><li><p>Support for the threshold Schnorr management canister interface.</p></li><li><p>React hook for <code>use-auth-client</code>.</p></li><li><p>Ensure that the seed phrase produces a 64-byte seed.</p></li><li><p>New options for setting a root key during the creation of the agent.</p></li></ul><p>For the full release notes, check out the <a href="https://github.com/dfinity/agent-js/releases/tag/v2.1.0" target="_blank" rel="noopener noreferrer">GitHub repo</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pocketic-v600">PocketIC v6.0.0<a href="#pocketic-v600" class="hash-link" aria-label="Direct link to PocketIC v6.0.0" title="Direct link to PocketIC v6.0.0">​</a></h2><p>A new version of the PocketIC testing suite has been released! This release features:</p><ul><li><p>Support for threshold ECDSA and Schnorr signature testing for canisters integrating with Bitcoin and Solana.</p></li><li><p>Query statistics support.</p></li><li><p>New option to specify the IP address that the PocketIC server should listen at.</p></li><li><p>New endpoint <code>/api/v2/subnet</code> to support HTTP subnet read state requests.</p></li><li><p>Test multiple diverging canister HTTP outcalls responses to determine how your canister handles errors from remote servers.</p></li></ul><p>Read the full release notes <a href="https://github.com/dfinity/ic/blob/5aa7ad88dfd29ba9b6e166552d1e84f48001acb3/rs/pocket_ic_server/CHANGELOG.md#600---2024-09-12" target="_blank" rel="noopener noreferrer">on GitHub</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="https-outcalls-cost-calculator">HTTPS outcalls cost calculator<a href="#https-outcalls-cost-calculator" class="hash-link" aria-label="Direct link to HTTPS outcalls cost calculator" title="Direct link to HTTPS outcalls cost calculator">​</a></h2><p>Looking for a way to calculate how much an HTTPS outcall will cost? There's a new tool that can help estimate these costs by submitting a request and response size manually, or you can provide a URL. If you provide a URL, the maximum response size of 2MiB will be used for the estimation.</p><p><a href="https://7joko-hiaaa-aaaal-ajz7a-cai.icp0.io/" target="_blank" rel="noopener noreferrer">Try out the tool</a> or take a look at the <a href="https://github.com/domwoe/HTTPS-Outcalls-Calculator" target="_blank" rel="noopener noreferrer">code on GitHub</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 11, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/09/11/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/09/11/news-and-updates/update"/>
        <updated>2024-09-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to chat about Ed25519 signatures, dfx v0.23.0, and a new community project that's leveraging AI onchain.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 11 2024" src="/assets/images/dev-update-blog-sept-11-ce624e3afc8314a2526647aaef29c8dc.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we're excited to chat about Ed25519 signatures, <code>dfx v0.23.0</code>, and a new community project that's leveraging AI onchain. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ed25519-signatures">Ed25519 signatures<a href="#ed25519-signatures" class="hash-link" aria-label="Direct link to Ed25519 signatures" title="Direct link to Ed25519 signatures">​</a></h2><p>Ed25519 signatures are now available for production use on the mainnet! Ed25519 signatures have been enabled as part of the <a href="/references/ic-interface-spec#ic-sign_with_schnorr">threshold Schnorr API method</a>, and allow ICP canisters to interact with other chains that use an Ed25519 algorithm, such as Solana, Cardano, and Polkadot.</p><p>To use Ed25519 signatures, transactions can use the <code>sign_with_schnorr</code> API method and be signed with the production key <code>Ed25519:key_1</code>.</p><p>Enabling Ed25519 signatures is part of the <a href="https://internetcomputer.org/roadmap#Chain%20Fusion-Helium" target="_blank" rel="noopener noreferrer">Helium roadmap milestone</a>, which will also include the launch of a Solana RPC canister.</p><p>Check out the <a href="https://github.com/domwoe/schnorr_canister" target="_blank" rel="noopener noreferrer">developer preview</a> project for an example of how to use Ed25519 signatures.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0230-is-promoted"><code>dfx v0.23.0</code> is promoted!<a href="#dfx-v0230-is-promoted" class="hash-link" aria-label="Direct link to dfx-v0230-is-promoted" title="Direct link to dfx-v0230-is-promoted">​</a></h2><p><code>dfx v0.23.0</code> has been released! Notable features and changes in this version of <code>dfx</code> include:</p><ul><li><p>Support for canister snapshots.</p></li><li><p>Support for threshold Ed25519 signatures.</p></li><li><p>Support for PocketIC's HTTP gateway.</p></li><li><p>Added <code>settings_digest</code> field to the <code>network-id</code> file.</p></li><li><p><code>dfx extension install</code> now locates extensions using the extension catalog.</p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.23.0" target="_blank" rel="noopener noreferrer">View the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ichess">IChess<a href="#ichess" class="hash-link" aria-label="Direct link to IChess" title="Direct link to IChess">​</a></h2><p>An exciting community project using onchain AI has been announced! IChess showcases how a fully functional LLM can run directly on ICP by providing an app where you can play a game of chess against an AI opponent. The AI is trained on an LLM that interprets chess positions and determines the next optimal move. The project uses the LLaMA2 module and a backend written in C++.</p><p><a href="https://forum.dfinity.org/t/ai-player-on-icp-ichess/34839" target="_blank" rel="noopener noreferrer">Learn more about IChess</a> or <a href="https://cirh4-aiaaa-aaaan-qmvqa-cai.icp0.io/" target="_blank" rel="noopener noreferrer">play a game yourself</a>!</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 4, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/09/04/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/09/04/news-and-updates/update"/>
        <updated>2024-09-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we're excited to talk about the most recent update to the NNS, highlight an update on the community project Nauts World, and ask for your feedback regarding API changes for public and private neurons. ]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 4 2024" src="/assets/images/dev-update-blog-sept-4-00dc4d9804d70edcee9dbad50e3fbac0.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we're excited to talk about the most recent update to the NNS, highlight an update on the community project Nauts World, and ask for your feedback regarding API changes for public and private neurons. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="august-30-2024-nns-updates">August 30, 2024 NNS updates<a href="#august-30-2024-nns-updates" class="hash-link" aria-label="Direct link to August 30, 2024 NNS updates" title="Direct link to August 30, 2024 NNS updates">​</a></h2><p>On August 30, 2024, the following updates were proposed for three of the NNS canisters:</p><ul><li><p><strong>Cycles minting canister</strong>: Added more log visibility support, initialized <code>average_icp_xdr_conversion_rate</code>, and added support for <code>wasm_memory_threshold</code>.</p></li><li><p><strong>Governance canister</strong>: Backfilled Neurons Fund data, removed <code>SetDefaultFollowees</code>, <code>SetSnsTokenSwapOpenTimeWindow</code>, and <code>OpenSnsTokenSwap</code> proposal types, disabled <code>UpdateAllowedPrincipals</code> proposal type, and added functionality where deprecated <code>*_pb</code> methods now fail.</p></li><li><p><strong>Genesis token canister</strong>: Did not include any new features or fixes, but was updated as a general maintenance procedure.</p></li></ul><p>You can read more about these updates and verify the code for each by checking out the <a href="https://forum.dfinity.org/t/nns-updates-2024-08-30/34620" target="_blank" rel="noopener noreferrer">forum post</a> with all the details.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nauts-world-update">Nauts World update<a href="#nauts-world-update" class="hash-link" aria-label="Direct link to Nauts World update" title="Direct link to Nauts World update">​</a></h2><p>A new season is starting at Nauts World! Nauts World is a collectible-based game featuring characters known as Nauts that players can mint, trade, and sell. There is exciting new functionality coming to Nauts World soon, including:</p><ul><li><p>Mobile game: Nauts World will soon have an accompanying mobile game that will provide players a way to strengthen their arsenal of Nauts.&nbsp;</p></li><li><p>NFT utility: Players can redeem a 3D printed variant of their Nauts NFT once certain criteria are met.</p></li><li><p>Game lore: Stories about the character's clans will be released to help improve world building and character development.</p></li><li><p>Nauts World staking sector will be released.</p></li></ul><p>Want to learn more? Read the full update on the <a href="https://forum.dfinity.org/t/nauts-world-season-update/34644/1" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="request-for-feedback-api-changes-for-public-and-private-neurons">Request for feedback: API changes for public and private neurons<a href="#request-for-feedback-api-changes-for-public-and-private-neurons" class="hash-link" aria-label="Direct link to Request for feedback: API changes for public and private neurons" title="Direct link to Request for feedback: API changes for public and private neurons">​</a></h2><p>A request for comments has been opened on the forum regarding changes to the API for public and private neurons. These changes would include breaking changes, and your feedback is appreciated in helping to finalize the decisions regarding these changes.&nbsp;</p><p>Breaking changes would alter how an app reads neurons that do not belong to the caller, i.e., the caller is not a controller or hotkey of the neuron. Specifically, the fields <code>recent_ballots</code> and <code>joined_community_fund_timestmap_seconds</code> would not work, and would require a new field called <code>visibility</code> to properly interpret the values of either of these fields.</p><p>Non-breaking changes include:</p><ul><li><p>Allowing neurons to utilize the new <code>visibility</code> field.</p></li><li><p>Allow public neurons to be read without special privileges through changes to the <code>list_neurons</code> method.</p></li><li><p>Known Neurons will always be public.</p></li></ul><p>You can read the full details of these API changes and leave your feedback on the <a href="https://forum.dfinity.org/t/request-for-comments-api-changes-for-public-private-neurons/33360/1" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Individual spotlight - Staff researcher]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-staff-researcher</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-staff-researcher"/>
        <updated>2024-08-28T19:56:12.000Z</updated>
        <summary type="html"><![CDATA[In today's interview, we're chatting with Thomas from the Systems & Research team.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Product manager spotlight" src="/assets/images/indv-spotlight-6-ebb51987e68a42b09ad685562df2dd21.jpg" width="1400" height="675" class="img_ev3q"></p><p>**Hello everyone, and welcome back to the individual spotlight series! In today's interview, we're chatting with Thomas from the Systems &amp; Research team. Thomas is the research lead for multiple different engineering teams, and has worked on various important projects like the Bitcoin integration, the cycles ledger, and chain-key tokens. We're excited to learn more about Thomas' unique role at DFINITY and his perspective of the various different initiatives and features of ICP!</p><p><strong>To kick things off, how is the role of a staff researcher different from other roles in the organization?</strong></p><p><em>Each researcher has the role of “research lead” for at least one engineering team. I’m the research lead for three teams: IC Integrations, SDK, and the Cross-Chain team, so I get to work on various different projects, such as the exchange rate canister (owned by the IC Integrations team), the recently released cycles ledger (SDK team), and everything related to Bitcoin, Ethereum, and chain-key tokens (cross-chain team).</em></p><p><strong>What responsibilities do you have as a staff researcher?</strong></p><p><em>As a staff researcher, one of my primary tasks is to lead and support bigger projects and features with a potentially large impact for the Internet Computer and DFINITY. A good example is the Bitcoin integration project, which was a significant cross-team effort to enable the creation of Bitcoin smart contracts on the Internet Computer. This integration is further the foundation of ckBTC, our first chain-key token.</em></p><p><strong>You’ve contributed to several of the different Chain Fusion projects, such as the Bitcoin integration and ckERC20 tokens. What was your role in the Bitcoin integration project?</strong></p><p><em>As the research lead for this feature, I was responsible for the technical specification. It was also my task to review the implementation to ensure that it conformed to the design. Of course, this was an iterative process, requiring many discussions with other researchers and the teams driving the implementation, and the design changed significantly throughout this process.</em></p><p><strong>What was your biggest learning or takeaway from working on the Bitcoin integration?</strong></p><p><em>Our Bitcoin integration is quite unique. Do you know any other smart contract on any blockchain that has a state size of nearly 100 GiB? I think the way Bitcoin blocks are ingested is unique too. Whenever you build something that has never been done before, there are many unknowns, which makes planning and estimating the required effort challenging. Maybe the biggest learning is that the challenges in such endeavors should never be underestimated—but this project also nicely showed that DFINITY has fantastic teams with the skill required to pull off such endeavors!</em></p><p><strong>Were there any challenges or hurdles that the team had to overcome during the Bitcoin integration?</strong></p><p><em>There were many challenges, small and large. One of the main challenges was to reach agreement across all involved teams and management about numerous important design decisions. For example, what information about the Bitcoin blockchain is stored? How many Bitcoin addresses can canisters have? Is the Bitcoin code part of the replica code, or does it run in a canister? And many more. Not surprisingly, many discussions were required, but in the end we converged on a fairly nice architecture, in my opinion.</em></p><p><strong>Let's talk about the ckERC20 project, that enabled ERC-20 tokens to be deployed on ICP as chain-key tokens. How was your role in this project different from your role in the Bitcoin integration project?</strong></p><p><em>It was actually quite different because, unlike in the Bitcoin integration project, the cross-chain team had already worked out a good design. So my focus was more on reviewing the specification and the implementation to make sure that they are consistent.</em></p><p><strong>You were also a contributor to the cycles ledger project that we did a <a href="/blog/features/cycles-ledger">Project Spotlight</a> post on a few months ago. What has the community feedback been on the cycles ledger since launch?</strong></p><p><em>Before the launch, we were frequently asked when the cycles ledger would finally be ready. After the launch, there were a few positive comments, but that was it. I’d like to believe that the developers in our community are now happily using it, and we don’t hear anything because everything works as it should. But it is a good question. Maybe we should do a survey to figure out if the cycles ledger really lives up to the developers’ expectations.</em></p><p><strong>To switch gears a bit, let's chat about what projects you are currently working on.</strong></p><p><em>I currently work on multiple projects. In the future, we want to charge for query calls as well; that’s why we’re looking into accurately accumulating query statistics from replicas in a subnet. The challenge here is that the individual replicas are not trustworthy and may report completely wrong numbers!</em></p><p><em>Of course, I’m also involved in current cross-chain activities. My main focus in that domain is currently the switch to a simpler know-your-token (KYT) mechanism for ckBTC. The new mechanism will result in lower KYT fees and reduce the risk of “false positives” where bitcoins get quarantined because of (overly) restrictive KYT rules.</em></p><p><em>I’m also working on exposing recent Bitcoin blocks through the Bitcoin canister, which will help all projects that require more information about the Bitcoin blockchain state than balances and unspent outputs. This includes all projects that work with meta protocols such as Ordinals, BRC-20, and so on.</em></p><p><strong>Those are all exciting initiatives! We're excited to see each of those projects complete and available for our developers to use. Looking at the ICP roadmap, are there any other items from your team you are excited about?</strong></p><p><em>As far as the cross-chain team is concerned, I’m excited about all the work items that will make our Bitcoin integration more useful and accessible to developers. I also hope that our work on chain-key tokens will help grow our DeFi ecosystem.</em></p><p><em>The SDK team has many cool roadmap items as well, which will help improve developer experience. For example, the work to provide more actionable information to developers, such as well-defined error codes and backtraces, is important to write correct canister code. I also like the <code>dfx</code> extensions feature as it makes it possible to reduce <code>dfx</code> to its core functionality while providing a flexible mechanism to integrate additional (DFINITY-made or third-party) functionality into <code>dfx</code>.</em></p><p><strong>What about roadmap items from other teams—are there any you're keeping an eye on?</strong></p><p><em>I’m excited about all features that bring substantial enhancements to the Internet Computer across all layers. For example, starting at the networking layer, I think having a synchronous message submission endpoint will be a nice feature for developers. Improving throughput on the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus</a> layer by only including hashes in blocks instead of large payloads is another roadmap item that I think will help the Internet Computer significantly, in particular once we start to see larger loads on the subnets. The roadmap item to support multiple terabytes of replicated storage is important for canisters that require a large state, for example, a canister that stores the full Bitcoin blockchain, a feature that has been requested numerous times!</em></p><p><strong>What advice would you give a new developer getting started on ICP?</strong></p><p><em>The Internet Computer has so many unique features, like HTTPS outcalls, code that can execute on a timer, whole frontends being served by canisters, and many more. I would advise a new developer to try out whatever feature he or she finds most interesting. Luckily, we have great documentation now, which should help anybody get started quickly!</em></p><p><strong>Are there any community projects or tools that you’ve been using recently?</strong></p><p><em>I don’t use any community project that is directly related to things that I’m working on. However, I do use some community tools for work, for example, OpenChat, and I try out various community projects privately. I think it’s definitely worthwhile to check out what our community is building.</em></p><p><strong>To wrap things up, what’s your favorite thing about ICP?</strong></p><p><em>I've used the word “unique” several times before, but its many unique features set the Internet Computer far apart from virtually any other blockchain project. My favorite thing about the Internet Computer is that it has the necessary features to build decentralized applications that can have a substantial impact in the real world.</em></p><p><strong>Thanks again, Thomas, for chatting with us and providing such great insight into several projects, especially the Bitcoin integration and cross-chain team initiatives! Be sure to tune in next time for another individual spotlight interview!</strong></p>]]></content>
        <category label="Individual spotlight" term="Individual spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update August 28, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/08/28/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/08/28/news-and-updates/update"/>
        <updated>2024-08-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to talk about the upcoming Beryllium milestone, a new episode of NNS explained, and a new release of the `ic-siwe` package.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 28 2024" src="/assets/images/dev-update-blog-aug-28-1ba666108ad1f667d7e62ced73635af3.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we're excited to talk about the upcoming Beryllium milestone, a new episode of NNS explained, and a new release of the <code>ic-siwe</code> package. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="beryllium-milestone">Beryllium milestone<a href="#beryllium-milestone" class="hash-link" aria-label="Direct link to Beryllium milestone" title="Direct link to Beryllium milestone">​</a></h2><p>The Beryllium roadmap milestone is nearing completion and is expected to be released in early October! This milestone is focused on providing canister developer improvements and operation simplifications. Exciting features included in this milestone include:</p><ul><li><p>Canister logging: Read and write canister runtime logs.</p></li><li><p>Canister snapshots: Rollback to previous snapshots to fix errors and recover data.</p></li><li><p>Canister lifecycle hooks: Canisters can receive notifications from ICP regarding lifecycle updates, such as low canister balance.</p></li><li><p>Actionable error messages and backtraces: Create a standard for response and error codes for better service composability.</p></li><li><p>Standardized canister response codes: Enhance error codes by providing actionable items and documentation explaining how to resolve errors.</p></li></ul><p>You can read the full details of this milestone on the <a href="https://internetcomputer.org/roadmap#Developer%20Experience-Beryllium" target="_blank" rel="noopener noreferrer">ICP roadmap</a>.&nbsp;</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ic-siwe-v010">ic-siwe v0.1.0<a href="#ic-siwe-v010" class="hash-link" aria-label="Direct link to ic-siwe v0.1.0" title="Direct link to ic-siwe v0.1.0">​</a></h2><p>The <code>ic-siwe</code> package enables developers to provide users with the option to login to an application with their Ethereum wallet. The latest release of <code>ic-siwe</code> introduces security improvements and reliability. Release notes include:</p><ul><li><p>Breaking changes to the <code>prepare_login</code> and <code>login</code> functions.</p></li><li><p>Improved security through a nonce-based implementation and validated signature expiration.</p></li><li><p>Proper cleanup of SIWE messages through added logic to remove failed login attempts and prevent stale data.&nbsp;</p></li></ul><p><a href="https://forum.dfinity.org/t/announcing-ic-siwe-v0-1-0-security-fixes-making-nonce-required/34410" target="_blank" rel="noopener noreferrer">Learn more on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-episode-nns-explained">New episode: NNS explained<a href="#new-episode-nns-explained" class="hash-link" aria-label="Direct link to New episode: NNS explained" title="Direct link to New episode: NNS explained">​</a></h2><p>A new episode of the NNS explained series has been released! In this episode, <a href="https://www.youtube.com/watch?v=J-aJFJ_4zIw" target="_blank" rel="noopener noreferrer">Verifying NNS Dapp Proposals</a>, you can learn how to build the NNS dapp locally, obtain the proposed Wasm module hash included in a proposal, then verify that the proposed hash matches the hash of the NNS dapp you built and tested locally.</p><p>You can learn more about the NNS explained series on the <a href="https://forum.dfinity.org/t/announcement-nns-explained-youtube-series/32337/12" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Individual spotlight - Boundary node team lead]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-boundary-node</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-boundary-node"/>
        <updated>2024-08-22T20:33:40.000Z</updated>
        <summary type="html"><![CDATA[In today's interview, we're chatting with Rüdiger, the team lead for the boundary node team, to learn more about what the boundary node team is working on and what challenges he faces as a team leader.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Product manager spotlight" src="/assets/images/indv-spotlight-5-ef41717e83d51253ca4044edf4fdd8d5.jpg" width="1400" height="675" class="img_ev3q"></p><p><strong>Hello everyone, and welcome back to another edition of the individual spotlight series! In today's interview, we're chatting with Rüdiger, the team lead for the boundary node team, to learn more about what the boundary node team is working on and what challenges he faces as a team leader.</strong></p><p><strong>To kick things off, what projects or features does the boundary node team own and work on?</strong></p><p><em>The boundary node team is in charge of the “edge” of the Internet Computer. Any request going to the Internet Computer is handled by code and infrastructure we are responsible for. At the moment, our biggest project is the new boundary node architecture. This entails a complete revamp of the services making up the “edge” and is a big undertaking. Besides that, we maintain the custom domains service and provide insights through logs and metrics to other teams.</em></p><p><strong>We posted a <a href="/blog/news-and-updates/team-spotlight-boundary-node">team spotlight interview for the boundary node team back in November</a> of last year. In that interview, we talked about the upcoming changes to the boundary node architecture. Could you give an update on that?</strong></p><p><em>Yes, of course! We have made quite some progress. Since early June, we have had the first three API boundary nodes deployed in the mainnet. And just last week, we ran an HTTP gateway routing the requests to the API boundary nodes using the discovery library. This marked a big milestone for the team, as for the first time, we had all the components of the new boundary node architecture working together. Before we roll that out, we still have to get it ready for production. If you are interested, you can follow this <a href="https://forum.dfinity.org/t/boundary-node-roadmap/15562" target="_blank" rel="noopener noreferrer">thread on the forum</a>, where we try to regularly post updates.</em></p><p><strong>As a team leader, how does your role differ from others on the team?</strong></p><p><em>Since we are a relatively small team, I feel it doesn’t differ too much. I just serve as the first contact point for other teams and handle communication in the forum. Actually, the main difference comes from me being a researcher: I am more involved in the design of the new features and less in the implementation :)</em></p><p><strong>Are there any unique challenges that you face as a team lead?</strong></p><p><em>For me, the biggest challenge was and still is the transition from “just” being the researcher to also taking on the role as team leader. How we work as a team hasn’t changed much, but I personally feel a lot more responsibility. This year, we had a rough start with a few moments where the boundary nodes just received more traffic than they could handle. Right then, that was quite challenging, but looking back, it actually helped us improve our infrastructure and eliminate many performance bottlenecks.</em></p><p><strong>What are some of the current challenges that the boundary node team faces?</strong></p><p><em>The boundary nodes are a critical part of the IC infrastructure. The new boundary node architecture represents a major overhaul, and we really have to make sure that the transition happens as smoothly as possible. Ideally, it goes unnoticed, but for this, we need to do a lot of testing, have good monitoring set up, and make sure that the new components run reliably. Fortunately, we now have a good infrastructure in place that allows us to test new releases with real traffic from other DFINITY team members. So, I am confident that we will be able to roll out the new boundary nodes without major hiccups.</em></p><p><strong>In addition to the boundary node architecture, what other projects are you currently working on?</strong></p><p><em>Besides that, we are currently supporting the networking team in their work towards the <a href="https://internetcomputer.org/roadmap#Compute%20Platform-Tokamak" target="_blank" rel="noopener noreferrer">TOKAMAK milestone</a>, which is all about reducing end-to-end latency. Boundary nodes also contribute a significant part to user-perceived latency, as every request from a client has to go to a boundary node and from there to a replica node. To this end, we are extending the boundary nodes with the synchronous call endpoint and introducing geo-aware routing to reduce the network latency.</em></p><p><em>And we are working on SEV-SNP enabled HTTP gateways. This is still in the early stages, but ultimately, it would allow for trustless HTTP access to dapps hosted on the Internet Computer.</em></p><p><strong>Those sound like very exciting projects that will have a huge impact on the network! In addition to these projects, what roadmap items from your team are you most excited about?</strong></p><p><em>Actually, I am most excited about the smaller changes we have been and still are making behind the scenes to make our processes more automated, more robust, and simpler. This allows us to then focus more and more on the big roadmap items. The custom domains, for example, have come a long way since their launch in early 2023. Initially, we spent quite some time supporting developers setting up their domains. Now, we have lots of automation in place to guide them through the process, detect common mistakes early on, and debug issues.</em></p><p><em>Looking ahead, I am excited to finally roll out the new boundary node architecture. We have been working on it for quite a while, and it will be great when we see all the pieces coming together. After that, we will focus on making the access logs publicly available. This will be huge for IC devs as they will be able to drill down into every single request their canister received.</em></p><p><strong>What roadmap item from another team are you most excited about?</strong></p><p><em>Clearly, <a href="https://internetcomputer.org/roadmap#Developer%20Experience-Beryllium" target="_blank" rel="noopener noreferrer">BERYLLIUM</a> from the execution and SDK team. We also developed and maintain a couple of canisters (e.g., for custom domains) and are excited about the developer experience improvements, especially the canister snapshots!</em></p><p><strong>Are there any community projects or tools that you’ve been using recently?</strong></p><p><em>I have to admit, I am a <a href="https://taggr.link/" target="_blank" rel="noopener noreferrer">taggr</a> lurker. Also, I have been playing a bit here and there with <a href="https://juno.build/" target="_blank" rel="noopener noreferrer">Juno</a>.</em></p><p><strong>To wrap things up, what’s your favorite thing about ICP?</strong></p><p><em>You can host a website fully onchain. That’s amazing :) But that has been around for a long time. I guess what is awesome about ICP are all the different things one can do: HTTP outcalls, natively holding BTC, and now running AI models onchain.</em></p><p><strong>Thanks so much, Rüdiger, for chatting with us today and providing some exciting updates on the boundary node team's projects and roadmap!</strong></p><p><strong>Be sure to tune in next time for another individual spotlight interview.</strong></p>]]></content>
        <category label="Individual spotlight" term="Individual spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update August 21, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/08/21/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/08/21/news-and-updates/update"/>
        <updated>2024-08-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to share details about the Deuterium milestone production release, new documentation on digital assets, and an exciting new community project.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 21 2024" src="/assets/images/dev-update-blog-aug-21-1403635b19ab9b40f099a71d9a638862.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we're excited to talk about the latest chain-key token launch, a series of proposals regarding grants for known neurons, and the release of the NFID IdentityKit package. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ckeurc">ckEURC<a href="#ckeurc" class="hash-link" aria-label="Direct link to ckEURC" title="Direct link to ckEURC">​</a></h2><p>This week, another new chain-key token was launched on the mainnet! The token, ckEURC, is a digital twin of EURC. EURC is a stablecoin backed by the Euro and issued by <a href="https://www.circle.com/en/" target="_blank" rel="noopener noreferrer">Circle</a>. ckEURC is already supported on different ICP platforms, such as <a href="https://twitter.com/plug_wallet/status/1825544687337550087" target="_blank" rel="noopener noreferrer">Plug wallet</a>.</p><p>Bringing popular stablecoins to ICP through chain-key cryptography helps drive further global adoption of dapps built on ICP and facilitates faster, cheaper token transactions for everyday stablecoin use cases.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="voting-neuron-grant-proposals">Voting neuron grant proposals<a href="#voting-neuron-grant-proposals" class="hash-link" aria-label="Direct link to Voting neuron grant proposals" title="Direct link to Voting neuron grant proposals">​</a></h2><p>On Friday, 28 proposals were submitted that will decide which neurons will receive grants to become voting neurons on the NNS. Voting neurons are neurons that will be trusted to take time to audit and verify each proposal in the category that they are a voting neuron for. The goal of these grants is to incentivize more credible entities to participate as active voting neurons, thus decentralizing the trusted entities that other neurons follow.</p><p>The voting period for these proposals has ended, but you can review the results and the corresponding conversation <a href="https://forum.dfinity.org/t/grants-for-voting-neurons/32721/107" target="_blank" rel="noopener noreferrer">on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nfid-identitykit-release">NFID IdentityKit release<a href="#nfid-identitykit-release" class="hash-link" aria-label="Direct link to NFID IdentityKit release" title="Direct link to NFID IdentityKit release">​</a></h2><p>The NFID team has released a new package called IdentityKit! This package facilitates wallet sign-in, transaction approvals, and global wallet addresses in a single tool.</p><p>IdentityKit supports all ICRC wallet standards and currently only supports NFID Wallet. Other wallets, such as Oisy, Plug, and Internet Identity, are on the roadmap for this package. It also supports global addresses and principals from onchain wallets.</p><p><a href="https://docs.identitykit.xyz/" target="_blank" rel="noopener noreferrer">Learn more in the IdentityKit docs</a> or install IdentityKit today with <code>npm install @nfid/identitykit@latest</code>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update August 14, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/08/14/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/08/14/news-and-updates/update"/>
        <updated>2024-08-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to share details about the Deuterium milestone production release, new documentation on digital assets, and an exciting new community project.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 7 2024" src="/assets/images/dev-update-blog-aug-14-6a2d19ed3e20f383e2a35d84abb6499c.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we're excited to share details about the Deuterium milestone production release, new documentation on digital assets, and an exciting new community project. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="deuterium-milestone-production-release">Deuterium milestone: production release<a href="#deuterium-milestone-production-release" class="hash-link" aria-label="Direct link to Deuterium milestone: production release" title="Direct link to Deuterium milestone: production release">​</a></h2><p>The Deuterium roadmap milestone has been achieved and can now be used for production applications! This important Chain Fusion milestone enables threshold Schnorr signatures to be used by canisters to sign and submit new types of transactions to the Bitcoin network, including transactions for Ordinals, Runes, and BRC-20 tokens. This release also brings Bitcoin block header data to ICP, allowing canisters to obtain more information about transactions and assets on Bitcoin.</p><p>Want to learn more? Check out these developer documentation pages for more information and tutorials:</p><ul><li><p><a href="/building-apps/network-features/signatures/t-schnorr">Threshold Schnorr</a>.</p></li><li><p><a href="/build-on-btc/btc-transactions/sign-transactions#signing-transactions-with-threshold-schnorr">Signing transactions with threshold Schnorr</a>.</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="digital-asset-docs">Digital asset docs<a href="#digital-asset-docs" class="hash-link" aria-label="Direct link to Digital asset docs" title="Direct link to Digital asset docs">​</a></h2><p>The digital assets section of the developer docs has gotten an overhaul! Before, these docs focused primarily on the ICP and ICRC ledger local development instructions and guides on using Rosetta. Now, these docs include details about the various token standards available, different asset types such as tokens and NFTs, different wallet types and implementations, and more! Here are just a few new pages that we recommend checking out:</p><ul><li><p><a href="/defi/token-standards/">Token standards</a></p></li><li><p><a href="/defi/overview">Asset flow</a></p></li><li><p><a href="/defi/token-integrations/">Ledger integration options</a></p></li><li><p><a href="/defi/overview">NFT overview</a></p></li><li><p><a href="/defi/overview">Creating an NFT collection</a></p></li><li><p><a href="/defi/overview">NFT marketplaces</a></p></li><li><p><a href="/defi/overview">Wallet overview</a></p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-project-release-moonshift">Community project release: Moonshift<a href="#community-project-release-moonshift" class="hash-link" aria-label="Direct link to Community project release: Moonshift" title="Direct link to Community project release: Moonshift">​</a></h2><p>Moonshift is a new exciting community project designed for ICP projects to create marketing tasks for their community to complete in return for a bounty. Bounties can be set in any ICRC-2 token, such as ckBTC, ckETH, or SNS specific tokens like CHAT. The goal of Moonshift is to help projects curate more community-created content and improve their marketing creativity, reach, and messaging.</p><p>Several projects have already posted bounties, including OpenChat, Motoko Sentinels, and ICDevs. Check out the <a href="https://www.moonshift.app/" target="_blank" rel="noopener noreferrer">Moonshift application</a> and leave your feedback on the <a href="https://forum.dfinity.org/t/introducing-moonshift/34121" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update August 7, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/08/07/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/08/07/news-and-updates/update"/>
        <updated>2024-08-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is an exciting new beta release of dfx, a reminder about the upcoming online ICP DevConf event, info about the Bitcoin Olympics, and new docs on asset security.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 8 2024" src="/assets/images/dev-update-blog-aug-07-9d85dd102879d4e31da59551afaaece1.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is an exciting new beta release of <code>dfx</code>, a reminder about the upcoming online ICP DevConf event, info about the Bitcoin Olympics, and new docs on asset security. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0230-beta-release"><code>dfx v0.23.0</code> beta release<a href="#dfx-v0230-beta-release" class="hash-link" aria-label="Direct link to dfx-v0230-beta-release" title="Direct link to dfx-v0230-beta-release">​</a></h2><p><code>dfx v0.23.0</code> has been released for beta testing! This release includes several new features, including:</p><ul><li><p><code>dfx</code> can now be used to generate <code>.env</code> files for Motoko canisters.</p></li><li><p><code>security_policy</code> and <code>disable_security_policy_warning</code> are now supported in the <code>.ic-assets.json5</code> file. This configuration has three options: "hardened," "standard," or "disabled." Learn more about each setting in the <a href="https://github.com/dfinity/sdk/releases/tag/0.23.0-beta.0" target="_blank" rel="noopener noreferrer">release notes</a>.</p></li><li><p>The command <code>dfx info security-policy</code> returns the headers that get applied to assets as configured in the new <code>security_policy</code> setting.</p></li><li><p><code>dfx extension</code> can now install extensions from external locations, such as URLs or a .JSON file, rather than just through the extension's name.</p></li><li><p>The replica port is now displayed in the output of <code>dfx start</code>.</p></li><li><p>The flag <code>--wallet</code> now accepts an identity name.</p></li><li><p>For Rust canisters, crates can be specified in the <code>dfx.json</code> file and used for a canister module.</p></li></ul><p>This release also includes bug fixes such as:</p><ul><li><p><code>dfx extension install</code> does not return an error if the extension is already installed.</p></li><li><p><code>dfx ledger create-canister</code> now sets the correct controller principal.</p></li><li><p>Error codes are now displayed for some <code>http-related-errors</code>.</p></li></ul><p>You can read the full <a href="https://github.com/dfinity/sdk/releases/tag/0.23.0-beta.0" target="_blank" rel="noopener noreferrer">release notes</a> and install the beta with the command <code>dfxvm install 0.23.0-beta.3</code>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-devconf">ICP DevConf<a href="#icp-devconf" class="hash-link" aria-label="Direct link to ICP DevConf" title="Direct link to ICP DevConf">​</a></h2><p>ICP DevConf is a free online developer conference hosted by ICP Hubs USA that will take place later this month, August 27 &amp; 28. The event will feature several live keynotes and workshop presentations from DFINITY team members and the ICP community.</p><p>You can <a href="https://icpdevconf.com/" target="_blank" rel="noopener noreferrer">register online</a> for this event until August 25, 2024.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bitcoin-olympics">Bitcoin Olympics<a href="#bitcoin-olympics" class="hash-link" aria-label="Direct link to Bitcoin Olympics" title="Direct link to Bitcoin Olympics">​</a></h2><p>ICP is a proud sponsor of the Bitcoin Olympics, an online hackathon hosted by Bitcoin Startup Labs! This event begins on August 9, 2024, and will run through the end of September. Participants can enter to win over $100,000 worth of prizes in a variety of different focus areas and tracks, including ICP-specific tracks.</p><p><a href="https://btcolympics.devpost.com/" target="_blank" rel="noopener noreferrer">Learn more and register today</a> to participate in this great Bitcoin event!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="asset-security-documentation">Asset security documentation<a href="#asset-security-documentation" class="hash-link" aria-label="Direct link to Asset security documentation" title="Direct link to Asset security documentation">​</a></h2><p>New documentation has been published that details Content Security Policies (CSPs) for asset canisters, security recommendations, and details about changes to the asset canister's default CSP in <code>dfx</code> versions newer than <code>v0.21.0</code>. You can learn more <a href="/building-apps/frontends/asset-security">on the developer docs</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update July 31, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/31/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/31/news-and-updates/update"/>
        <updated>2024-07-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a new release of the Motoko package manager Mops, a new episode of the ICDevs DAO podcast, and another installment of the NNS Explained series.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="July 31 2024" src="/assets/images/dev-update-blog-july-31-b2179ac9552d0b4bf362f71dba12adff.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a new release of the Motoko package manager Mops, a new episode of the ICDevs DAO podcast, and another installment of the NNS Explained series. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="mops-v0450">Mops <code>v0.45.0</code><a href="#mops-v0450" class="hash-link" aria-label="Direct link to mops-v0450" title="Direct link to mops-v0450">​</a></h2><p>Mops v0.45.0 has been released! In this release, there are a few features and bug fixes, such as:</p><ul><li><p>Fixed an error regarding the cache folder being deleted upon GitHub install.</p></li><li><p>Fixed a <code>moc-wrapper</code> error for when a <code>.mops</code> folder exists.</p></li><li><p>Updated dependencies.</p></li><li><p>Added a <code>--no-install</code> flag to the <code>mops sources</code> command.</p></li><li><p>Added a <code>--verbose</code> flag to the <code>mops publish</code> command.</p></li><li><p>Added support for dependency version pinning.</p></li></ul><p>You can read the full release notes on the <a href="https://blog.mops.one/2024-07-30-updates" target="_blank" rel="noopener noreferrer">Mops blog</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icdevs-dao-podcast-episode-2">ICDevs DAO podcast episode 2<a href="#icdevs-dao-podcast-episode-2" class="hash-link" aria-label="Direct link to ICDevs DAO podcast episode 2" title="Direct link to ICDevs DAO podcast episode 2">​</a></h2><p>The second episode of the ICDevs DAO podcast has been released! This podcast is part of a project that aims to build software and tools that enhance and assist DAOs deployed on ICP. The project also includes a detailed document that contains information gathered through interviews with different DAOs to identify patterns and forms.</p><p>Check out more information on the ICDevs DAO project and the latest podcast episode <a href="https://forum.dfinity.org/t/icdevs-org-daos-project/32840" target="_blank" rel="noopener noreferrer">on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-explained--neuron-following">NNS Explained | Neuron Following<a href="#nns-explained--neuron-following" class="hash-link" aria-label="Direct link to NNS Explained | Neuron Following" title="Direct link to NNS Explained | Neuron Following">​</a></h2><p>NNS Explained is a video series that dives into the Network Nervous System that governs ICP, teaching viewers about the different ways they can interact with the NNS and participate in the network's onchain governance. In the latest episode, Neuron Following, Lara Schmid shows how to set up neuron following to maximize your rewards.</p><p>Check out the video <a href="https://www.youtube.com/watch?v=6BznC9p3w8w" target="_blank" rel="noopener noreferrer">on YouTube</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Individual spotlight - Product manager]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-product-manager</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-product-manager"/>
        <updated>2024-07-30T20:57:23.000Z</updated>
        <summary type="html"><![CDATA[In today's interview, we're chatting with Andrew, a product manager who is dedicated to growing and refining the Internet Computer as a product.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Product manager spotlight" src="/assets/images/indv-spotlight-4-0df287fdad25f13da6889d002b96f3a8.jpg" width="1400" height="675" class="img_ev3q"></p><p><strong>Hello everyone, and welcome back to another edition of the individual spotlight series! In today's interview, we're chatting with Andrew, a product manager who is dedicated to growing and refining the Internet Computer as a product. To learn more about what that means, we sat down and asked more about Andrew's day-to-day workflow.</strong></p><p><strong>To get started, what tools, projects, or features does your team primarily work on?</strong></p><p><em>While I work in the product team, my focus is mostly centered around the NNS, so I work very closely with the NNS team, whose responsibility is proposing continuous improvements to the NNS, SNS, and NNS dapp.</em></p><p><strong>What makes your role at DFINITY unique?</strong></p><p><em>Having had different roles at DFINITY, my work has always been very versatile and exciting. These days, I help shape the NNS dapp roadmap, and work closely with design and engineering to define new features and prioritize requests from the community while executing on our own vision for the NNS dapp.</em></p><p><em>Maybe a bit less traditional, but my role also includes a fair bit of public communication — proposing new features on the forum, answering questions or taking requests, helping with two YouTube series (ICP Developer Liftoff &amp; NNS Explained), advising teams building on ICP, and occasionally speaking at events.</em></p><p><strong>As a product manager, you interface with several different teams on different initiatives. What is one recent initiative that you were a part of?</strong></p><p><em>We recently started an initiative to motivate the ICP community to verify proposals and vote manually. Part of this initiative led by Lara Schmid, I am responsible for editing all episodes <!-- -->[of the YouTube series]<!-- --> as well as recording some <!-- -->[content]<!-- --> related to the NNS dapp and staking. If you’re interested, check out the series <a href="https://www.youtube.com/playlist?list=PLuhDt1vhGcrclxfmztDd6OKE80dnrFmG6" target="_blank" rel="noopener noreferrer">here</a>.</em></p><p><strong>As you mentioned, you also contribute to the different video series on the DFINITY YouTube channel, such as the NNS Explained and Developer Liftoff videos. What impact do these videos have on the community?</strong></p><p><em>These two series have different, but slightly overlapping, target audiences. That said, I’m equally excited about them — I believe they are very important to the ecosystem, and both are series I wish existed back when I started my journey in ICP land.</em></p><p><em><a href="https://www.youtube.com/watch?v=oBUpJ4CqmN0&amp;list=PLuhDt1vhGcrdR2h6nPNylXKS4u8L-efvD&amp;ab_channel=DFINITY" target="_blank" rel="noopener noreferrer">Developer Liftoff</a> is a complete developer tutorial series that takes a dev who hasn’t heard of ICP all the way to the point of being able to develop a wide variety of canisters with a general understanding of most of ICP’s unique capabilities.</em></p><p><em><a href="https://www.youtube.com/watch?v=1uX-fRgvXjU&amp;list=PLuhDt1vhGcrclxfmztDd6OKE80dnrFmG6&amp;ab_channel=DFINITY" target="_blank" rel="noopener noreferrer">NNS Explained</a> is a much needed series that explains many aspects of the NNS from how to stake ICP to how neuron following works to manually upgrade proposals.</em></p><p><em>Both series serve as a one-stop-shop for newcomers (as well as OGs) to get a fundamental understanding of important ICP concepts they can deepen later.</em></p><p><strong>It sounds like a lot of your work has a direct impact on the community by providing more educational resources for them to reference. Are there any other ways your role as a product manager interfaces with the developer community? </strong></p><p><em>I used to work very closely with the developer community, but even now, I’m involved in different initiatives that reach our developer community one way or another.</em></p><p><em>Some developer teams reach out to me to review their product or give advice. I’ve become a bit slower in responding, but I try to never say no. Some SNS teams make direct feature requests on the forum that I then try to incorporate into our roadmaps if possible.</em></p><p><em>Besides that, I work with the Growth and SDK teams on content for the DFINITY Developers X account (although less involved now than in the past), and edit videos that are targeted at developers.</em></p><p><strong>What advice would you give to developers looking to get started on ICP?</strong></p><p><em>For beginners, go through the Developer Liftoff series and start building something. First, build something simple that still uses ICP’s features, like a TODO dapp. You can add Internet Identity sign-in, you will need to use update calls to write to canister memory, and so on — all things that a more complex dapp will also use. You should also play around with sample projects; there is no need to develop everything from scratch.</em></p><p><em>For experienced developers, my advice is a bit different; don’t build something cool because it uses interesting technology that you enjoy using. Build something that solves a real world problem other dapps/apps don’t solve, and work your way back to picking the technology you need to use to solve that problem. What is the dapp that doesn’t exist but should?</em></p><p><strong>You mentioned being a primary contributor to the NNS roadmap. What roadmap items for the NNS are you most excited about?</strong></p><p><em>Two come to mind: <!-- -->[The]<!-- --> Neurons table that provides a much better overview of one’s neurons across all SNS DAOs, and importing custom ICRC tokens. I see both having a very positive impact on user experience. I’m personally excited to be using both.</em></p><p><strong>What roadmap item from another team are you most excited about?</strong></p><p><em>We are getting closer and closer to achieving a big milestone that involves different parts of the protocol, and will greatly reduce end-to-end latency for ICP. This should make all ICP dapps feel snappier without developers having to change anything.</em></p><p><strong>Let’s talk about the SNS communities that exist through the NNS dapp. Which SNS community is your personal favorite and why?</strong></p><p><em>This is a tricky one. A few weeks ago, I would have said OpenChat, as that is the ICP dapp that I use the most besides ICPSwap. However, since then, WaterNeuron has launched their SNS, which is one of the most exciting recent SNS launches. I’m really excited to see all three of these projects evolve.</em></p><p><em>If I have to pick just one, it’s probably OpenChat. They have been delivering great features non-stop for several years now. Their dapp is reliable, easy to use, quick, and keeps getting more cool features.</em></p><p><strong>To wrap things up, what’s your favorite thing about ICP?</strong></p><p><em>Hmmmm… It’s hard to pick. ICP has many unique features not seen in other blockchains that allow it to be this infinitely scalable full-stack decentralized cloud. But if I have to pick just one, I will say SNS. Not necessarily just the DAO framework itself, but the whole stack. An SNS DAO is the combination of many ICP features that make these DAOs very unique in the crypto landscape. They are in fact the only DAOs that I know of that allow full decentralization.</em></p><p><em>What I mean by that is that every component of an SNS DAO can be decentralized and controlled by its community, including the frontend, backend, and data. SNS DAOs don’t need to rely on AWS to serve frontend or host data. This is important because in other DAOs, developers still have a lot of centralized control over many components of software, with the exception of the smart contracts.</em></p><p><strong>Thanks again, Andrew, for providing such great insight into your unique role at DFINITY for us! Be sure to tune in next time for another individual spotlight interview!</strong></p>]]></content>
        <category label="Individual spotlight" term="Individual spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update July 24, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/24/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/24/news-and-updates/update"/>
        <updated>2024-07-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, there is a new release of PocketIC, the release of threshold Schnorr Beta testing on the mainnet, and several new developer docs.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="July 24 2024" src="/assets/images/dev-update-blog-july-24-1c1b5d905818501cbb95cec279ce182c.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, there is a new release of PocketIC, the release of threshold Schnorr Beta testing on the mainnet, and several new developer docs. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pocketic-v500">PocketIC v5.0.0<a href="#pocketic-v500" class="hash-link" aria-label="Direct link to PocketIC v5.0.0" title="Direct link to PocketIC v5.0.0">​</a></h2><p>A new version of PocketIC has been released! Version 5.0.0 introduces several new and exciting features, including:</p><ul><li><p>ECDSA support, allowing you to use any of the available ECDSA keys with the PocketIC instance of the II subnet.</p></li><li><p>PocketIC dashboard, an HTML page that shows all canisters deployed on your PocketIC instance.</p></li><li><p>Support for large Wasm files.</p></li><li><p>Support for mainnet canister IDs.</p></li><li><p>A state directory that preserves the PocketIC instance when PocketIC is restarted.</p></li><li><p>Support for testing features that are not available on the mainnet yet.</p></li></ul><p>Want to check out the full release notes? View the <a href="https://github.com/dfinity/ic/blob/cec100d1607eb2258441ff292a144ba88564458e/rs/pocket_ic_server/CHANGELOG.md#500---2024-07-22" target="_blank" rel="noopener noreferrer">full changelog</a> or check out the <a href="https://forum.dfinity.org/t/pocketic-version-5-0-0-several-new-cool-features/33544" target="_blank" rel="noopener noreferrer">forum discussion</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="threshold-schnorr">Threshold Schnorr<a href="#threshold-schnorr" class="hash-link" aria-label="Direct link to Threshold Schnorr" title="Direct link to Threshold Schnorr">​</a></h2><p>Threshold Schnorr is now available for beta testing on the mainnet! Threshold Schnorr on ICP is an exciting release because it unlocks several new workflows and use cases, such as:</p><ul><li><p>Support for BIP-340, which is Bitcoin's variant of Schnorr used in ordinals such as BRC-20.</p></li><li><p>Support for Ed25519 signatures, which are used by chains such as Solana, Cardano, Polkadot, and Ripple.</p></li><li><p>Higher signature throughput than threshold ECDSA signatures.</p></li><li><p>Allows canisters to obtain their own Schnorr public key and address, unlocking the ability for them to derive addresses on other chains, then authorize and submit transactions on those chains.</p></li></ul><p>Want to learn more? Check out the <a href="/building-apps/network-features/signatures/t-schnorr">threshold Schnorr overview</a>.</p><p>Want to start using threshold Schnorr? <a href="/building-apps/network-features/signatures/t-schnorr">Learn how to sign transactions with t-Schnorr</a></p><p>To use threshold Schnorr, you will need <a href="https://github.com/dfinity/sdk/releases/tag/0.22.0-beta.0" target="_blank" rel="noopener noreferrer"><code>dfx v0.22.0</code></a>, which is currently still in beta.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-developer-docs">New developer docs<a href="#new-developer-docs" class="hash-link" aria-label="Direct link to New developer docs" title="Direct link to New developer docs">​</a></h2><p>There are a few new developer docs this week, including:</p><ul><li><p><a href="/building-apps/network-features/time-and-timestamps">System time and timestamps</a>: Learn about how to use system time, how to convert timestamps into different formats, and how to calculate the difference between two timestamps.</p></li><li><p><a href="/">Auto-scaling architecture</a>: View an example of how to create a project that auto-scales based on memory usage.</p></li><li><p><a href="/building-apps/developer-tools/advanced-dfx/init-args">Init args</a>: Learn how to use init args and init arg files with <code>dfx</code>.</p></li></ul><p>This week, the agent documentation saw some significant revisions, specifically on these pages:</p><ul><li><p><a href="/building-apps/interact-with-canisters/agents/javascript-agent">JavaScript agent</a></p></li><li><p><a href="/building-apps/interact-with-canisters/agents/nodejs">Node.js</a></p></li><li><p><a href="/building-apps/interact-with-canisters/agents/rust-agent">Rust agent</a></p></li></ul><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update July 17, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/17/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/17/news-and-updates/update"/>
        <updated>2024-07-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, there is a new release of Agent-js, the first draft of the Bitfinity whitepaper to review, and an exciting forum conversation about AI to participate in.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="July 17 2024" src="/assets/images/dev-update-blog-july-17-397a32fa0be5c3fcc88f7d146efda3c5.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, there is a new release of Agent-js, the first draft of the Bitfinity whitepaper to review, and an exciting forum conversation about AI to participate in. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="agent-js-v200">Agent-js v2.0.0<a href="#agent-js-v200" class="hash-link" aria-label="Direct link to Agent-js v2.0.0" title="Direct link to Agent-js v2.0.0">​</a></h2><p>A new version of Agent-js has been released! Version 2.0.0 comes with some important, yet backwards <em>incompatible</em> changes. These changes support advanced use cases for building libraries with the <code>HttpAgent</code>.</p><p>The first change deprecates the <code>HttpAgent</code> constructor, replacing it with a preference for using <code>await HttpAgent.create()</code>. It automatically fetches the root key if you pass <code>shouldFetchRootKey: true</code> to the <code>HttpAgentOptions</code> for local development, and it will automatically run and configure the <code>syncTime</code> method.</p><p>The <code>createSync</code> method is recommended and preferred for use over accessing the <code>HttpAgent</code> constructor going forward:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">function getActor(options){</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- &nbsp; return new HttpAgent(options);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">+ &nbsp; return HttpAgent.createSync(options);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The second large change in this release makes the <code>HttpAgent</code> return more details after making a call. This change is to support the upcoming ICRC-49 standard. Now, <code>HttpAgent.call</code> provides:</p><ul><li><code>requestId</code>: The request ID to poll for.</li><li><code>response</code>: The raw <code>http</code> response from the boundary node.</li><li><code>requestDetails</code>: Details sent to the canister and used to compute the request ID.</li></ul><p><code>pollForResponse</code> was updated as well and now returns:</p><ul><li><code>certificate</code>: The certificate tree sent along with the reply.</li><li><code>reply</code>: The certified response from the replica.</li></ul><p>Want to learn more? Check out the <a href="https://forum.dfinity.org/t/agent-js-v2-0-0-is-released/33290" target="_blank" rel="noopener noreferrer">release announcement forum post</a> or the full <a href="https://github.com/dfinity/agent-js/releases/tag/v2.0.0" target="_blank" rel="noopener noreferrer">release notes</a> for more information.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bitfinity-whitepaper">Bitfinity whitepaper<a href="#bitfinity-whitepaper" class="hash-link" aria-label="Direct link to Bitfinity whitepaper" title="Direct link to Bitfinity whitepaper">​</a></h2><p>Bitfinity, a team building an EVM on ICP to serve as a Bitcoin layer-2 and deploy advanced Solidity smart contracts as canisters, has released their first whitepaper draft. This whitepaper details the Bitfinity architecture, components, and capabilities of the project.</p><p>The team is currently asking for feedback, comments, and questions from the community on the draft. You can read the paper on <a href="https://github.com/bitfinity-network/whitepapers/blob/main/Bitfinity_Network.pdf" target="_blank" rel="noopener noreferrer">GitHub</a> and leave your comments on the <a href="https://forum.dfinity.org/t/first-draft-bitfinity-whitepaper-sharding-evm-on-the-internet-computer/32687" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="join-the-conversation-ai-on-blockchain">Join the conversation: AI on blockchain<a href="#join-the-conversation-ai-on-blockchain" class="hash-link" aria-label="Direct link to Join the conversation: AI on blockchain" title="Direct link to Join the conversation: AI on blockchain">​</a></h2><p>What makes AI on blockchain difficult? A community conversation is happening on the forum to answer this question. DFINITY team member Diego Prats drafted a blog post discussing AI on blockchain and has published a draft on the <a href="https://forum.dfinity.org/t/what-makes-ai-on-blockchain-hard-request-for-feedback-on-post/32686" target="_blank" rel="noopener noreferrer">developer forum</a> to get feedback. So far, several community members have asked great questions, left insightful suggestions for revisions, and created a great conversation to reference and learn from. Check out the blog draft, leave your comments, and participate in the conversation today!</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Individual spotlight - NNS software engineer]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-nns</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-nns"/>
        <updated>2024-07-10T16:04:51.000Z</updated>
        <summary type="html"><![CDATA[In today's interview, we sat down with Andre from the Network Nervous System (NNS) team, who develop the NNS and the NNS dapp.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="SDK software engineer spotlight" src="/assets/images/indv-spotlight-3-0165e1cd81d16ee39f0f2060ce10328d.jpg" width="1400" height="675" class="img_ev3q"></p><p><strong>Hello everyone, and welcome back to another edition of the individual spotlight series! In today's interview, we sat down with Andre from the Network Nervous System (NNS) team, who develop the NNS and the NNS dapp. The NNS is ICP's governing body that facilitates updates or changes to the network through community voting on proposals.</strong></p><p><strong>To get started, could you describe what tools, projects, or features your team primarily works on or has ownership of?</strong></p><p><em>We develop the NNS, which manages the entire Internet Computer, as well as the SNS toolkit, currently used by 25 different teams outside of DFINITY. Additionally, we work on the NNS dapp, which serves as the community’s portal to all these DAOs.</em></p><p><strong>What makes the NNS team different from other teams at DFINITY?</strong></p><p><em>We are one of the few teams at DFINITY that uses the ICP from the perspective of an ICP developer, building canisters using DFINITY tooling. This unique position allows us to provide valuable feedback to other teams about features that would benefit ICP developers. We simultaneously develop the NNS, which manages the Internet Computer itself, and the SNS, which is a toolkit used by many external teams to manage their own projects.</em></p><p><strong>For those that may not be familiar with ICP, what is the NNS and what role does it play on the network?</strong></p><p><em>The NNS is a DAO that is central to the Internet Computer. When there is a need to upgrade the code of the Internet Computer, it must be done through an NNS proposal. Once such a proposal is executed, the nodes automatically begin using the new version. This principle also applies to other governance matters, such as voting on new node providers and allocating nodes to subnets. The NNS is recognized as the most advanced DAO in the world. A few years ago, it was realized that the structure of the NNS could manage not just the ICP but anything. Hence, the SNS was created as a mini-NNS with its own token to manage various decentralized applications (dapps), with all decisions made by its community. An SNS decentralization swap starts with an NNS proposal to create a new SNS, allowing users to exchange their ICP for a neuron within that SNS.</em></p><p><strong>How can the community interact with the NNS?</strong></p><p><em>The easiest way is to use the NNS dapp, available at <a href="https://nns.ic0.app/" target="_blank" rel="noopener noreferrer">https://nns.ic0.app/</a>. Like all dapps on ICP, this is backed by chain-key cryptography, which guarantees that what you see on the website reflects the true state of the Internet Computer, and is implemented as an unpermissioned frontend (meaning there is no code in the NNS that gives the NNS dapp special privileges in any way).</em></p><p><em>Using the NNS dapp, users can send and receive ICP, stake it to form neurons, and vote on proposals. You can even send and receive wrapped versions of Bitcoin, Ethereum, and USDC (trustlessly bridged to ICP). This makes the NNS dapp a great tool for anyone interested in ICP or crypto more generally.</em></p><p><em>Of course, the users of the NNS are likely to also be interested in the SNSes, so the NNS dapp also has great support for SNSes. Users can participate in SNS launches, send and receive SNS tokens, form SNS neurons, and vote on SNS proposals, all controlled by a single Internet Identity through a unified interface.</em></p><p><em>Another great option is through the ICP dashboard, available at <a href="https://dashboard.internetcomputer.org/" target="_blank" rel="noopener noreferrer">https://dashboard.internetcomputer.org/</a>. The homepage gives lots of information about the state of the Internet Computer, as well as allowing users to easily make canister calls to any SNS without being logged in. I personally use this all the time when an SNS community member posts a question on the forum that I can help with by doing something like checking their SNS settings. Of course, there are also CLI tools like <code>dfx</code> and Quill that can be used to interact with canisters on the Internet Computer including NNS and SNS canisters.</em></p><p><strong>Those are all great options; it seems we have a workflow for all different use cases and types of users. For new users, however, all those options might be overwhelming. How would you recommend someone new to ICP get started participating in the NNS?</strong></p><p><em>Interested users should make an account with the NNS dapp, send some ICP to it, and stake a neuron with a dissolve delay of at least 6 months. This will cause them to start earning maturity on their neuron after a few days, which can then be spawned into ICP.</em></p><p><em>In addition, they will then be able to vote on any open proposals created after they create their neuron. While I personally believe that voting on NNS proposals is its own reward, NNS users also receive voting rewards proportional to how often they vote.</em></p><p><em>If they want, they can also join the Neurons’ Fund. This is another use of the maturity of a neuron; some SNSes request Neurons’ Fund participation, which means that the maturity of eligible NNS neurons will be used to contribute to their decentralization sale. In exchange, those neurons are allocated an SNS neuron, which can be used to vote on and submit proposals for that SNS. All SNSes can only be created via the adoption of an NNS proposal, but if there is an SNS being proposed that they don’t like, they can always withdraw from the Neurons’ Fund.</em></p><p><strong>You mentioned that updates to the code of ICP are done through NNS proposals. If a community member wants to propose a change or add a feature, how can they make their voice heard?</strong></p><p><em>The first step would be to post on the forum explaining your point of view. After that, large changes are usually preceded by a motion proposal on the NNS, which is a special type of proposal that has no direct behavior on adoption but is used to find out if the majority of the community agrees with the motion. Then, the relevant team at DFINITY or elsewhere may implement the change and propose it to the NNS governance participants.</em></p><p><strong>Let's go back to SNSes on ICP. What is special about the ability to create an SNS?</strong></p><p><em>A DAO is a somewhat nonspecific term, and users by default can’t assume that a particular DAO has a particular behavior. Meanwhile, all SNSes are based on code that has been approved by the NNS governance participants, which means that they all share the same fundamental principles of operation, and they all have had their code audited by the same community that audits every change to the ICP itself.</em></p><p><strong>Of the current SNSes launched on ICP, which one is your personal favorite and why?</strong></p><p><em>I have a sentimental attachment to OpenChat as the OpenChat SNS launch was the moment when I felt like our work on the SNS had truly proven itself. Its launch involved millions of dollars worth of ICP being handled by our code and the decentralization of one of the largest dapps on ICP.</em></p><p><strong>Looking ahead at the features planned for the NNS this year, what roadmap items are you most excited about?</strong></p><p><em>I mostly work on the SNS, so roadmap items related to the SNS are the most exciting to me. My personal favorite is the “SNS Toolbox” item. Most of our work on the NNS and SNS involves developing the NNS and SNS themselves, but up soon on our list is to really focus on every other part of the experience, in particular the tools that users and developers use to understand and interact with them.</em></p><p><strong>What roadmap item from another team are you most excited about?</strong></p><p><em>I love the “best effort canister responses” feature. This is a somewhat technical feature, but the short version is that when one canister calls another, there is currently no inherent limit to the time that the caller will wait for the callee to respond. I think this is a good default, but there are cases where you want the caller to time out and abandon its call if the callee is taking a very long time to respond. The NNS is designed to be resilient to even very unlikely and exotic attacks, like a malicious subnet, and this feature will allow us to simplify a lot of our code that handles cases like that.</em></p><p><strong>Let's talk about your personal focus. What projects are you currently working on?</strong></p><p><em>Right now, I’m working on transferring the Neurons’ Fund participants’ hotkeys to their SNS neurons for future SNSes.</em></p><p><em>The owner of large neurons depends on the ability to keep the key for their neuron in cold storage, but they allocate “hotkeys” which are keys that have fewer permissions than their main key, which they can keep less secure. The benefit of this is that accidentally having a hotkey stolen or hacked doesn’t give the thief the ability to steal the ICP locked inside the neuron. Instead, the worst they can do is use the hotkey to vote on and submit proposals.</em></p><p><em>As I mentioned earlier, neurons can join the Neurons’ Fund, which means they may get an SNS neuron for each new SNS that is created while they’re in the fund. The issue is that your NNS neurons’ hotkeys are not automatically added to the SNS neuron you get for being part of the Neurons’ Fund. This means that they must go get their neuron’s “master key” out of cold storage and use it to set up hotkeys for their SNS neuron. We want to avoid putting them through this inconvenience, so our plan is to have the SNS automatically copy the hotkeys over when it gives the Neurons’ Fund participants their NNS neurons.</em></p><p><strong>That sounds like a great feature that will enhance the Neurons' Fund experience.</strong></p><p><strong>It was great learning so much about the NNS in this conversation; thanks, Andre, for chatting with us! To wrap things up, what’s your favorite thing about ICP?</strong></p><p><em>Of course I’m biased by being on the NNS team, but I think the tokenomics of ICP in relation to governance and neurons is very cool. Many DAOs have less sophisticated tokenomics, where anyone who holds that DAO’s token can vote. The issue is that you may find yourself incentivized to vote for the short-term benefit of the token at the cost of the long-term benefit. The NNS and SNS, on the other hand, only allow you to vote when you’ve locked your tokens in a neuron for a minimum staking period (six months in the NNS) and give you additional voting power for the longer you have your tokens locked for. This naturally reduces the incentive to consider only the short term when voting. To be honest, I even wonder if companies could structure their share-based voting system to work in a similar way. Since SNSes work this way, I think this gives an inherent advantage to projects managed via the SNS over other projects with worse voting incentives.</em></p><p><strong>Thanks again, Andre from the NNS team, for providing such great insight into the NNS for us! Be sure to tune in next time for another individual spotlight interview!</strong></p>]]></content>
        <category label="Individual spotlight" term="Individual spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update July 10, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/10/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/10/news-and-updates/update"/>
        <updated>2024-07-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have new releases of dfx, Motoko, and quill, a new video series called 'NNS Explained', and the release of a new e2e testing plugin for Internet Identity.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="July 10 2024" src="/assets/images/dev-update-blog-july-10-7dce6b80ee95cee063c2dc86b823177d.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have new releases of <code>dfx</code>, Motoko, and quill, a new video series called 'NNS Explained', and the release of a new e2e testing plugin for Internet Identity. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-tooling-releases-dfx-motoko-and-quill">Developer tooling releases: dfx, Motoko, and quill<a href="#developer-tooling-releases-dfx-motoko-and-quill" class="hash-link" aria-label="Direct link to Developer tooling releases: dfx, Motoko, and quill" title="Direct link to Developer tooling releases: dfx, Motoko, and quill">​</a></h2><p>This week, developer tooling received several updates with new releases of <code>dfx</code>, Motoko, and quill. Let's take a look at what each new release includes.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx">dfx<a href="#dfx" class="hash-link" aria-label="Direct link to dfx" title="Direct link to dfx">​</a></h3><p>A new beta release of <code>dfx</code> is available for testing! <code>v0.22.0-beta</code> includes several highly anticipated features and bug fixes:</p><ul><li>Asset uploads: If an asset upload returns an HTTP error from the replica, retries are done automatically. Errors that will be retried include:</li></ul><p>&nbsp; &nbsp; - 500: Internal server error</p><p>&nbsp; &nbsp; - 502: Bad gateway</p><p>&nbsp; &nbsp; - 503: Service unavailable</p><p>&nbsp; &nbsp; - 504: Gateway timeout</p><p>&nbsp; &nbsp; - 429: Too many requests</p><ul><li><p>Cycles ledger: The cycles ledger is supported unconditionally without needing to opt-in to the feature manually.</p></li><li><p>Added <code>dfx</code> schema support for .json files.</p></li><li><p><code>dfx extension install</code>: Uses the extension's <code>dependencies.json</code> file to pick the most compatible version.</p></li><li><p>Threshold Schnorr support: Enabled Threshold Schnorr signatures for <code>Bip340Secp256k1</code>.</p></li><li><p>Bug fix: Allow canisters to be deployed even if unrelated canisters in <code>dfx.json</code> are malformed.</p></li><li><p>Bug fix: Remove the unsafe-eval content security policy from the default starter template.</p></li><li><p>Bug fix: <code>dfx build</code> no longer requires a password for password-protected identities.</p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.22.0-beta.0" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.&nbsp;</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko">Motoko<a href="#motoko" class="hash-link" aria-label="Direct link to Motoko" title="Direct link to Motoko">​</a></h3><p>Motoko <code>v0.11.2</code> has been released! Changes in this new version include:</p><ul><li>Deprecation of the base library's ExperimentalStableMemory (ESM). A new flag <code>--experimental-stable-memory &lt;n&gt; controls the level of deprecation</code> with the options of:</li></ul><p>&nbsp; &nbsp; - <code>n &lt; 0</code>: Error on use of stable memory primitives.
&nbsp; &nbsp; - <code>n = 0</code>: Warn on use of stable memory primitives.
&nbsp; &nbsp; - <code>n &gt; 1</code>: Warning-less use of stable memory primitives (for legacy applications).</p><p>Developers using ExperimentalStableMemory should consider migrating their code to use the library <code>Region.mo</code> instead.</p><ul><li><p>Only warn on unused identifiers if type checking is error-free.</p></li><li><p>Bug fix: Fix the detection of unused declarations in switch and catch alternatives.</p></li></ul><p><a href="https://github.com/dfinity/motoko/releases/tag/0.11.2" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="quill">quill<a href="#quill" class="hash-link" aria-label="Direct link to quill" title="Direct link to quill">​</a></h3><p>A new version of quill, <code>v0.5.0</code> has been published. Updates in this release include:</p><ul><li><p>PEM files are now password-protected by default. PEM files must be used instead of seed files.</p></li><li><p>All commands now have human-readable output instead of Candid IDL format. Candid IDL can be provided using the <code>--raw</code> flag.</p></li><li><p>Support for setting the install mode for UpgradeSnsControlledCanister proposals.</p></li><li><p>Removal of the ability to claim GTC neurons via Ledger devices.</p></li></ul><p><a href="https://github.com/dfinity/quill/releases/tag/v0.5.0" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-explained-series">'NNS Explained' series<a href="#nns-explained-series" class="hash-link" aria-label="Direct link to 'NNS Explained' series" title="Direct link to 'NNS Explained' series">​</a></h2><p>We're excited to announce a new YouTube video series: NNS Explained! This series is designed to provide education around high level NNS concepts, including how to interact with the NNS and how to verify a proposal's authenticity.</p><p>This series was created in response to an increased interest in the NNS from the ICP community. Since the NNS is such an important component of ICP, the team felt that this series would be extremely beneficial.&nbsp;</p><p>You can <a href="https://forum.dfinity.org/t/announcement-nns-explained-youtube-series/32337" target="_blank" rel="noopener noreferrer">learn more on the forum</a> or start the series on <a href="https://www.youtube.com/playlist?list=PLuhDt1vhGcrclxfmztDd6OKE80dnrFmG6" target="_blank" rel="noopener noreferrer">YouTube</a>.&nbsp;</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="internet-identity-e2e-testing-playwright-plugin">Internet Identity e2e testing: Playwright plugin<a href="#internet-identity-e2e-testing-playwright-plugin" class="hash-link" aria-label="Direct link to Internet Identity e2e testing: Playwright plugin" title="Direct link to Internet Identity e2e testing: Playwright plugin">​</a></h2><p>A new way to execute e2e testing for Internet Identity has been released. The II Playwright plugin was designed to replicate an e2e plugin used to test Metamask authentication workflows, providing the same e2e test format for Internet Identity.</p><p>To use the plugin, simply install the package <code>@dfinity/internet-identity-playwright</code>, then write your tests:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">import {testWithII} from '@dfinity/internet-identity-playwright';</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">testWithII('should sign-in with a new user', async ({page, iiPage}) =&gt; {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&nbsp; await page.goto('/');</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&nbsp; await iiPage.signInWithNewIdentity();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">});</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Want to learn more? Check out the <a href="https://forum.dfinity.org/t/internet-identity-playwright-plugin/33020" target="_blank" rel="noopener noreferrer">forum post</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update July 3, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/03/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/07/03/news-and-updates/update"/>
        <updated>2024-07-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have a new beta of dfx that introduces support for PocketIC, the release of the Motoko 2024 roadmap, and a community project to showcase. Let's get started!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="July 3 2024" src="/assets/images/dev-update-blog-july-03-a53ce597762cfcb5c4c64a5ca9ebe1bc.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have new chain-key tokens live on the mainnet, proposals for updates to the NNS and SNSes, and a request for community feedback on the proposed ICRC-4 standard. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ckpepe-and-ckoct">ckPEPE and ckOCT<a href="#ckpepe-and-ckoct" class="hash-link" aria-label="Direct link to ckPEPE and ckOCT" title="Direct link to ckPEPE and ckOCT">​</a></h2><p>This past week, two proposals for new ckERC20 tokens were passed: ckPEPE and ckOCT! ckPEPE is a digital twin of the Ethereum meme token PEPE, while ckOCT is the digital twin of OCT, the native token for Omnity Network, previously known as Octopus Network.</p><p>ckPEPE is intended to bring its popular memecoin counterpart to ICP, with the hope of paving the way for other meme chain-key tokens such as ckDOGE in the future. ckOCT intends to migrate the liquidity of OCT onto ICP since Omnity Network is an ICP project. Omnity plans to launch their SNS token later this year, allowing ckOCT to be swapped for the Omnity SNS tokens.</p><p>To learn more about creating ckERC20 tokens, check out the <a href="/defi/chain-key-tokens/ckerc20/overview">developer documentation</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-and-sns-update-proposals">NNS and SNS update proposals<a href="#nns-and-sns-update-proposals" class="hash-link" aria-label="Direct link to NNS and SNS update proposals" title="Direct link to NNS and SNS update proposals">​</a></h2><p>This week's NNS update proposal features the following improvements and enhancements:</p><ul><li><p>Enhanced API and performance improvements for the <code>list_neurons</code> method, now allowing empty neurons to be excluded.</p></li><li><p>Improvements to logging.</p></li><li><p><code>registry_version</code> is being used to calculate the monthly node provider rewards.</p></li></ul><p>You can view the proposal details on the <a href="https://forum.dfinity.org/t/nns-updates-june-28-2024/32493" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>Additionally, this week there is a proposal for an SNS update to improve logging for failed upgrades. You can view this proposal on the <a href="https://forum.dfinity.org/t/sns-updates-june-28-2024/32494" target="_blank" rel="noopener noreferrer">developer forum</a> as well.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="request-for-feedback-icrc-4">Request for feedback: ICRC-4<a href="#request-for-feedback-icrc-4" class="hash-link" aria-label="Direct link to Request for feedback: ICRC-4" title="Direct link to Request for feedback: ICRC-4">​</a></h2><p>The tokenization and ledger working group has announced that the ICRC-4 standard is nearing finalization and is ready for review, comments, and feedback.</p><p>ICRC-4 would introduce a standard for batch processing transfers for fungible ICRC-1 tokens. The motivation behind this standard is to optimize and reduce the cost of executing multiple transfers that originate from the same principal.</p><p>ICRC-4 would be an extension of ICRC-1 that enables multiple subaccounts owned by a principal to transfer tokens to multiple recipient accounts in a single ledger call. This workflow would reduce the latency and overall cost that the current multi-account token transfer workflow experiences.</p><p>Please leave your feedback in the <a href="https://forum.dfinity.org/t/icrc4-batch-transfers-nearing-finalization-please-review/27395" target="_blank" rel="noopener noreferrer">ICRC-4 discussion forum post</a> or the related <a href="https://github.com/dfinity/ICRC/issues/4" target="_blank" rel="noopener noreferrer">GitHub issue</a>.</p><p>If you'd like to participate in the tokenization and ledger working group, consult the <a href="https://calendar.google.com/calendar/embed?src=c_cgoeq917rpeap7vse3is1hl310%40group.calendar.google.com&amp;ctz=Europe%2FZurich" target="_blank" rel="noopener noreferrer">working group events calendar</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 26, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/06/26/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/06/26/news-and-updates/update"/>
        <updated>2024-06-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have a new beta of dfx that introduces support for PocketIC, the release of the Motoko 2024 roadmap, and a community project to showcase. Let's get started!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 26 2024" src="/assets/images/dev-update-blog-june-26-6b38149edd8e2edfa4948688c6100f85.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we're excited to share several new pages of documentation, a proposal for a new ckERC20 token, and provide information about upcoming ICP events. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-docs">New docs<a href="#new-docs" class="hash-link" aria-label="Direct link to New docs" title="Direct link to New docs">​</a></h2><p>This week, the ICP Dev Docs received several new additions, including digital asset pages for wallets and NFTs, plus new Chain Fusion pages that detail ckERC20 tokens and a list of different chains supported by ICP. Here are the details:</p><ul><li><p><a href="/defi/overview">Wallet overview</a>: Learn about types of asset wallets on ICP.</p></li><li><p><a href="/defi/overview">NFTs overview</a>: Learn about ICP's NFT standards, ICRC-7 and ICRC-37.</p></li><li><p><a href="/defi/overview">NFT collections</a>: A tutorial using ICRC-7 to deploy your own NFT collection.</p></li><li><p><a href="/defi/overview">NFT marketplaces</a>: A list of dapps on ICP that support buying and selling NFTs.</p></li><li><p><a href="/building-apps/chain-fusion/supported-chains">Supported chains</a>: A list of chains that ICP can integrate with using native integrations or an RPC service through HTTPS outcalls</p></li><li><p><a href="/defi/chain-key-tokens/ckerc20/overview">ckERC20 overview</a>: Learn about ckERC20 tokens, such as ckUSDC and ckLINK.</p></li><li><p><a href="/defi/chain-key-tokens/ckerc20/making-transactions">ckERC20 transactions</a>: Swap ckERC20 tokens for ERC20 tokens and vice versa.</p></li><li><p><a href="/defi/chain-key-tokens/ckerc20/using-ckerc20-in-dapps">ckERC20 in dapps</a>: Learn how to target a ledger canister in your code for ckERC20 tokens.</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ckpepe-proposal">ckPEPE proposal<a href="#ckpepe-proposal" class="hash-link" aria-label="Direct link to ckPEPE proposal" title="Direct link to ckPEPE proposal">​</a></h2><p>A new ckERC20 token has been proposed! So far, we've seen the deployment of ckUSDC and ckLINK on ICP, but a third token has been submitted to the NNS for approval: ckPEPE! This would be a chain-key twin token of the PEPE ERC-20 token deployed on Ethereum. PEPE is considered a 'memecoin', meaning it was named after a character, individual, animal, or piece of artwork, and is used for entertainment purposes.</p><p><a href="https://nns.ic0.app/proposal/?u=qoctq-giaaa-aaaaa-aaaea-cai&amp;proposal=130755" target="_blank" rel="noopener noreferrer">Vote on the NNS proposal</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="upcoming-events">Upcoming events<a href="#upcoming-events" class="hash-link" aria-label="Direct link to Upcoming events" title="Direct link to Upcoming events">​</a></h2><p>Chain Fusion Summer is in full swing with some great in person and virtual events planned over the next few months. Here are some we're excited for:</p><ul><li><p>Chain Fusion Day in Brussels on July 10th: An in person event at the ETHCC conference. <a href="https://lu.ma/ycx0it2u" target="_blank" rel="noopener noreferrer">RSVP</a>.</p></li><li><p>Chain Fusion Day in Nashville on July 26th: An in person event at the Bitcoin Nashville conference. <a href="https://lu.ma/cfdnashville" target="_blank" rel="noopener noreferrer">RSVP</a>.</p></li><li><p>ICP Dev Conf: An online conference featuring keynote speakers and developer workshops. <a href="https://sessionize.com/icp-devconf-2024/" target="_blank" rel="noopener noreferrer">Register here</a>.</p></li><li><p>Hackernoon writing contest: An online event where writers can enter a piece about AI on ICP and have a chance to win a portion of the $1,000 prize pool. <a href="https://hackernoon.com/win-big-in-the-decentralize-ai-writing-contest-by-icp-and-hackernoon" target="_blank" rel="noopener noreferrer">Enter today</a>.</p></li></ul><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 19, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/06/19/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/06/19/news-and-updates/update"/>
        <updated>2024-06-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have a new beta of dfx that introduces support for PocketIC, the release of the Motoko 2024 roadmap, and a community project to showcase. Let's get started!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 19 2024" src="/assets/images/dev-update-blog-june-19-80777740a6210a5ead76070084509fa4.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have a new beta of <code>dfx</code> that introduces support for PocketIC, the release of the Motoko 2024 roadmap, and a community project to showcase. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0202-beta0"><code>dfx v0.20.2-beta.0</code><a href="#dfx-v0202-beta0" class="hash-link" aria-label="Direct link to dfx-v0202-beta0" title="Direct link to dfx-v0202-beta0">​</a></h2><p>In the recent beta of <code>dfx</code>, version <code>v0.20.2-beta.0</code>, the long-awaited support for PocketIC is here! <a href="/building-apps/test/pocket-ic">PocketIC</a> is a lightweight testing suite designed for creating fine-grained canister tests on your local machine. It supports running tests in parallel and setting specific testing variables, such as stable memory.</p><p>To use PocketIC with <code>dfx</code>, you can use the new flag <code>--pocketic</code> with <code>dfx start</code> to start a PocketIC server instead of the local replica. The PocketIC server is more lightweight than the replica, and the execution environment's internals can be interacted with through REST commands.</p><p>In addition to PocketIC support, <code>v0.20.2</code> includes other new features such as:</p><ul><li><p>Improved sync command performance, such as <code>dfx deploy</code> and <code>icx-asset sync</code>.</p></li><li><p>A subaccount can now be derived from a principal in <code>dfx ledger account-id</code>.</p></li><li><p>The command <code>dfx info candid-ui-url</code> displays the URL for a canister's Candid UI for an explicitly specific network. The default is the local network.</p></li></ul><p>This release includes the following fixes:</p><ul><li><p>A fix for <code>dfx canister delete</code> failing if it attempts to withdraw too many cycles before the canister is deleted.</p></li><li><p>Include the <code>.well-known</code> directory by default for asset uploads in frontend canisters.</p></li><li><p>A fix for when <code>dfx ledger create-canister</code> with the <code>--next-to</code> flag would transfer funds too early.</p></li></ul><p><a href="https://github.com/dfinity/sdk/releases/tag/0.20.2" target="_blank" rel="noopener noreferrer">Read the full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-roadmap-2024">Motoko roadmap 2024<a href="#motoko-roadmap-2024" class="hash-link" aria-label="Direct link to Motoko roadmap 2024" title="Direct link to Motoko roadmap 2024">​</a></h2><p>The Motoko 2024 roadmap has been <a href="https://forum.dfinity.org/t/motoko-2024-roadmap/31912" target="_blank" rel="noopener noreferrer">announced on the forum</a>! This roadmap is jam packed with exciting new features and changes to the language, with a focus on addressing feedback the team has received from the Motoko developer community.</p><p>Some highlights from the roadmap include:</p><ul><li><p>Base library 2.0: The team plans to revamp some of the most common base library methods and provide a better template for the community to use when developing base library additions.</p></li><li><p>FFI via Wasm component model: An exploration into how to support multi-language canisters, such as a Motoko program using a Rust crate, is planned for 2024.</p></li><li><p>VSCode extension enhancements: By popular demand, the VSCode extension will receive several added features and enhancements.</p></li><li><p>Canister state snapshots: Support for creating a snapshot of a canister's state that can be used to roll back the canister in the future.</p></li><li><p>Actor mixins: This feature would allow a Motoko canister to import an actor when the canister already has an actor defined.</p></li><li><p>Enhanced orthogonal persistence: A fundamental change to how the heap and stable memory interact with each other, resulting in a simpler and more seamless experience while working with persistent data.</p></li></ul><p>View the full roadmap on the <a href="https://forum.dfinity.org/t/motoko-2024-roadmap/31912" target="_blank" rel="noopener noreferrer">dev forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-showcase-maia-medical-ai-assistant">Community showcase: MAIA: Medical AI assistant<a href="#community-showcase-maia-medical-ai-assistant" class="hash-link" aria-label="Direct link to Community showcase: MAIA: Medical AI assistant" title="Direct link to Community showcase: MAIA: Medical AI assistant">​</a></h2><p>Introducing MAIA, the medical AI assistant on ICP! This project intends to use AI image classification models to help provide medical professionals with a supporting source when diagnosing certain conditions. In the initial phase of the project, it plans to support analyzing CT scans for brain, kidney, and lung diagnosis purposes, as well as analyze chest x-rays, skin lesion images, and answer basic medical questions.</p><p>An initial demo of the project can be seen <a href="https://forum.dfinity.org/t/introducing-maia-medical-ai-assistant-on-internet-computer/32022" target="_blank" rel="noopener noreferrer">on the developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Individual spotlight - Motoko software engineer]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-languages</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-languages"/>
        <updated>2024-06-17T19:49:48.000Z</updated>
        <summary type="html"><![CDATA[In this edition of individual spotlight, we sat down with Ryan from the Languages team, who contributes to the development of the Motoko programming language.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="SDK software engineer spotlight" src="/assets/images/indv-spotlight-2-05b89db3ddad3dd3759cf7bfb3bcfe97.jpg" width="1400" height="675" class="img_ev3q"></p><p><strong>Hello everyone, and welcome back to another edition of the individual spotlight series! In today's interview, we sat down with Ryan from the DFINITY Languages team, who are primary contributors to the Motoko programming language. The <a href="https://forum.dfinity.org/t/motoko-2024-roadmap/31912" target="_blank" rel="noopener noreferrer">Motoko 2024 roadmap</a> was just recently announced on the developer forum, so there is no better time to dive into Motoko than in this week's issue!</strong></p><p><strong>Thanks so much for taking the time to chat with us today, Ryan. Let's start by talking about what projects or tools the Languages team has ownership of.</strong></p><p><em>The main focus of the Languages team is Motoko, which is ICP’s native smart contract programming language. We also work on several other languages such as Candid and ic-repl along with IDE extensions and other development tools.</em></p><p><strong>What makes the Languages team different from other teams at DFINITY?</strong></p><p><em>Because Motoko is such an important foundation for all the applications built on top of it, we do our best to account for community feedback at all times. Through forum posts, monthly working group meetings, Developer Experience Feedback Board submissions, and the Motoko GitHub repository, we actively encourage feedback about Motoko so we can prioritize the highest-value language features.</em></p><p><strong>Let's talk about the 2024 roadmap. What items are you most excited about?</strong></p><p><em>Luc’s (another engineer on the team) “enhanced orthogonal persistence” feature is my top pick. As a quick overview of how this works, the idea is to change the memory layout of the language to massively increase the scalability and performance across canister upgrades (removing the distinction between “stable” and “flexible” variables). While this sounds like a low-level change, it’s a game-changer for applications which need to scale beyond the original 4GB main memory limitation, unlocking a much wider range of enterprise-grade applications which are feasible to build in Motoko.</em></p><p><strong>What about the roadmap for other teams, are there any items you're excited about?</strong></p><p><em>I’m very excited about the possibility of built-in support for WASI Preview 2 on the Internet Computer. Being able to deploy WASI applications on ICP would be extremely powerful to the point where it becomes easy to forget that you’re developing on a blockchain. Beyond enabling support for many new programming languages, the Wasm Component Model (part of WASI 2) would make it possible to build canisters which use libraries written in multiple languages. An example use case is a Motoko actor being able to call functions from a Rust crate or TypeScript library.</em></p><p><strong>Let’s talk about the EVM RPC canister, a project that you were a primary contributor to. What is the EVM RPC canister?</strong></p><p><em>Right, so the EVM RPC canister is essentially a smart contract which makes it possible to interact with Ethereum and hundreds of other EVM blockchains in a secure, decentralized way. The goal is for ICP to become the go-to ecosystem for building cross-chain applications, and it’s clear that this is already happening given the popularity of the EVM RPC canister right now.</em></p><p><strong>What makes the EVM RPC integration different from ICP’s native Bitcoin integration?</strong></p><p><em>In contrast to ckBTC, which is more or less a Bitcoin node running directly on the Internet Computer, the EVM RPC canister uses consensus between multiple JSON-RPC APIs. This is fully customizable; you can decrease the number of RPC providers to reduce the cost per call, or you can even add your own custom API endpoints for a specific use case or brand-new EVM network.</em></p><p><strong>Since the Bitcoin integration is a direct node integration with BTC, the EVM RPC canister might sound as if it acts like a bridge, even though under the hood it doesn't. How does the EVM RPC canister differ from a bridge or oracle?</strong></p><p><em>A major advantage of ICP—which makes the EVM RPC canister possible—is the ability to perform HTTPS outcalls. Instead of using an expensive oracle, you can simply send a standard HTTP request which is processed by each node in your canister’s subnet. The protocol handles consensus so that you don’t need to trust any individual nodes sending these requests.</em></p><p><em>While this is a highly useful feature for the EVM RPC canister, it’s also relatively simple to use this in any ICP application! If you Google “icp https outcalls” or ask the AI chatbot on internetcomputer.org, you’ll find lots of good documentation on how to get started with this feature.</em></p><p><strong>What are the possibilities that the EVM RPC canister unlocks for developers?</strong></p><p><em>Oh, don’t even get me started. Beyond making it possible to move value between chains through projects such as ckETH and ckUSDC, it’s also possible to run low-cost smart contract computations using EVM assets which would otherwise be at least 10 or 100 times more expensive on their original network. Furthermore, if you wanted to launch your own EVM-based blockchain, the EVM RPC canister is by far the simplest way to connect your network to the broader Web3 ecosystem.</em></p><p><strong>What design choices were made regarding the format and functionality of the EVM RPC canister?</strong></p><p><em>The main design challenge was to find a good compromise between decentralization and reliability. While the canister is governed by the NNS, we also wanted a way to be able to quickly respond to disruptions in availability. Currently, DFINITY has the ability to perform maintenance actions such as replacing API keys for RPC providers. Everything else is decentralized and subject to a voting process via NNS proposals.</em></p><p><strong>Was there any developer feedback that was used to either revise or make additions to the EVM RPC canister?</strong></p><p><em>You know it! The biggest community feature request was to simplify calling Ethereum Layer 2 (L2) networks, which we recently included as part of the official launch of the canister. We also made several revisions to the Candid interface and fixed user-reported bugs during the beta testing phase prior to launch.</em></p><p><strong>Now that the EVM RPC canister has been launched, what projects are you currently working on?</strong></p><p><em>My current focus is exploring how we could use the WebAssembly Component Model to provide cross-language interoperability between Motoko and other languages such as Rust and TypeScript.</em></p><p><em>This is primarily based on community feedback! One of the most highly requested features for Motoko is the ability to use libraries (“crates”) from the Rust ecosystem. With the current momentum towards supporting WASI 2 in the replica, we are getting much closer to being able to support cross-language functionality within a single ICP canister.</em></p><p><em>Even if you’re unfamiliar with Rust, this feature will greatly expand the available package ecosystem and ultimately gives you more problem-solving flexibility as an ICP developer.</em></p><p><strong>What advice would you give a new developer getting started on ICP?</strong></p><p><em>From having originally been part of the ICP community before working at DFINITY, I would encourage starting small and learning one thing at a time. The Internet Computer is a huge, complex protocol, but I assure you that once you understand the basics, everything else will start falling into place and you’ll be able to tackle much more ambitious projects.</em></p><p><em>If you’re already familiar with traditional web development, writing a frontend canister is a great way to get started with familiar technologies (JS/TS, HTML, CSS, etc.) while also learning how to deploy and upgrade ICP canisters using dfx.</em></p><p><strong>Are there any community projects or tools that you’ve been using recently? If so, how do they impact things that you’re working on?</strong></p><p><em>The Mops package manager for Motoko is a great community project which is used internally at DFINITY. I’ve also recently used a nifty community project called ic-reactor, which makes it simple to perform canister calls from a React frontend.</em></p><p><strong>Thanks so much for chatting with us today Ryan, this was great! To wrap things up, what is your favorite thing about ICP?</strong></p><p><em>The upside potential of the token price! Just kidding. What I love about ICP is that it’s a solid, well-established, and incredibly impressive technical solution to many of the biggest problems with the centralized Internet. From my time working here, I can say that DFINITY is truly an iceberg of extremely talented people working towards a common goal of making the idealized vision of Web3 into a practical reality.</em></p><p><strong>Thanks again Ryan for an incredible chat about Motoko and the EVM RPC canister! Be sure to tune in next time for another individual spotlight interview.</strong></p>]]></content>
        <category label="Individual spotlight" term="Individual spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 12, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/06/12/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/06/12/news-and-updates/update"/>
        <updated>2024-06-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we're excited to announce the new ICP Education Hub, discuss a new NNS-related topics, and showcase a new example dapp that uses parallel inter-canister calls.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 12 2024" src="/assets/images/dev-update-blog-june-12-3d76a3529e7f1929b9eb45626aa563ab.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we're excited to announce the new ICP Education Hub, discuss new NNS-related topics, and showcase a new example dapp that uses parallel inter-canister calls. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-education-hub">ICP Education Hub<a href="#icp-education-hub" class="hash-link" aria-label="Direct link to ICP Education Hub" title="Direct link to ICP Education Hub">​</a></h2><p>Introducing the ICP Education Hub! This new webpage aggregates all ICP educational content into one place. Examples include the ICP Developer Liftoff video series, the Zero to Dapp series in collaboration with Encode Club, the new Chain Fusion educate video series, blogs, documentation, and more!</p><p><a href="https://internetcomputer.org/education-hub" target="_blank" rel="noopener noreferrer">Check out all 130+ resources</a>.</p><p>Have a course or piece of content you want to add? Click the 'Submit your course' button on the page!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-neurons-request-for-comment">NNS neurons: Request for comment<a href="#nns-neurons-request-for-comment" class="hash-link" aria-label="Direct link to NNS neurons: Request for comment" title="Direct link to NNS neurons: Request for comment">​</a></h2><p>The DFINITY NNS team has proposed a change to neuron visibility. This change would allow neurons to choose whether they are publicly visible or private, allowing neurons to keep their voting decisions private or advertise themselves publicly for following.</p><p>If accepted, the following fields of neurons selected to be 'private' would still be visible to the public:</p><ul><li><p>Neuron ID</p></li><li><p>Stake and voting power</p></li><li><p>Dissolve delay and age</p></li></ul><p>In contrast, public nodes would expose the following data:</p><ul><li><p>Neuron ID</p></li><li><p>Controller</p></li><li><p>Hot keys</p></li><li><p>If the node is KYC verified</p></li><li><p>If the node is Not for Profit</p></li><li><p>Known neuron data</p></li><li><p>Neuron stake, fees, and maturity data</p></li><li><p>Time to dissolve and dissolve delay</p></li><li><p>Time created and age since creation</p></li><li><p>Followees</p></li><li><p>Recent ballots</p></li><li><p>Timestamp of when the neuron joined the community fund</p></li><li><p>Transfer data</p></li></ul><p><a href="https://forum.dfinity.org/t/request-for-comment-public-private-nns-neurons/31597" target="_blank" rel="noopener noreferrer">Read more details on the forum and participate in the conversation</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-proposal-add-public-and-restricted-canister_status-visibility">NNS proposal: Add public and restricted <code>canister_status</code> visibility<a href="#nns-proposal-add-public-and-restricted-canister_status-visibility" class="hash-link" aria-label="Direct link to nns-proposal-add-public-and-restricted-canister_status-visibility" title="Direct link to nns-proposal-add-public-and-restricted-canister_status-visibility">​</a></h2><p>Another forum discussion regarding NNS changes is currently looking for comments and community input. This proposal suggests adding public and restricted <code>canister_status</code> visibility options. Currently, the <code>canister_status</code> function on the management canister returns information about a canister's controllers, Wasm hash, resource usage, and cycles balance. This endpoint can only be called by the controller of the canister.</p><p>This proposal suggests that a canister can voluntarily make this information public so that it can be queried by principals that are not controllers of the canister.</p><p><a href="https://forum.dfinity.org/t/nns-proposal-add-public-and-restricted-canister-status-visibility/31814/1" target="_blank" rel="noopener noreferrer">Read more about this proposal and join the conversation on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-example-parallel-inter-canister-calls">New example: Parallel inter-canister calls<a href="#new-example-parallel-inter-canister-calls" class="hash-link" aria-label="Direct link to New example: Parallel inter-canister calls" title="Direct link to New example: Parallel inter-canister calls">​</a></h2><p>A new example has been added to the <a href="https://github.com/dfinity/examples/" target="_blank" rel="noopener noreferrer">DFINITY examples repo</a>! This example, available in both Motoko and Rust, demonstrates how to implement a project that runs inter-canister calls in parallel. Using parallel, independent calls can help lower latency, especially when inter-canister calls are made across multiple subnets. One example use case for parallel calls might be a token swap that launches both token transfer operations at the same time.</p><p>Check out this example in <a href="https://github.com/dfinity/examples/tree/master/motoko/parallel_calls" target="_blank" rel="noopener noreferrer">Motoko</a> and <a href="https://github.com/dfinity/examples/tree/master/rust/parallel_calls" target="_blank" rel="noopener noreferrer">Rust</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 5, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/06/05/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/06/05/news-and-updates/update"/>
        <updated>2024-06-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have a new version of `dfx`, a new example of Chain Fusion technology at work, and a new exciting feature from the community project, CycleOps.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 5 2024" src="/assets/images/dev-update-blog-june-5-37f40f1c503e5a0fcc431d76924b1141.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have a new version of <code>dfx</code>, a new example of Chain Fusion technology at work, and a new exciting feature from the community project, CycleOps. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0201-has-been-released"><code>dfx v0.20.1</code> has been released!<a href="#dfx-v0201-has-been-released" class="hash-link" aria-label="Direct link to dfx-v0201-has-been-released" title="Direct link to dfx-v0201-has-been-released">​</a></h2><p>A new version of <code>dfx</code> has been released! This release includes new features such as:</p><ul><li>Reformatted error output. <code>dfx</code> now uses the 'Caused by:' prefix for errors, reporting the error with its cause rather than embedding the cause within the error's text. For example, before <code>v0.20.1</code>, error messages looked like this:</li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: Failed while trying to deploy canisters.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Caused by: Failed while trying to deploy canisters.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Failed to build all canisters.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    Failed while trying to build all canisters.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      The build step failed for canister 'bw4dl-smaaa-aaaaa-qaacq-cai' (wasminst_backend) with an embedded error: Failed to build Motoko canister 'wasminst_backend'.: Failed to compile Motoko.: Failed to run 'moc'.: The command '"/Users/ericswanson/.cache/dfinity/versions/0.19.0/moc" ... params ...  failed with exit status 'exit status: 1'.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Stdout:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Stderr:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">/Users/ericswanson/w/wasminst/src/wasminst_backend/main2.mo: No such file or directory</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Now, error messages will look like this:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: Failed while trying to deploy canisters.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Caused by: Failed to build all canisters.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Caused by: Failed while trying to build all canisters.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Caused by: The build step failed for canister 'bw4dl-smaaa-aaaaa-qaacq-cai' (wasminst_backend)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Caused by: Failed to build Motoko canister 'wasminst_backend'.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Caused by: Failed to compile Motoko.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Caused by: Failed to run 'moc'.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Caused by: The command '"/Users/ericswanson/.cache/dfinity/versions/0.20.0/moc" ... params ... failed with exit status 'exit status: 1'.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Stdout:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Stderr:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">/Users/ericswanson/w/wasminst/src/wasminst_backend/main2.mo: No such file or directory</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><p>New support for the <code>wasm_memory_limit</code> canister setting, which allows developers to limit a canister's heap memory for most calls. This setting does not affect queries, and can be set in the <code>dfx canister create</code> or <code>dfx canister update-settings</code> commands using the <code>--wasm-memory-limit</code> flag.</p></li><li><p>Support for a new field in <code>dfx.json</code>, <code>init_arg_file</code>, which enables a new workflow for specifying a canister's initialization arguments.</p></li></ul><p>You can read the <a href="https://github.com/dfinity/sdk/releases/tag/0.20.1" target="_blank" rel="noopener noreferrer">full release notes</a> or report any bugs on <a href="https://forum.dfinity.org/t/dfx-0-20-1-is-promoted/31321" target="_blank" rel="noopener noreferrer">the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="generate-a-sui-address-for-a-canister">Generate a Sui address for a canister<a href="#generate-a-sui-address-for-a-canister" class="hash-link" aria-label="Direct link to Generate a Sui address for a canister" title="Direct link to Generate a Sui address for a canister">​</a></h2><p>ICP's Chain Fusion technology allows for canisters deployed on ICP to communicate with any chain with a direct ICP integration, or any chain that supports ECDSA signatures. Currently, the EVM RPC canister can be used to communicate with Ethereum and EVM-compatible chains, but what about a non-EVM chain that supports ECDSA?</p><p>DFINITY's developer relations engineer Jennifer Tran recently participated in the Consensus 2024 Hackathon where she showcased the power of Chain Fusion for non-EVM chains. In her project, she showcased how an ICP canister can generate an address for the Sui network, then sign a Sui transaction.</p><p>Want to learn more? Check out the <a href="https://github.com/jennifertrin/suionicp/tree/main" target="_blank" rel="noopener noreferrer">canister example</a> to start developing with Sui on ICP!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-spotlight-cycleops-now-supports-sns-visibility">Community spotlight: CycleOps now supports SNS visibility!<a href="#community-spotlight-cycleops-now-supports-sns-visibility" class="hash-link" aria-label="Direct link to Community spotlight: CycleOps now supports SNS visibility!" title="Direct link to Community spotlight: CycleOps now supports SNS visibility!">​</a></h2><p>The community project <a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">CycleOps</a> has an exciting new feature! CycleOps is a tool that can be used to maintain a canister's cycles by setting rules  such as automatically topping up a canister whenever its cycles fall below a certain limit.</p><p>CyclesOps now features an <a href="https://sns.cycleops.dev/" target="_blank" rel="noopener noreferrer">SNS CyclesOps</a> dashboard, which aggregates the amount of cycles burned by each SNS. For example, here is the dashboard for the SNS OpenChat:</p><p><img loading="lazy" alt="OpenChat CyclesOps" src="/assets/images/OpenChat_cyclesops-e52b41240c5e5ceb934214e3496b17bc.png" width="3440" height="1756" class="img_ev3q"></p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Individual spotlight - Software engineer]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-sdk</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/individual-spotlight-sdk"/>
        <updated>2024-06-03T22:39:15.000Z</updated>
        <summary type="html"><![CDATA[To kick off this series, we sat down with Linwei, a software engineer from the SDK team.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="SDK software engineer spotlight" src="/assets/images/indv-spotlight-1-ad283cca050bc8c5fa2bed4cab26f2b0.jpg" width="1400" height="675" class="img_ev3q"></p><p><strong>Hello everyone, and welcome to a new dev blog series: individual spotlight! In this series, we're going to sit down with different DFINITY team members across different roles and teams to learn more about the specific projects they're working on. This series is similar to our previous team spotlight series, but with a more narrow focus.</strong></p><p><strong>To kick off this series, we sat down with Linwei, a software engineer from the SDK team. The SDK team has a fundamental role at DFINITY, as they create tooling such as <code>dfx</code> that developers use on a regular basis.</strong></p><p><strong>To give developers a better insight into what the SDK team does, what tools, projects, or features does the team have ownership of?</strong></p><p><em>The name of our team, SDK, encapsulates our core mission: providing the essential software development kits (SDKs) that enable seamless development on the Internet Computer.</em></p><p><em>The core of the SDK is the dfx CLI tool. We also maintain some libraries that fall into two categories:</em></p><ul><li><em>Agent: For interacting with the IC from outside using HTTPS messages.</em></li></ul><p>&nbsp; &nbsp; - <a href="https://docs.rs/ic-agent/latest/ic_agent/" target="_blank" rel="noopener noreferrer">ICP Rust agent</a> and <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a></p><ul><li><em>CDK: For building canisters that invoke the system API and make inter-canister calls.</em></li></ul><p>&nbsp; &nbsp; - <em>Rust CDK</em></p><p><strong>What roadmap items from your team are you most excited about?</strong></p><p><em>There are several upcoming features that will make the canister development experience more close to traditional (Web2):</em></p><ul><li><p><em>Canister logging: Developers can read logs produced by their canisters even when they trap.</em></p></li><li><p><em>Canister backup and restore: Developers will be able to achieve data sovereignty on the ICP.</em></p></li><li><p><em>Canister lifecycle hooks: Developers will get notification when their canisters trap, out of cycles, or other lifecycle events happen.</em></p></li></ul><p><strong>Those features are long-awaited from the ICP dev community, so I agree that those are pretty exciting to see on the roadmap! What about roadmap items from another team? Are there any of those that excite you personally?</strong></p><p>*Decentralized AI. I’m looking forward to seeing how two advanced technologies, AI and blockchain, can work together.**</p><p><strong>That's a good one. I think there are a lot of eyes on DeAI right now, especially from our <a href="https://forum.dfinity.org/t/technical-working-group-deai/24621/6" target="_blank" rel="noopener noreferrer">AI working group</a>.</strong></p><p><strong>Let's talk about your personal contributions to the SDK team. What is a recent project that you were the primary contributor to?</strong></p><p><em>I recently completed the exploration <!-- -->[of]<!-- --> Wasm64 <!-- -->[for the]<!-- --> Rust CDK.</em></p><p><strong>What was the goal or focus of that exploration?</strong></p><p><em>We are going to enable Wasm64 on <!-- -->[the]<!-- --> IC Wasm runtime. I was in charge of verifying if the proposed new system API can be easily consumed by CDKs like <!-- -->[the]<!-- --> Rust CDK.</em></p><p><strong>What was the motivation behind exploring this capability?</strong></p><p><em>[It will]<!-- --> enable developers to use more than 4 GiB of main memory for more complicated applications.</em></p><p><strong>What were some of the findings from this exploration?</strong></p><p><em>To support both Wasm32 and Wasm64, there is some inevitable complexity either on the system (replica) side or on the CDK side. My exploration <!-- -->[of the]<!-- --> Rust CDK provided a case of handling the complexity on the CDK side. That helped the teams reach a consensus that the complexity should be handled on the system side.</em></p><p><strong>Was there any developer or internal feedback that was used for this exploration?</strong></p><p><em>The wasm64 feature is a cross-team effort. I, representing Rust CDK, provided my exploration result as internal feedback, which made the runtime team revise the design of the system API.</em></p><p><strong>What other projects are you currently working on?</strong></p><p><em>Trait-bound canister development. Rust canister devs will be able to generate a trait from the "service" in a Candid file. As long as the devs implement all <!-- -->[of]<!-- --> the required methods of the trait for some struct, the canister will fulfill its Candid interface.</em></p><p><strong>That sounds like a very useful feature for Rust developers! What was the primary motivation for this project?</strong></p><p><em>The existing Rust canister DX is not systematic and type-safe. Developers who take their canisters seriously prefer the interface-first approach. Many internal developers in charge of system canisters are willing to adopt the new development style. We expect many community developers will also love it.</em></p><p><strong>As a software engineer, what advice would you give a new developer getting started on ICP?</strong></p><p><em>The <a href="https://docs.internetcomputer.org/" target="_blank" rel="noopener noreferrer">developer docs</a> are a good knowledge base for new developers. It’s better to get a basic understanding of the key concepts. Some of these concepts are unique to ICP and are not found in other projects.</em></p><p><strong>Are there any community projects or tools that you’ve been using recently?</strong></p><p><em>Mops is a package manager for Motoko that is developed by community developers. We have been using it for some Motoko-related tests <!-- -->[for]<!-- --> <code>dfx</code>.</em></p><p><strong>One last question: What’s your favorite thing about ICP?</strong></p><p><em>ICP is continuously advancing the boundaries of what blockchain technology can achieve.</em></p><p><strong>Thank you, Linwei, for chatting with us today, and be sure to stay tuned for the next installment of the individual spotlight series!</strong></p>]]></content>
        <category label="Individual spotlight" term="Individual spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 29, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/29/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/29/news-and-updates/update"/>
        <updated>2024-05-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we're excited to announce the official release of the EVM RPC canister, ICP's plans for Consensus 2024 this week in Austin, TX, and share some docs updates.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 29 2024" src="/assets/images/dev-update-blog-may-29-7729cfa33acea167e59924fcc13e0a1b.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we're excited to announce the official release of the EVM RPC canister, ICP's plans for Consensus 2024 this week in Austin, TX, and share some docs updates. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="evm-rpc-canister-official-release">EVM RPC Canister official release<a href="#evm-rpc-canister-official-release" class="hash-link" aria-label="Direct link to EVM RPC Canister official release" title="Direct link to EVM RPC Canister official release">​</a></h2><p>The EVM RPC Canister has officially been released! The EVM RPC Canister provides an onchain API that is used to communicate with smart contracts on Ethereum and other EVM-compatible networks directly from ICP without using an intermediary oracle or bridge. The canister uses JSON-RPC calls to communicate with Ethereum and other EVM networks, managing and rotating the JSON-RPC API keys on the backend, making the interaction for ICP devs seamless and straightforward. All ICP devs need to do is attach cycles to their call, and the EVM RPC Canister takes care of the rest.</p><p>For the past few months, the feature has been in beta testing and we've collected lots of great feedback from developers and other community members regarding the canister's functionality, usability, and its associated documentation. The DFINITY engineering teams have been hard at work to polish the feature for release, which included handing over the canister to the NNS. Moving forward, all updates and changes to the canister must go through the NNS proposal and voting process.</p><p>You can read the full release announcement on the <a href="https://medium.com/dfinity/icp-ethereum-how-icps-evm-rpc-canister-connects-the-networks-b57909efecf6" target="_blank" rel="noopener noreferrer">DFINITY Medium blog</a>, or you can check out the developer documentation to get started using the EVM RPC Canister today:</p><ul><li><p><a href="/building-apps/chain-fusion/ethereum/evm-rpc/overview">Overview</a>: Learn what the EVM RPC canister is and what purpose it serves for ETH development on ICP.</p></li><li><p><a href="/building-apps/chain-fusion/ethereum/evm-rpc/how-it-works">How it works</a>: Learn how the EVM RPC canister works.</p></li><li><p><a href="/building-apps/chain-fusion/ethereum/evm-rpc/costs">Costs</a>: View cost information associated with using the EVM RPC canister.</p></li><li><p><a href="/building-apps/chain-fusion/ethereum/evm-rpc/evm-rpc-canister">Sample projects</a>: Get inspired by viewing some projects using the EVM RPC canister.</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp--consensus-2024">ICP @ Consensus 2024<a href="#icp--consensus-2024" class="hash-link" aria-label="Direct link to ICP @ Consensus 2024" title="Direct link to ICP @ Consensus 2024">​</a></h2><p>Attending Consensus 2024 this week in Austin, TX? Look out for the DFINITY team! A few team members will be at the conference, attending the hackathon, and attending side events with our partners and community members, such as ICP.Hubs North America and Mexico!</p><p>Want to learn more or connect with the team going? Let us know on <a href="https://forum.dfinity.org/t/icp-at-consensus-2024/31135" target="_blank" rel="noopener noreferrer">the ICP dev forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-documentation">New documentation<a href="#new-documentation" class="hash-link" aria-label="Direct link to New documentation" title="Direct link to New documentation">​</a></h2><p>Over the past few weeks, several new documentation pages have been released! Among these new docs are several pages on developer tooling and Chain Fusion workflows:</p><ul><li><p><a href="https://github.com/dfinity/idl2json" target="_blank" rel="noopener noreferrer">idl2json</a></p></li><li><p><a href="https://github.com/dfinity/ic-js?tab=readme-ov-file" target="_blank" rel="noopener noreferrer">ic-js</a></p></li><li><p><a href="/defi/overview">Hardware wallet CLI tool</a></p></li><li><p><a href="/defi/token-integrations/">Token integration</a></p></li><li><p><a href="/building-apps/chain-fusion/ethereum/using-eth/eth-dev-workflow">Ethereum dev workflow</a></p></li><li><p><a href="/build-on-btc/btc-dev-workflow">Bitcoin dev workflow</a></p></li></ul><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 22, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/22/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/22/news-and-updates/update"/>
        <updated>2024-05-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we talk about ICP's third anniversary celebration, several new documentation pages on using the Rosetta 2.0 implementation, and we check out the latest Developer Liftoff video.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 22 2024" src="/assets/images/dev-update-blog-may-22-8fda0e9d12b3e97461c50b320ffe23bd.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we talk about ICP's third anniversary celebration, ckUSDC's mainnet launch, several new documentation pages on using the Rosetta 2.0 implementation, and we check out the latest Developer Liftoff video. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icps-third-anniversary-celebration-beyond-the-blockchain">ICP's third anniversary celebration: Beyond the blockchain<a href="#icps-third-anniversary-celebration-beyond-the-blockchain" class="hash-link" aria-label="Direct link to ICP's third anniversary celebration: Beyond the blockchain" title="Direct link to ICP's third anniversary celebration: Beyond the blockchain">​</a></h2><p>To celebrate ICP's third anniversary, DFINITY has organized an all-day event jam packed with keynotes, panels, and demos focusing on cryptography, multichain, AI, identity, and DAOs. The celebration includes contributions from several team members, ICP.Hubs, partners, builders, and enthusiasts.</p><p>Want to learn more about how ICP has been running for the past 3 years? Check out <a href="https://twitter.com/dominic_w/status/1793391153326285102" target="_blank" rel="noopener noreferrer">this video</a> from Dominic Williams, founder and chief scientist.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ckusdc-is-now-live-on-the-mainnet">ckUSDC is now live on the mainnet!<a href="#ckusdc-is-now-live-on-the-mainnet" class="hash-link" aria-label="Direct link to ckUSDC is now live on the mainnet!" title="Direct link to ckUSDC is now live on the mainnet!">​</a></h2><p>The ckUSDC token has been launched on the ICP mainnet! Developers can now integrate and support the token by using the following ledger and index canisters:</p><ul><li><p>Ledger canister ID: <code>xevnm-gaaaa-aaaar-qafnq-cai</code></p></li><li><p>Ledger installed Wasm hash: <code>4ca82938d223c77909dcf594a49ea72c07fd513726cfa7a367dd0be0d6abc679</code></p></li><li><p>Index canister ID: <code>xrs4b-hiaaa-aaaar-qafoa-cai</code></p></li><li><p>Index installed Wasm hash: <code>55dd5ea22b65adf877cea893765561ae290b52e7fdfdc043b5c18ffbaaa78f33</code></p></li></ul><p>You can view the transaction history and metadata for ckUSDC on the <a href="https://sv3dd-oaaaa-aaaar-qacoa-cai.raw.icp0.io/dashboard" target="_blank" rel="noopener noreferrer">ckUSDC dashboard</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="rosetta-20-documentation">Rosetta 2.0 documentation<a href="#rosetta-20-documentation" class="hash-link" aria-label="Direct link to Rosetta 2.0 documentation" title="Direct link to Rosetta 2.0 documentation">​</a></h2><p>The developer docs recently released new and improved documentation on the ICP Rosetta 2.0 implementation, which features APIs for ICP and ICRC tokens and supports workflows for retrieving data.</p><p>The new <a href="/defi/rosetta/icp_rosetta">ICP Rosetta implementation</a> offers two APIs: the Data API and the Construction API for interacting with ICP tokens.</p><p>The ICP <a href="/defi/rosetta/icp_rosetta/data_api">Rosetta Data API</a> can be used to:</p><ul><li><p>Fetch network-specific info and NNS proposal info.</p></li><li><p>Query the balance of an account or neuron.</p></li><li><p>Return blocks and transactions from the ICP ledger.</p></li><li><p>List of all publicly known neurons.</p></li></ul><p>The <a href="/defi/rosetta/icp_rosetta/construction_api">ICP Rosetta Construction API</a> can be used to:</p><ul><li><p>Transfer ICP.</p></li><li><p>Stake ICP and manage neurons.</p></li><li><p>Configure voting and following for your neurons.</p></li></ul><p>The <a href="/defi/rosetta/icrc_rosetta">ICRC Rosetta implementation</a> also offers similar APIs for interacting with ICRC tokens instead of ICP tokens. The APIs have the same names, Data and Construction, but have different endpoints and capabilities.</p><p>Currently, the ICRC Rosetta Construction API supports one category of transactions, which is the transfer of assets. According to the ICRC-1 and ICRC-2 standards, this can be done using direct transfers, in accordance with the ICRC-1 standard and approving spenders, which uses the ICRC-2 standard to approve a spender to spend your tokens for you.</p><p>Check out the ICP <a href="/defi/rosetta/icp_rosetta">developer docs</a> for more info!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-34-introduction-to-agents">Developer Liftoff 3.4: Introduction to agents<a href="#developer-liftoff-34-introduction-to-agents" class="hash-link" aria-label="Direct link to Developer Liftoff 3.4: Introduction to agents" title="Direct link to Developer Liftoff 3.4: Introduction to agents">​</a></h2><p>In the latest episode of the ICP Developer Liftoff series, developers learn about what an agent is and how it can be used within their project. This video covers:</p><ul><li><p>What an agent is.</p></li><li><p>What tasks does an agent do, such as structuring data, decoding data, and managing authentication.</p></li><li><p>Currently available agents, both developed by DFINITY and community-contributed agents.</p></li><li><p>How to use the JavaScript agent to create a simple random maze application.</p></li></ul><p>Check out the <a href="https://www.youtube.com/watch?v=8Z_w_JQkxfk" target="_blank" rel="noopener noreferrer">video tutorial on Youtube</a> or follow the written tutorial on the <a href="/tutorials/developer-liftoff/level-3/3.4-intro-to-agents">developer docs</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 15, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/15/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/15/news-and-updates/update"/>
        <updated>2024-05-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, there is an important community PSA regarding an upcoming Wasm memory change, an NNS update, and a community project to showcase.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 15 2024" src="/assets/images/dev-update-blog-may-15-b27c64379c0fa623688e0074d13beec3.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, there is an important community PSA regarding an upcoming Wasm memory change, an NNS update, and a community project to showcase. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="psa-upcoming-wasm-memory-change">PSA: Upcoming Wasm memory change<a href="#psa-upcoming-wasm-memory-change" class="hash-link" aria-label="Direct link to PSA: Upcoming Wasm memory change" title="Direct link to PSA: Upcoming Wasm memory change">​</a></h2><p>Attention developers! In the next few weeks, there will be a proposed change regarding Wasm memory limits. This proposed change would reduce the Wasm memory available to a canister from 4GiB to 3GiB through a new field <code>wasm_memory_limit</code>, which will be set to 3GiB by default.</p><p>Developers will be able to opt out of this restriction by setting <code>wasm_memory_limit=4GiB</code> your in canister settings using <code>dfx</code> version<code> 0.20.1-beta.0</code> or higher. Opting out of this restriction is risky, and requires you to program your canister very carefully.</p><p>The reason for this change is to protect canisters from unrecoverable memory errors. Wasm memory uses a 32-bit architecture and cannot grow beyond 4Gib. When a canister stores user data in Wasm memory rather than stable memory, the memory usage grows with each new user. Canisters using this design could reach that limit of 4GiB, where they would be unable to allocate additional memory, and thus stop working. If this happens to a canister, both the canister and its data are unrecoverable. Even if user data isn't stored in Wasm memory, memory usage can be filled other ways, such as through memory leak.</p><p>The new 3GiB restriction is a soft limit, meaning when a canister exceeds this amount, messages will begin to fall. The developer will be alerted to a potential memory problem and have time to upgrade the canister appropriately.</p><p>You can read more about this upcoming change on <a href="https://forum.dfinity.org/t/psa-upcoming-wasm-memory-limit-may-break-your-canisters/30766" target="_blank" rel="noopener noreferrer">the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-update-may-15-2024">NNS update May 15, 2024<a href="#nns-update-may-15-2024" class="hash-link" aria-label="Direct link to NNS update May 15, 2024" title="Direct link to NNS update May 15, 2024">​</a></h2><p>An important NNS hotfix has been applied on May 15, 2024. This hotfix addressed a security bug in the cycles minting canister (CMC). This vulnerability could be exploited in a scenario such as:</p><p>An attacker A sends some ICP to the CMC. The destination subaccount corresponds to controller principal (P), who is authorized to create canisters on restricted subnet (S). Another canister (A), who is not authorized to create canisters on subnet (S), could call the method <code>CMC.notify_create_canister</code> and pass (P) via the <code>NotifyCreateCanister.controller</code> field. The result would be that the CMC creates a canister on subnet (S), though the CMC should not allow this, because (P) is the one who is authorized. Furthermore, A could specify an arbitrary controller for the new canister by using the <code>NotifyCreateCanister.settings</code> field, such that they could make themselves the sole controller of the new canister.</p><p>Additional exploitation scenarios can be found on the <a href="https://forum.dfinity.org/t/nns-update-2024-05-15-cycles-minting-canister-hotfix-proposal-129728/30807" target="_blank" rel="noopener noreferrer">forum</a>, which details the source of this vulnerability and how it was resolved.</p><p><a href="https://dashboard.internetcomputer.org/proposal/129728" target="_blank" rel="noopener noreferrer">Proposal 129728</a> was made and executed to apply the hotfix.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-showcase-circuitz">Community showcase: Circuitz<a href="#community-showcase-circuitz" class="hash-link" aria-label="Direct link to Community showcase: Circuitz" title="Direct link to Community showcase: Circuitz">​</a></h2><p>Circuitz is an Integration Platform as a Service (IPaaS) platform for the IC ecosystem. It is designed to simplify the process of integrating with different canisters, allowing for seamless data exchange. The goal of the project is to simplify data integration and management on ICP.</p><p>Key features of the platform are:</p><ul><li><p>Data mapping.</p></li><li><p>Node filtering.</p></li><li><p>Node lookup filtering.</p></li></ul><p>Circuitz is designed for users that want to streamline their workflows for building and managing ICP applications, or non-developer individuals, like business analysts, who want to interact with an interface to obtain data from different canisters.</p><p><a href="https://forum.dfinity.org/t/circuitz-ipaas-on-the-ic/30590" target="_blank" rel="noopener noreferrer">Learn more or ask questions about Circuitz on the developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 8, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/08/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/08/news-and-updates/update"/>
        <updated>2024-05-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have a new release of dfx, a new release of PocketIC, and a call for feedback from the development team behind Azle.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 8 2024" src="/assets/images/dev-update-blog-may-8-3636e013d194d65051040bcad3216a40.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have a new release of <code>dfx</code>, a new release of PocketIC, and a call for feedback from the development team behind Azle. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0200-has-been-released"><code>dfx v0.20.0</code> has been released!<a href="#dfx-v0200-has-been-released" class="hash-link" aria-label="Direct link to dfx-v0200-has-been-released" title="Direct link to dfx-v0200-has-been-released">​</a></h2><p>This week, a new version of <code>dfx</code>, v<code>0.20.0</code> has been released! You can download and install this latest version with the commands:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfxvm install 0.20.0</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfxvm default 0.20.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>This release comes with several new features and bug fixes, including:</p><ul><li><p>A fix for <code>CANISTER_CANDID_PATH_&lt;canister name&gt;</code> to be set properly for remote canister declarations.</p></li><li><p>A new way to display the JSON schema for <code>dfx</code> metadata through the command <code>dfx schema --for dfx-metadata</code>.</p></li><li><p><code>dfx</code> metadata has been extended with the object <code>tech_stack</code>.</p></li><li><p>The <code>dfx completion</code> command has been added, which generates shell completion scripts for bash, elvish, fish, zsh, or PowerShell.</p></li><li><p><code>dfx</code> will no longer create a <code>.dfx</code> directory if <code>dfx.json</code> is present.</p></li></ul><p>You can read the full <a href="https://github.com/dfinity/sdk/releases/tag/0.20.0" target="_blank" rel="noopener noreferrer">release notes</a>.</p><p>Run into a bug? Let us know on the <a href="https://forum.dfinity.org/t/dfx-0-20-0-is-promoted/30471" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pocketic-version-4-has-been-released">PocketIC version 4 has been released!<a href="#pocketic-version-4-has-been-released" class="hash-link" aria-label="Direct link to PocketIC version 4 has been released!" title="Direct link to PocketIC version 4 has been released!">​</a></h2><p>PocketIC v4 has been release, introducing new capability with agent-based tools through HTTPS compatibility. This release also enables you to browse frontend canisters while they are running on PocketIC and make concurrent update calls!</p><p>To use the HTTPS compatibility, you need to explicitly make an instance live by calling <code>make_live(...)</code> on it which does the following:</p><ul><li><p>Launches a thread that calls <code>tick()</code> and <code>advance_time(...)</code> on the instance several times per second.</p></li><li><p>Creates a gateway similar to icx-proxy which points to the live instance.</p></li><li><p>Returns a gateway URL which can then be passed to tools using HTTPS, such as agents.</p></li></ul><p>To use concurrent update calls, an <code>update_call</code> can be expressed with a new method such as:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">let message_id = pic.submit_call(..., payload)?;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">pic.await_call(message_id)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can read the full details of the release on <a href="https://forum.dfinity.org/t/pocketic-version-4-0-0-ic-http-interface-compatibility/30281" target="_blank" rel="noopener noreferrer">the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="call-for-feedback-azle">Call for feedback: Azle<a href="#call-for-feedback-azle" class="hash-link" aria-label="Direct link to Call for feedback: Azle" title="Direct link to Call for feedback: Azle">​</a></h2><p>Attention Azle developers! The Demergent Labs team has asked for your participation in a survey regarding which features the team should prioritize the development of.</p><p>Let the team know your thoughts! Complete <a href="https://t.co/hLWNHvWiZI" target="_blank" rel="noopener noreferrer">the survey today</a>!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-devconf">ICP DevConf<a href="#icp-devconf" class="hash-link" aria-label="Direct link to ICP DevConf" title="Direct link to ICP DevConf">​</a></h2><p>The online conference ICP DevConf has been announced! This conference will run from July 17-19 and is free to all participants worldwide! It will feature several online talk sessions and workshops on various ICP topics, such as:</p><ul><li><p>ICP fundamentals</p></li><li><p>Smart contracts</p></li><li><p>Chain Fusion</p></li><li><p>Decentralized AI</p></li><li><p>DeFI &amp; NFTs</p></li><li><p>DAOs</p></li><li><p>Tooling &amp; CDKs</p></li></ul><p>Register for your spot today at <a href="https://icpdevconf.com/" target="_blank" rel="noopener noreferrer">https://icpdevconf.com/</a>!</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update May 1, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/01/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/05/01/news-and-updates/update"/>
        <updated>2024-05-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have several new developer docs pages to share, a new blog post on extending HTTPS outcalls, and an update on the dfx dashboard GUI project.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="May 1 2024" src="/assets/images/dev-update-blog-may-1-9f93bced1ef39ef0957a8d4ddca0306c.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have several new developer docs pages to share, a new blog post on extending HTTPS outcalls, and an update on the <code>dfx</code> dashboard GUI project. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-documentation-pages">New documentation pages<a href="#new-documentation-pages" class="hash-link" aria-label="Direct link to New documentation pages" title="Direct link to New documentation pages">​</a></h2><p>Over the past few weeks, the Dev Docs have gotten several new pages, with a heavy focus on new and improved documentation for the EVM RPC canister. Here's a breakdown of what's new:</p><ul><li><p><a href="/building-apps/interact-with-canisters/candid/candid-tools">Candid tools</a>: Learn about how to use <code>didc</code>, Candid UI, and <code>ip-repl</code>.</p></li><li><p><a href="/building-apps/advanced/benchmarking">CanBench</a>: Learn how to benchmark your canister's memory and instruction usage using the <code>canbench</code> crate.</p></li><li><p>Want to take a deep dive into the ETH integration? Check out these new pages on the EVM RPC Canister:</p><ul><li><p><a href="/building-apps/chain-fusion/ethereum/evm-rpc/overview">Overview</a>: Learn what the EVM RPC canister is and what purpose it serves for ETH development on ICP.</p></li><li><p><a href="/building-apps/chain-fusion/ethereum/evm-rpc/how-it-works">How it works</a>: Learn how the EVM RPC canister works.</p></li><li><p><a href="/building-apps/chain-fusion/ethereum/evm-rpc/costs">Costs</a>: View cost information associated with using the EVM RPC canister.</p></li><li><p><a href="/building-apps/chain-fusion/ethereum/evm-rpc/evm-rpc-canister">Sample projects</a>: Get inspired by viewing some projects using the EVM RPC canister.</p></li></ul></li><li><p><a href="/building-apps/developer-tools/icp-ninja">Learn how to use GitHub codespaces to deploy canisters</a>.</p></li><li><p><a href="/building-apps/developer-tools/icp-ninja">Learn how to use developer containers</a>.</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="blog-post-extending-https-outcalls">Blog post: Extending HTTPS outcalls<a href="#blog-post-extending-https-outcalls" class="hash-link" aria-label="Direct link to Blog post: Extending HTTPS outcalls" title="Direct link to Blog post: Extending HTTPS outcalls">​</a></h2><p>A new blog post written by Roman Kashitsyn has been published that details how HTTPS outcalls can be extended to match current industry standard solutions such as oracles. To summarize, in the blog post Roman proposes that a canister should be able to inspect and aggregate responses from all nodes.</p><p>The blog post features a great explanation of how HTTPS outcalls currently work (with nice diagrams!) and how their functionality could be extended to enable further workflows and use cases.</p><p><a href="https://mmapped.blog/posts/27-extending-https-outcalls" target="_blank" rel="noopener noreferrer">Check out the full blog post</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-dashboard-gui-v2"><code>dfx</code> dashboard GUI v2<a href="#dfx-dashboard-gui-v2" class="hash-link" aria-label="Direct link to dfx-dashboard-gui-v2" title="Direct link to dfx-dashboard-gui-v2">​</a></h2><p>A community team is currently working on a bounty project to create a dashboard GUI for <code>dfx</code> through a native desktop application. This dashboard offers several key features including:</p><ul><li><p>Identity management: Manage identities through creating, importing, and deleting developer identities in the GUI.</p></li><li><p>Canister interaction: Interact with canisters through creating, deleting, calling, and managing them.</p></li><li><p>Project management: Create new projects or import existing ones into the GUI application.</p></li><li><p>Network management: Manage the <code>networks.json</code> file to fit specific needs of your project.</p></li></ul><p>The team is looking for feedback and suggestions! Let them know what other features you're looking for by participating in the <a href="https://forum.dfinity.org/t/dfx-dashboard-gui-v2-new-features/29975" target="_blank" rel="noopener noreferrer">forum post discussion</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 24, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/04/24/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/04/24/news-and-updates/update"/>
        <updated>2024-04-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we're excited to announce that ckUSDC is live on the Sepolia testnet, showcase a community project called Personal DAO, and discuss a post mortem network issue that occurred March 27, 2024.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="April 24 2024" src="/assets/images/dev-update-blog-april-24-64faa1b3703c348a6e9828ffb2be68f7.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we're excited to announce that ckUSDC is live on the Sepolia testnet, showcase a community project called Personal DAO, and discuss a post mortem network issue that occurred March 27, 2024. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ckusdc-live-on-sepolia-testnet">ckUSDC live on Sepolia testnet!<a href="#ckusdc-live-on-sepolia-testnet" class="hash-link" aria-label="Direct link to ckUSDC live on Sepolia testnet!" title="Direct link to ckUSDC live on Sepolia testnet!">​</a></h2><p>ckUSDC is a digital twin of the USDC stable coin. Similar to ckBTC and ckETH, ckUSDC uses chain-key cryptography to create a token deployed on ICP that is backed 1:1 with USDC.</p><p>We're excited to announce that you can now mint and test ckUSDC on the Sepolia testnet! Simply follow these steps:</p><ol><li>First, obtain Sepolia ETH from a <a href="https://sepoliafaucet.com/" target="_blank" rel="noopener noreferrer">faucet</a>, then obtain Sepolia USDC from another <a href="https://faucet.circle.com/" target="_blank" rel="noopener noreferrer">faucet</a>.</li></ol><p>Remember, these are test tokens that are not redeemable for real currencies.</p><ol start="2"><li><p>Then, use the ckSepoliaETH minter canister (<code>jzenf-aiaaa-aaaar-qaa7q-cai</code>) to mint ckSepoliaETH. You need ckSepoliaETH before you can deposit Sepolia USDC and mint ckUSDC.</p></li><li><p>Lastly, use the ckSepoliaETH minter canister again to convert ckSepoliaETH into ckUSDC. You can use the <code>get_minter_info</code> method on the <a href="https://dashboard.internetcomputer.org/canister/jzenf-aiaaa-aaaar-qaa7q-cai" target="_blank" rel="noopener noreferrer">minter canister dashboard</a> to retrieve all supported ckERC20 tokens.</p></li></ol><p>You can find the full instructions <a href="https://github.com/dfinity/ic/blob/master/rs/ethereum/cketh/README.adoc" target="_blank" rel="noopener noreferrer">in the ckETH GitHub</a>.</p><p>Find a bug or have any questions? <a href="https://forum.dfinity.org/t/cketh-a-canister-issued-ether-twin-token-on-the-ic/22819/155" target="_blank" rel="noopener noreferrer">Participate in the discussion on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="post-mortem-subnets-cv73p-and-4ecnw-failed-upgrade-process-on-march-27-2024">Post mortem: subnets cv73p and 4ecnw failed upgrade process on March 27, 2024<a href="#post-mortem-subnets-cv73p-and-4ecnw-failed-upgrade-process-on-march-27-2024" class="hash-link" aria-label="Direct link to Post mortem: subnets cv73p and 4ecnw failed upgrade process on March 27, 2024" title="Direct link to Post mortem: subnets cv73p and 4ecnw failed upgrade process on March 27, 2024">​</a></h2><p>On March 27, 2024, a critical incident ocurred regarding the upgrade of two subnets, cv73p and 4ecnw. These subnets failed to upgrade, resulting in an interruption of services for several user applications. The post mortem report details the cause for this outage, a timeline of events, the actions taken to resolve it, and the technical details of how the incident was resolved.</p><p>In summary, the upgrade failed due to changes in error code mappings in the recently deployed replica versions. Certain error codes were used in the previous replica version that were replaced with new error codes. The system tried to resume operations after the upgrade, but it did not recognize the error codes that had been replaced. This resulted in a failure to restart the affected subnets.</p><p>The team rolled back the affected subnets to their previous stable versions and recovered the subnets successfully. Subnets were recovered within about an hour and a half.</p><p>This post mortem report can be found <a href="https://forum.dfinity.org/t/post-mortem-subnets-cv73p-and-4ecnw-failed-upgrade-process-on-march-27-2024/29841" target="_blank" rel="noopener noreferrer">on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="community-project-personal-dao">Community project: Personal DAO<a href="#community-project-personal-dao" class="hash-link" aria-label="Direct link to Community project: Personal DAO" title="Direct link to Community project: Personal DAO">​</a></h2><p>Personal DAO is a new community project that enables users to create their own DAO deployed on ICP that comes with a user interface, URL, API, database, and treasury. These DAOs are tokenized and can be purchased and sold via an NFT marketplace. These personal DAOs can create DAO-controlled neurons, and members of the personal DAO can submit proposals to stake new neurons or stake ICP into the DAO's existing neurons.</p><p>You can learn more about Personal DAO, including information about the project's architecture and go to market strategy on <a href="https://forum.dfinity.org/t/personal-dao-a-commoditized-dao-that-functions-as-a-icp-neuron-pool-for-now-more-features-on-the-way/29958" target="_blank" rel="noopener noreferrer">the developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 17, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/04/17/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/04/17/news-and-updates/update"/>
        <updated>2024-04-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have a new dfx release, new ICRC standards that are ready for the NNS to vote on, and information about Bitcoin halving week.]]></summary>
        <content type="html"><![CDATA[<p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have a new <code>dfx</code> release, new ICRC standards that are ready for the NNS to vote on, and information about Bitcoin halving week. Let's get started!</p><p><img loading="lazy" alt="April 17 2024" src="/assets/images/dev-update-blog-april-17-ccc61948f140812c0b830c5fa87b3e3e.jpg" width="1400" height="675" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0200-release"><code>dfx v0.20.0</code> release<a href="#dfx-v0200-release" class="hash-link" aria-label="Direct link to dfx-v0200-release" title="Direct link to dfx-v0200-release">​</a></h2><p>The latest version of <code>dfx</code>, v0.20.0, is ready for beta testing and will be released next week. This new release includes:</p><ul><li><p>New features such as:</p><ul><li><p>A new command <code>dfx schema --for dfx-metadata</code> that displays the JSON schema of the <code>dfx</code> metadata.</p></li><li><p>The <code>dfx</code> metadata has been extended with the <a href="https://github.com/dfinity/sdk/blob/0.20.0-beta.0/docs/concepts/tech-stack.md" target="_blank" rel="noopener noreferrer"><code>tech_stack</code></a> object.</p></li><li><p>The <code>dfx completion</code> command has been added, which generates shell completion scripts for bash, elvish, fish, zsh, or PowerShell.</p></li></ul></li><li><p>Bug fixes such as:</p><ul><li><p><code>CANISTER_CANDID_PATH_&lt;canister name&gt;</code> is now set properly for remote canisters.</p></li><li><p><code>dfx</code> no longer always creates the <code>.dfx</code> directory if <code>dfx.json</code> is present.</p></li><li><p><code>dfx</code> only loads <code>dfx.json</code> for commands that need it.</p></li></ul></li></ul><p>You can <a href="https://github.com/dfinity/sdk/releases/tag/0.20.0-beta.0" target="_blank" rel="noopener noreferrer">read the full release notes</a> or provide feedback on this release <a href="https://forum.dfinity.org/t/dfx-0-20-0-release/29769" target="_blank" rel="noopener noreferrer">on the developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nft-standards-icrc-7-and-icrc-37-ready-for-nns-vote">NFT standards ICRC-7 and ICRC-37 ready for NNS vote<a href="#nft-standards-icrc-7-and-icrc-37-ready-for-nns-vote" class="hash-link" aria-label="Direct link to NFT standards ICRC-7 and ICRC-37 ready for NNS vote" title="Direct link to NFT standards ICRC-7 and ICRC-37 ready for NNS vote">​</a></h2><p>Two new ICRC standards are ready for their NNS vote! These standards, ICRC-7 and ICRC-37, are standards for NFTs on ICP.</p><p><a href="https://github.com/dfinity/ICRC/blob/icrc_7_and_37/ICRCs/ICRC-7/ICRC-7.md" target="_blank" rel="noopener noreferrer">ICRC-7</a> is the base standard for NFTs, while <a href="https://github.com/dfinity/ICRC/blob/icrc_7_and_37/ICRCs/ICRC-37/ICRC-37.md" target="_blank" rel="noopener noreferrer">ICRC-37</a> is an extension of ICRC-7 that defines an approve / transfer_from functionality for NFTs.</p><p>You can learn more about these standards on the <a href="https://forum.dfinity.org/t/nft-standards-icrc-7-and-icrc-37-ready-for-nns-vote/29618" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bitcoin-halving-week">Bitcoin Halving week<a href="#bitcoin-halving-week" class="hash-link" aria-label="Direct link to Bitcoin Halving week" title="Direct link to Bitcoin Halving week">​</a></h2><p>Bitcoin Halving is approaching this week on April 19th! To celebrate, the ICP social media accounts are sharing all things Bitcoin and ckBTC, including podcasts, interviews, and community projects. We encourage the ICP community to share their open-source projects using ckBTC or the ICP Bitcoin integration. You can share links to your project on the <a href="https://forum.dfinity.org/t/bitcoin-halving-week-share-your-project-updates-on-ckbtc-bitcoin-integration/29717" target="_blank" rel="noopener noreferrer">developer forum</a> and our team will review and amplify them across social media channels if possible, or enter the <a href="https://forum.dfinity.org/t/bnt-16-ckbtc-landing-page-design/29577" target="_blank" rel="noopener noreferrer">ckBTC design bounty</a> due on April 20, 2024.</p><p>Be sure to check out the <a href="https://twitter.com/dfinity?lang=en" target="_blank" rel="noopener noreferrer">DFINITY X</a> and <a href="https://twitter.com/DFINITYDev" target="_blank" rel="noopener noreferrer">DFINITYDev X</a> accounts to view all the Bitcoin-related content this week!</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 10, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/04/10/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/04/10/news-and-updates/update"/>
        <updated>2024-04-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have important info regarding an SNS bug, plus two new and exciting community projects.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="April 10 2024" src="/assets/images/dev-update-blog-april-10-ad67f5e29dac8e0a2eb0720ff34237c1.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have important info regarding an SNS bug, plus two new and exciting community projects. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sns-bug-regarding-treasury-transfer-proposals">SNS bug regarding Treasury Transfer proposals<a href="#sns-bug-regarding-treasury-transfer-proposals" class="hash-link" aria-label="Direct link to SNS bug regarding Treasury Transfer proposals" title="Direct link to SNS bug regarding Treasury Transfer proposals">​</a></h2><p>A bug has been discovered in the SNS governance that affects certain SNS swap versions, preventing them from creating Treasury Transfer proposals. If the three following criteria apply to you, you have been affected:</p><ul><li><p>You created an SNS before or during summer 2023.</p></li><li><p>You want to send SNS tokens from the SNS treasury using the TransferSnsTreasuryFunds proposals.</p></li><li><p>You upgraded your SNS governance to commit c70bc26, which was published to the sns-wasms canister in <a href="https://dashboard.internetcomputer.org/proposal/128811" target="_blank" rel="noopener noreferrer">proposal 12881</a> on 2024-03-26.</p></li></ul><p>A fix is currently in progress, and will be released as soon as possible. You can stay up to date with this bug fix <a href="https://forum.dfinity.org/t/sns-bug-discovered-recently-upgraded-snses-with-certain-versions-of-swap-cannot-create-treasury-transfer-proposals/29554" target="_blank" rel="noopener noreferrer">on the developer forum</a>. </p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icpsig">ICPsig<a href="#icpsig" class="hash-link" aria-label="Direct link to ICPsig" title="Direct link to ICPsig">​</a></h2><p>ICPsig is a new community project that allows users to create and manage multisig accounts on ICP. The project uses a backend canister that implements multisig logic and a frontend canister for users to interact with multisig accounts.</p><p>Each multisig account created by the backend canister is essentially a subaccount under the backend canister's principal. Users can create subaccounts by providing a list of principals that are allowed to sign transactions from the subaccount, or a subaccount can be created with a single principal with the ability to add more principals later.</p><p>Signatories can create transactions through the command line or ICPsig frontend app. ICPsig supports the ICP token ledger and the ICRC-1 standard.</p><p>Learn more about ICPsig on the <a href="https://forum.dfinity.org/t/icpsig-multisig-canister-for-icp/27917" target="_blank" rel="noopener noreferrer">developer forum</a> or <a href="https://github.com/ICPsig/icpsig" target="_blank" rel="noopener noreferrer">view the code on GitHub</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="surveyease">SurveyEase<a href="#surveyease" class="hash-link" aria-label="Direct link to SurveyEase" title="Direct link to SurveyEase">​</a></h2><p>Another new community project to showcase this week is SurveyEase, an IC-based survey tool for creating, distributing, and analyzing questionnaires. SurveyEase provides a user-friendly survey interface that features flexible question types, survey customization settings, multilingual support, pre-built templates, offline functionality, and more.</p><p>SurveyEase is built entirely on ICP to utilize enhanced security and scalability. The backend of SurveyEase is written in Motoko, while the frontend application uses the Flutter framework.</p><p>This project also features a dynamic survey tool called the Wizard Flow Engine. This engine orchestrates the user experience based on a JSON payload which defines the sequence of screens, data collected on each screen, and the storage location of that data. This design helps to provide an efficient management and transfer of user data. </p><p>Learn more about SurveyEase on the <a href="https://forum.dfinity.org/t/surveyease-a-secure-and-customizable-survey-tool-built-on-the-internet-computer/29419" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 3, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/04/03/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/04/03/news-and-updates/update"/>
        <updated>2024-04-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have a new technical working group announcement, an exciting community project, and details about an upcoming hackathon.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="April 3 2024" src="/assets/images/dev-update-blog-april-3-4f183685fae516e77d0a03f8f27f7e7a.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have a new technical working group announcement, an exciting community project, and details about an upcoming hackathon. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="inter-canister-event-utility-working-group">Inter-canister event utility working group<a href="#inter-canister-event-utility-working-group" class="hash-link" aria-label="Direct link to Inter-canister event utility working group" title="Direct link to Inter-canister event utility working group">​</a></h2><p>A new technical working group has been announced! This working group, titled 'Inter-canister event utility group', has been created by a number of grant recipients who are working on various different applications involving inter-canister calls, primarily using the publish / subscribe workflow. This working group will focus on event systems, addressing challenges such as scaling events, figuring out methods in which they can pay for themselves, and how to transmit events across subnets.</p><p>The first goal of the working group will be to agree on a set of ICRC standards pertaining to the publish / subscribe event model, then create a series of libraries that adhere to these standards.</p><p>Learn more about the working group, including how to participate, on the <a href="https://forum.dfinity.org/t/technical-working-group-inter-canister-event-utility-working-group/29048" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sign-in-with-solana">Sign-in with Solana<a href="#sign-in-with-solana" class="hash-link" aria-label="Direct link to Sign-in with Solana" title="Direct link to Sign-in with Solana">​</a></h2><p>An exciting community project has been shared on the forum! This project, titled IC-SIWS, is designed to provide a way for Solana wallets to be used to authenticate on ICP. Here's a quick breakdown of how to use it:</p><p>Edit your project's <code>dfx.json</code> file to include the IC-SIWS canister:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"canisters"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"ic_siws_provider"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"custom"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"candid"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"https://github.com/kristoferlund/ic-siws/releases/download/v0.0.1/ic_siws_provider.did"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"wasm"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"https://github.com/kristoferlund/ic-siws/releases/download/v0.0.1/ic_siws_provider.wasm.gz"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>This canister validates the authentication payload as an identity provider and generates a delegated identity for the user. This works in the same way that Internet Identity does.</p><p>Then, configure your canister with the following project settings during deployment:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx deploy ic_siws_provider --argument "( \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    record { \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        domain = \"127.0.0.1\"; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        uri = \"http://127.0.0.1:5173\"; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        salt = \"salt\"; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        chain_id = opt \"mainnet\"; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        scheme = opt \"http\"; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        statement = opt \"Login to the app\"; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        sign_in_expires_in = opt 300000000000; /* 5 minutes */ \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        session_expires_in = opt 604800000000000; /* 1 week */ \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        targets = opt vec { \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            \"$$(dfx canister id ic_siws_provider)\"; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            \"$$(dfx canister id backend)\"; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        }; \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    } \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">)"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Lastly, you can connect a React-based frontend to interact with the provider canister to generate identities:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">import { useSiwsIdentity } from "ic-use-siws-identity";</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">function LoginButton() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  const { login, clear, identity, ... } = useSiwsIdentity();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  // ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Check out a <a href="https://guidq-3qaaa-aaaal-qiteq-cai.icp0.io/" target="_blank" rel="noopener noreferrer">live demo</a>, and share your thoughts or feedback on the <a href="https://forum.dfinity.org/t/announcing-ic-siws-use-solana-wallets-to-login-to-icp/29261" target="_blank" rel="noopener noreferrer">developer forum</a>!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="oxford-university-icp-hackathon">Oxford University ICP hackathon<a href="#oxford-university-icp-hackathon" class="hash-link" aria-label="Direct link to Oxford University ICP hackathon" title="Direct link to Oxford University ICP hackathon">​</a></h2><p>An online and in-person hackathon hosted at Oxford University will begin on April 9th and run through April 11! There are two tracks that developers can participate in:</p><ul><li><p>Track 1: Artificial intelligence</p></li><li><p>Track 2: Decentralized commerce</p></li></ul><p>Sign-ups are open until April 8th and anyone can participate. There are over $70,000 in prizes available to participants!</p><p>You can <a href="https://summit.immersiveeducation.org/Oxford/2024/hackathon.html" target="_blank" rel="noopener noreferrer">sign up here</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 27, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/03/27/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/03/27/news-and-updates/update"/>
        <updated>2024-03-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have an update on Threshold Schnorr signatures, the ICRC-4 standard, and a new dfx beta release.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="March 27 2024" src="/assets/images/dev-update-blog-march-27-405d3448d4ace5849677846d5f8bfd6b.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have an update on Threshold Schnorr signatures, the ICRC-4 standard, and a new dfx beta release. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="threshold-schnorr-protocol">Threshold Schnorr protocol<a href="#threshold-schnorr-protocol" class="hash-link" aria-label="Direct link to Threshold Schnorr protocol" title="Direct link to Threshold Schnorr protocol">​</a></h2><p>Threshold Schnorr signatures are coming to ICP! Schnorr signatures are popular on blockchains due to their simple and efficient design. They allow for easy aggregation of multi-signatures and threshold signatures.</p><p>For ICP specifically, threshold-Schnorr signatures will enable canisters to obtain their own Schnorr public keys and addresses, request ICP to compute Schnorr signatures for arbitrary messages, and support both BIP-340 and Ed25519.</p><p>Opening the door for canisters to engage in these workflows also allows for further developments on ICP, including BRC-20 trading, certificate signing, and potential integrations with other chains that use Ed25519 variants like Solana, Polkadot, or Cardano. Additional multichain possibilities include additional chain-key tokens, like ckBRC20 and ckSOL, and enabling canisters to hold additional multichain assets like SOL, XRP, or ADA.</p><p>To implement threshold-Schnorr signatures on ICP, there are several prerequisites that will need to be completed, such as latency and throughput improvements to t-ECDSA.</p><p>You can learn more and participate in the conversation on the <a href="https://forum.dfinity.org/t/t-schnorr-facilitating-brc-20-trading-solana-integration-certificate-signing-and-more/28993" target="_blank" rel="noopener noreferrer">ICP developer forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icrc-4">ICRC-4<a href="#icrc-4" class="hash-link" aria-label="Direct link to ICRC-4" title="Direct link to ICRC-4">​</a></h2><p>The ICRC-4 token standard is nearing finalization! ICRC-4 will specify a standard for processing  batch transfers for tokens compliant with ICRC-1. The motivation behind this standard is to facilitate optimized batch transfers within DeFi applications that commonly use multi-party settlements or token distributions.</p><p>ICRC-4 will extend the ICRC-1 standard to enable multiple subaccounts owned by a principal to transfer tokens to multiple recipient accounts within a single ledger call. This method will provide reduced latency and cost when compared to traditional multi-account token transfers.</p><p>Check out the <a href="https://github.com/skilesare/ICRC/blob/main/ICRCs/ICRC-4/ICRC-4.md" target="_blank" rel="noopener noreferrer">ICRC-4 standard</a> and participate in the discussion about ICRC-4 on the <a href="https://forum.dfinity.org/t/icrc4-batch-transfers-nearing-finalization-please-review/27395/2" target="_blank" rel="noopener noreferrer">developer forum</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0190-beta"><code>dfx</code> v0.19.0 beta<a href="#dfx-v0190-beta" class="hash-link" aria-label="Direct link to dfx-v0190-beta" title="Direct link to dfx-v0190-beta">​</a></h2><p><code>dfx</code> v0.19.0 has been released for initial beta testing! This new release of <code>dfx</code> comes with several exciting new features and improvements:</p><ul><li><p>Support for the highly anticipated cycles ledger. Stay tuned for a dedicated blog post where we interview the team behind to cycles ledger to learn all the details about this feature.</p></li><li><p>Hyphenated project names are now supported.</p></li><li><p>The <code>dfx canister call</code> command now supports the flag <code>--output json</code>.</p></li><li><p><code>dfx canister call/install/sign</code> and <code>dfx deploy</code> commands now support the flag <code>--always-assist</code> where <code>dfx</code> will enable the Candid assist feature for optional arguments rather than providing a <code>null</code> value by default.</p></li></ul><p>This release includes several bug fixes as well, including:</p><ul><li><p>The output of <code>dfx ping</code> is now a valid JSON format.</p></li><li><p>Fetching canister logs are now grep and tail compatible.</p></li><li><p>Canister logs can now be called using a query call to the method <code>fetch_canister_logs</code>.</p></li></ul><p>You can <a href="https://github.com/dfinity/sdk/releases/tag/0.19.0-beta.0" target="_blank" rel="noopener noreferrer">read the full release notes</a> for more information.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Project spotlight - Cycles ledger]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/cycles-ledger</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/cycles-ledger"/>
        <updated>2024-03-25T21:35:09.000Z</updated>
        <summary type="html"><![CDATA[Today we're excited to announce the highly anticipated cycles ledger has been released in the latest dfx version, 0.19.0!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Project spotlight: Cycles ledger" src="/assets/images/project-spotlight-cycles-ledger-d20ebaaefc38bc4eabf315e0a764f0cd.jpg" width="1400" height="675" class="img_ev3q"></p><p>We're excited to announce that the cycles ledger has been released in the latest version of <code>dfx</code>, <code>v0.19.0</code>! The cycles ledger is a highly anticipated new way to manage cycles through <code>dfx</code>.</p><p>Today, we sat down with the team behind its development to talk about how the project was designed, how developers can use it, and what the team learned from developing the cycles ledger! </p><p><strong>To get started, what is the cycles ledger?</strong></p><p><em>The cycles ledger is a new canister that simplifies the management of cycles.</em></p><p><strong>How does the cycles ledger change how a developer interacts with cycles?</strong></p><p><em>Instead of creating one or more cycles wallets, which the developer controls and manages, the cycles ledger is a global ledger under the control of the NNS. That is, the burden of managing cycles wallets themselves is lifted. Developers can now conveniently store cycles in one place - the cycles ledger!</em></p><p><strong>Why should developers use the cycles ledger instead of the cycles wallet?</strong></p><p><em>The cycles wallet has the following shortcomings:</em></p><ul><li><p><em>Cycle wallets are a rather complex solution to the problem that principal IDs cannot hold cycles. Developers must first understand the intricacies of cycle wallets before they can become proficient at implementing canisters.</em></p></li><li><p><em>Cycle wallets themselves consume cycles. It is confusing for developers that they need to pay cycles for storing cycles.</em></p></li><li><p><em>When migrating identities, there is the risk that developers forget to copy the canister IDs of their cycle wallets. If the canister IDs cannot be recovered, the cycles are lost.</em></p></li></ul><p><em>As a global ledger running on a system subnet, the cycles ledger does not have any of these shortcomings.</em></p><p><strong>How can developers use the cycles ledger?</strong></p><p><em>The cycles ledger can be used through <code>dfx</code> using the new <code>dfx cycles</code> command. The command can be used to view the cycles balance of the current <code>dfx</code> identity, transfer cycles to other principal IDs, and withdraw cycles to top up canisters. It is also possible to increase <!-- -->[your]<!-- --> cycles balance by burning ICP and create canisters using cycles on the cycles ledger directly, all through <code>dfx</code>.</em></p><p><em>Since the cycles ledger complies with the ICRC-1, ICRC-2, and ICRC-3 standards, the cycles ledger can also be easily integrated into dapps, for example in the DeFi space.</em></p><p><strong>What are the plans for the cycles ledger in the future?</strong></p><p><em>The cycles ledger is meant to remain simple, so there are no concrete plans to develop the cycles ledger further. That being said, the cycles ledger will certainly evolve over time. For example, if new standards come about, we will evaluate if the cycles ledger should support them. Moreover, the cycles ledger may be updated to make use of existing and future features of the Internet Computer. As an example, the cycles ledger may burn as many cycles as it collects in fees using the <code>cycles_burn128</code> function.</em></p><p><strong>Developers in the past have used the cycles wallet to manage cycles. What are the plans for the cycles wallet in the future now that the cycles ledger is released?</strong></p><p><em>The cycles wallet will be turned into an extension that can be added to <code>dfx</code> if needed. It is important to note that the cycles wallet provides one functionality that the cycles ledger does not: Unlike the cycles ledger, the cycles wallet can be used to make calls to canisters with cycles attached. If a developer requires this functionality, using the cycles wallet for this purpose is still the recommended approach.</em></p><p><strong>What prompted this project?</strong></p><p><em>When we started the project, it was the most requested feature on the ICP Developer Feedback board. So, we reacted to the developer’s wishes when prioritizing this project.</em></p><p><strong>What was the goal of the project? How does it aim to improve the developer experience?</strong></p><p><em>The primary goal was to provide a more convenient way for developers to manage cycles.</em></p><p><em>By adding intuitive commands to <code>dfx</code> for the handling of cycles through a global ledger, we believe that the workflows for developers will improve. Specifically, developers new to the Internet Computer ecosystem will likely experience less friction and find it easier to get started with their first projects.</em></p><p><strong>How did the team design the project?</strong></p><p><em>The first step was to determine a suitable substitute for the cycles wallet. There are many approaches that one could pursue. As an example, support for principal IDs to hold cycles could be added to the replica itself, which would require a lot of changes and there would be many technical details to be worked out. Agreement to develop a global ledger in the form of a canister was reached rather quickly because it is a natural and straightforward solution to the problem. Furthermore, a canister implementation has the added benefit that it can adhere to standards for ICRC tokens, which makes the cycles ledger also interesting for dapps such as DEXs.</em></p><p><em>The design was then worked out around the concept of a global ICRC ledger, also specifying the required changes to <code>dfx</code> and the NNS.</em></p><p><strong>Are there some portions of the original design that didn’t make it into the final release?</strong></p><p><em>Once there was agreement on the core of the design, there were no significant changes. As usual, numerous small changes and extensions were made to the original design but nothing substantial was scrapped.</em></p><p><strong>What was the most challenging part of creating the cycles ledger?</strong></p><p><em>The project required contributions from several teams with the SDK team and the FI team handling most of the development work. As every project is busy with many important tasks, the most challenging part was the management of available resources to make sure that the project continues to make progress.</em></p><p><strong>What teams were involved in creating the cycles ledger?</strong></p><p><em>The SDK team led the development, implementing all the required changes in <code>dfx</code> and the NNS, as well as the non-ICRC endpoints of the cycles ledger. The FI team was responsible for the development of all functionality related to the ICRC-1, ICRC-2, and IRCR-3 standards. Additionally, the NNS team was involved to oversee the changes to the NNS and the product security team to provide security reviews for the design and the implementation.</em></p><p><strong>Were there any other features or tools that were created as a result of this project?</strong></p><p><em>The changes to the NNS, making it possible to learn which subnet a canister is/would be installed and also to specify on which subnet a canister is supposed to be installed, will likely be useful in other projects.</em></p><p><strong>What was the team’s biggest learning or takeaway from this project? Was there anything that could be applied to future projects or influence the design of tooling in the future?</strong></p><p><em>The project nicely showed that we can work well across teams. It was a fun project to work on!</em></p><p><em>It also showed that actively dealing with resource constraints is very important. For example, when the NNS team didn’t have the capacity to help with the implementation work, the SDK team stepped up and implemented the NNS changes, which the NNS team reviewed carefully. Without this effort, the completion of the project would have been delayed indefinitely.</em></p><p><strong>Is there anything unique about this project that makes it stand out from other previous projects?</strong></p><p><em>The project is special in that it develops a canister-based solution, which is always a dog-fooding exercise to some extent, to a problem that the community cares about.</em></p><p><strong>To wrap things up, what makes the cycles ledger exciting for developers?</strong></p><p><em>Our current developer base will likely be content to have a simpler workflow at their disposal. New developers will hopefully have an easy time on-boarding, which would be a great sign for us that the project made a difference.</em></p><p>A huge thank you to the cycles ledger team for sitting down and giving us the inside scoop on this exciting project! We're looking forward to hearing what the community thinks about the cycles ledger on our <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">developer forum</a> and on <a href="https://discord.internetcomputer.org" target="_blank" rel="noopener noreferrer">Discord</a>.</p><p>Until next time!</p><p>-DFINITY</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 20, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/03/20/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/03/20/news-and-updates/update"/>
        <updated>2024-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have a new ICP JavaScript agent release, an update on the cycles ledger, and a sneak peek into React Native apps on ICP.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="March 20 2024" src="/assets/images/dev-update-blog-march-20-cc56da40d4fbb3ce99e6104a370c2d6a.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have a new <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> release, an update on the cycles ledger, and a sneak peek into React Native apps on ICP. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="agent-js-v110">Agent-js v1.1.0<a href="#agent-js-v110" class="hash-link" aria-label="Direct link to Agent-js v1.1.0" title="Direct link to Agent-js v1.1.0">​</a></h2><p>This week, a new minor version of the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> has been released. This release introduces a new <code>fromPem</code> method, which is designed to make managing identities easier during CI. It is recommended that developers use caution in any instance where users are transporting unencrypted <code>pem</code> files.</p><p>Another new feature in this release is certified watermarks, which can be used to help reduce the number of query calls that return stale responses.</p><p>You can read the full release notes <a href="https://github.com/dfinity/agent-js/releases/tag/v1.1.0" target="_blank" rel="noopener noreferrer">on the ICP JavaScript agent GitHub release page</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cycles-ledger">Cycles ledger<a href="#cycles-ledger" class="hash-link" aria-label="Direct link to Cycles ledger" title="Direct link to Cycles ledger">​</a></h2><p>The highly anticipated cycles ledger feature is nearing completion, and is planned to be released in the next major version of <code>dfx</code>, v0.19.0!</p><p>The cycles ledger has been a topic mentioned in a few previous developer update blog posts, as it has been in the development pipeline for several months. The cycles ledger will replace the cycles wallet feature, significantly simplifying cycles management for developers. With the cycles wallet, developers had to deploy and manage different cycles wallet containers for different developer identities. With the cycles ledger, all a developer will need is their developer identity and the <code>dfx cycles</code> command to transfer cycles to other principals, withdraw cycles, or top up canisters.</p><p>There will be a detailed Project Spotlight post in the coming weeks here on the Dev Blog that will interview the team behind the cycles ledger and go into much further detail, so keep an eye out!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="react-native-for-icp-apps">React Native for ICP apps<a href="#react-native-for-icp-apps" class="hash-link" aria-label="Direct link to React Native for ICP apps" title="Direct link to React Native for ICP apps">​</a></h2><p>React Native support is coming to ICP via the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a>! In the current <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> architecture, Webassembly modules are used to verify <a href="https://learn.internetcomputer.org/hc/en-us/articles/34209540682644-Subnet-Keys-and-Subnet-Signatures" target="_blank" rel="noopener noreferrer">BLS signatures</a>. The latest version of the <code>@noble/curves</code> package provides an alternative solution. Support for the npm package <code>@noble/curves</code> will be included in an upcoming <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> release, allowing for React Native apps to be built!</p><p>Want to take a sneak peek? Check out <a href="https://kyle-peacock.com/blog/dfinity/ic-expo/" target="_blank" rel="noopener noreferrer">this tutorial</a> that creates a React Native app on IC that manually installs and configures the <code>@noble/curves</code> package. In the future, this dependency can be managed by npm instead.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 13, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/03/13/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/03/13/news-and-updates/update"/>
        <updated>2024-03-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, there is a new release of `dfx` to discuss, new NNS proposals to vote on, and a new community project to explore.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="March 13 2024" src="/assets/images/dev-update-blog-march-13-862689be2a43ec3522fde4a30c1cdfff.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, there is a new release of <code>dfx</code> to discuss, new NNS proposals to vote on, and a new community project to explore. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0180"><code>dfx</code> v0.18.0<a href="#dfx-v0180" class="hash-link" aria-label="Direct link to dfx-v0180" title="Direct link to dfx-v0180">​</a></h2><p>Last week, <code>dfx</code> v0.18.0 was released. Some highlights from this release include:</p><ul><li><p><code>dfx canister logs &lt;canister_id&gt;</code>: A new subcommand that retrieves a canister's logs. This feature is still under development, but it is an exciting preview of this upcoming functionality!</p></li><li><p>Local asset canisters are displayed in a subdomain format of either <code>&lt;canister_id&gt;.localhost:&lt;port&gt;</code> or <code>localhost:&lt;port&gt;?canisterId=&lt;canister_id&gt;</code>.</p></li><li><p>Candid assist: <code>dfx</code> now asks for init arguments within the terminal window when a canister requires init arguments.</p></li><li><p><code>dfxvm</code> is now installed within the <code>install.sh</code> script.</p></li><li><p>fix: <code>.env</code> fallbacks have been removed.</p></li><li><p>fix: The <code>dfx upgrade</code> command has been removed.</p></li></ul><p>You can check out the <a href="https://github.com/dfinity/sdk/releases/tag/0.18.0" target="_blank" rel="noopener noreferrer">full release notes on GitHub</a>.</p><p>This new version includes breaking changes, and a migration guide has been created to help migrate old workflows to use the latest update. <a href="https://github.com/dfinity/sdk/blob/master/docs/migration/dfx-0.18.0-migration-guide.md" target="_blank" rel="noopener noreferrer">Read the migration guide on GitHub</a>.</p><p>v0.180 also includes Motoko v0.11.0, which also includes breaking changes. <a href="https://internetcomputer.orghttps://github.com/dfinity/motoko/blob/master/doc/attic/0.11.0-migration-guide" target="_blank" rel="noopener noreferrer">Read the Motoko v0.11.0 migration guide</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-updates">NNS updates<a href="#nns-updates" class="hash-link" aria-label="Direct link to NNS updates" title="Direct link to NNS updates">​</a></h2><p>This week, the following NNS upgrade proposals have been submitted and are open for voting:</p><p>NNS Governance:</p><ul><li><p>Neurons' Fund update: Change the Neuron's Fund participation from 333,000 ICP to 750,000 XDR. Limits are converted to ICP using the 30-day conversation rate from the CMC.</p></li><li><p>Proposal summary limit increased for both the NNS and SNS from 15KiB to 30KiB.</p></li><li><p>NNS governance metrics will now include the proposal action type.</p></li></ul><p>SNS-W:</p><ul><li>Refactoring and cleanup; no external changes.</li></ul><p>Registry:</p><ul><li><p>Bug fix for Candid service definition.</p></li><li><p>Multiple signing subnets for the same key are now allowed.</p></li></ul><p>CMC:</p><ul><li>Make an edit where <code>canister_settings</code> now has <code>log_visibility</code>.</li></ul><p>You can <a href="https://forum.dfinity.org/t/nns-updates-2024-03-12/28372" target="_blank" rel="noopener noreferrer">learn more on the DFINITY forum</a> about these updates.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nfid-vaults">NFID Vaults<a href="#nfid-vaults" class="hash-link" aria-label="Direct link to NFID Vaults" title="Direct link to NFID Vaults">​</a></h2><p>A new community project has been shared on the forum! <a href="https://nfidvaults.com/" target="_blank" rel="noopener noreferrer">NFID Vaults</a> is an omni-chain multi-sig wallet protocol designed to protect personal and shared digital assets.</p><p>Each NFID Vault is a smart contract deployed on ICP. The canister is self-controlling and can be verified by searching the <a href="https://dashboard.internetcomputer.org/" target="_blank" rel="noopener noreferrer">canister ID on the dashboard</a>.</p><p>NFID Vaults currently includes a 'Pro' version, designed for teams and grant recipients to control how their ICP is spent.</p><p>In the future, a 'Light' version will be released that is aimed toward individuals and teams who don't require granular policy controls.</p><p>Additional roadmap items for the project include:</p><ul><li><p>Additional wallet support.</p></li><li><p>Additional ICP asset support (ICRC-1, ICRC-7, etc).</p></li><li><p>Other network support such as BTC.</p></li><li><p>Dev SDK for creating and managing vaults.</p></li></ul><p><a href="https://forum.dfinity.org/t/introducing-nfid-vaults-worlds-first-omni-chain-multi-sig/28370" target="_blank" rel="noopener noreferrer">Learn more on the DFINITY forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 6, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/03/06/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/03/06/news-and-updates/update"/>
        <updated>2024-03-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we'll talk about the exciting new NNS neuron sandbox, some breaking changes to the latest Motoko version (v0.11.0), and a cool community demo featuring Juno and OpenAI.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="March 6 2024" src="/assets/images/dev-update-blog-march-6-18d268ec0c299a6af847766b8d8fb3b2.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we'll talk about the exciting new NNS neuron sandbox, some breaking changes to the latest Motoko version (v0.11.0), and a cool community demo featuring Juno and OpenAI. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nns-neuron-sandbox">NNS neuron sandbox<a href="#nns-neuron-sandbox" class="hash-link" aria-label="Direct link to NNS neuron sandbox" title="Direct link to NNS neuron sandbox">​</a></h2><p>Have you ever wanted to experiment with neurons without having to stake actual ICP? Introducing the NNS neuron sandbox! This new sandbox platform is an onchain interactive tool that can be used to simulate the behavior of neurons. It is a great resource to learn more about the NNS and understand how to participate in the governance of ICP.</p><p>You can use the sandbox to play with different neuron configurations and operations in a safe environment. It also provides insights into the simulated voting power of a neuron and its estimated annualized rewards in the upcoming years. Get started practicing today by heading over to the <a href="https://klgza-cqaaa-aaaak-qcz5a-cai.icp0.io/" target="_blank" rel="noopener noreferrer">NNS neuron sandbox</a>.</p><p>Want to ask questions or give the team feedback on this new tool? <a href="https://forum.dfinity.org/t/try-out-the-new-nns-neuron-sandbox/27931" target="_blank" rel="noopener noreferrer">Head over to the ICP developer forum!</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0110-new-breaking-changes">Motoko v0.11.0: New breaking changes<a href="#motoko-v0110-new-breaking-changes" class="hash-link" aria-label="Direct link to Motoko v0.11.0: New breaking changes" title="Direct link to Motoko v0.11.0: New breaking changes">​</a></h2><p>A new version of Motoko (v0.11.0) introduces a new safety feature that could cause breaking changes to existing code.</p><p>This update makes changes to how Motoko handles making calls to sensitive functions. In the past, third-party libraries could make calls to functions such as <code>ExperimentalCycles.add(...)</code> and <code>Timer.setTimer(...)</code> without providing any indication to the caller that sensitive system functionality was being utilized.</p><p>In the newest version of Motoko, the type system has been revised to detect and prevent this scenario. However, it still allows developers to allow sensitive functions to be called.</p><p>For example, in previous Motoko versions, the following code snippet could be used:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">func</span><span class="token plain"> splitCycles</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> amount </span><span class="token operator">=</span><span class="token plain"> ExperimentalCycles</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">balance</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">/</span><span class="token plain"> 2</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ExperimentalCycles</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">amount</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// new error</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>In Motoko v0.11.0 and newer, this code will throw a compiler error:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">`system` capability required, but not available</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">(need an enclosing async expression or function body or explicit `system` type parameter)(M0197)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>To support the new changes, the previous code should be rewritten to include the <code>system</code> type parameter:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">func</span><span class="token plain"> splitCycles</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">system</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> amount </span><span class="token operator">=</span><span class="token plain"> ExperimentalCycles</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">balance</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">/</span><span class="token plain"> 2</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ExperimentalCycles</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">amount</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// warning</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can learn more in the <a href="https://github.com/dfinity/motoko/blob/master/doc/attic/0.11.0-migration-guide" target="_blank" rel="noopener noreferrer">Motoko v0.11.0 migration guide</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="juno--openai-demo">Juno + OpenAI demo<a href="#juno--openai-demo" class="hash-link" aria-label="Direct link to Juno + OpenAI demo" title="Direct link to Juno + OpenAI demo">​</a></h2><p>This week, a new Juno demo has been shared on the forum! This demo showcases how to use Juno's serverless functions to query the OpenAI API by leveraging HTTPS outcalls.</p><p>In this demo, you can give OpenAI a prompt, and it will generate an image in response!</p><p>You can play with the <a href="https://pycrs-xiaaa-aaaal-ab6la-cai.icp0.io/" target="_blank" rel="noopener noreferrer">demo canister</a>, or check out the <a href="https://github.com/peterpeterparker/juno-openai" target="_blank" rel="noopener noreferrer">open source code to learn how you can implement something similar in your dapp!</a></p><p>Feedback or questions for the Juno team? <a href="https://forum.dfinity.org/t/juno-openai-demo/28176" target="_blank" rel="noopener noreferrer">Head over to the forum post for this demo</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 28, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/02/28/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/02/28/news-and-updates/update"/>
        <updated>2024-02-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have a new episode of the Developer Liftoff, a new benchmarking framework for canisters, and SNS ledger support for ICRC-2 tokens.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="February 28 2024" src="/assets/images/dev-update-blog-feb-28-70b0f0b677c08ac501222edc2c6f9a48.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have a new episode of the Developer Liftoff, a new benchmarking framework for canisters, and SNS ledger support for ICRC-2 tokens. Let's dive in!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-episode-21-canister-upgrades-storage-and-persistence">Developer Liftoff episode 2.1: Canister upgrades, storage, and persistence<a href="#developer-liftoff-episode-21-canister-upgrades-storage-and-persistence" class="hash-link" aria-label="Direct link to Developer Liftoff episode 2.1: Canister upgrades, storage, and persistence" title="Direct link to Developer Liftoff episode 2.1: Canister upgrades, storage, and persistence">​</a></h2><p>Catch up on the latest episode of the ICP Developer Liftoff tutorial series! In this episode, "2.1: Canister upgrades, storage, and persistence", you'll learn about:</p><ul><li>Memory types and terms.</li><li>Upgrading canisters.</li><li>Motoko stable memory workflow.</li><li>Rust stable memory workflow.</li><li>Stable storage and stable variables.</li><li>Defining a stable variable.</li><li>Stable variables in action.</li></ul><p>Watch the video on the DFINITY YouTube channel:</p><div class="text--center"><p> </p></div><div class="text--center"><iframe width="660" height="415" src="https://www.youtube.com/watch?v=-aXjKSz_oXc&amp;list=PLuhDt1vhGcrdR2h6nPNylXKS4u8L-efvD&amp;index=13" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe> </div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="canbench">Canbench<a href="#canbench" class="hash-link" aria-label="Direct link to Canbench" title="Direct link to Canbench">​</a></h2><p>A new benchmarking framework for canisters has been released! This new framework, called <strong>canbench</strong>, is an open-source tool that can be used to understand canister performance through monitoring and analytics.</p><p>Canbench currently supports Rust canisters, but additional languages may be added in the future. An example can be found below:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">use</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">canbench</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token plain">bench</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">use</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">candid</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token class-name">CandidType</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token class-name">Encode</span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">use</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">ic_cdk_macros</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token plain">pre_upgrade</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">use</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">std</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token namespace" style="color:#26D76D">cell</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token class-name">RefCell</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token attribute attr-name" style="color:#F8F8F2">#[derive(CandidType)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">struct</span><span class="token plain"> </span><span class="token type-definition class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    name</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token attribute attr-name" style="color:#F8F8F2">#[derive(Default, CandidType)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">struct</span><span class="token plain"> </span><span class="token type-definition class-name">State</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    users</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">std</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token namespace" style="color:#26D76D">collections</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token class-name">BTreeMap</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u64</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property">thread_local!</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">static</span><span class="token plain"> </span><span class="token constant" style="color:#29ABE2">STATE</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">RefCell</span><span class="token operator">&lt;</span><span class="token class-name">State</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">RefCell</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">new</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">State</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">default</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token attribute attr-name" style="color:#F8F8F2">#[pre_upgrade]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">pre_upgrade</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// Serialize state.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> bytes </span><span class="token operator">=</span><span class="token plain"> </span><span class="token constant" style="color:#29ABE2">STATE</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token closure-params">s</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token plain"> </span><span class="token macro property">Encode!</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">unwrap</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// Write to stable memory.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace" style="color:#26D76D">ic_cdk</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token namespace" style="color:#26D76D">api</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token namespace" style="color:#26D76D">stable</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token class-name">StableWriter</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">default</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">write</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token operator">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">unwrap</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token attribute attr-name" style="color:#F8F8F2">#[bench]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">insert_users</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token constant" style="color:#29ABE2">STATE</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token closure-params">s</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">mut</span><span class="token plain"> s </span><span class="token operator">=</span><span class="token plain"> s</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">borrow_mut</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:#EB318A">for</span><span class="token plain"> i </span><span class="token keyword" style="color:#EB318A">in</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:#F1EEF5">..</span><span class="token number">1_000_000</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            s</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">users</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">insert</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                i</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    name</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"foo"</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">to_string</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">main</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The output of this would be:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">No significant performance changes detected</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">examples/btreemap_vs_hashmap/canbench_results.yml is up to date</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">---------------------------------------------------</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Benchmark: insert_users</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  total:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    instructions: 2.57 B (no change)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    heap_increase: 871 pages (no change)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    stable_memory_increase: 0 pages (no change)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">---------------------------------------------------</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can learn more about canbench on the <a href="https://docs.rs/canbench-rs/latest/canbench_rs/" target="_blank" rel="noopener noreferrer">canbench docs</a> and the <a href="https://forum.dfinity.org/t/introducing-canbench-a-benchmarking-framework-for-canisters/27517" target="_blank" rel="noopener noreferrer">forum post announcing canbench</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icrc-2-now-supported-by-sns-ledgers">ICRC-2 now supported by SNS ledgers<a href="#icrc-2-now-supported-by-sns-ledgers" class="hash-link" aria-label="Direct link to ICRC-2 now supported by SNS ledgers" title="Direct link to ICRC-2 now supported by SNS ledgers">​</a></h2><p>This week, the ICP community voted on proposals to adopt a new version of the SNS index canister suite, which includes new versions of the ledger, archive, and index canisters. This new version means that all newly launched SNS projects will have support for the ICRC-1 token standard. A key feature of the ICRC-2 token standard is the ability for token transfers to be delegated to a third party. Existing SNS projects can upgrade their index canister suite to enable this new functionality.</p><p>You can learn more or participate in the discussion on <a href="https://forum.dfinity.org/t/sns-ledgers-now-support-icrc-2/27932" target="_blank" rel="noopener noreferrer">the ICP developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 21, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/02/21/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/02/21/news-and-updates/update"/>
        <updated>2024-02-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's update, we have a very important message about a critical security bug in the ICP JavaScript agent, updates from the NFT working group, and info about ICP at ETHDenver next week!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="February 21 2024" src="/assets/images/dev-update-blog-feb-21-3788fe5a3617a2c7b1659c023bdb42f1.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! In this week's update, we have a very important message about a critical security bug in the ICP JavaScript agent, updates from the NFT working group, and info about ICP at ETHDenver next week! Let's get started.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="critical-security-vulnerability-in-the-icp-javascript-agent-v100">Critical security vulnerability in the ICP JavaScript agent v1.0.0<a href="#critical-security-vulnerability-in-the-icp-javascript-agent-v100" class="hash-link" aria-label="Direct link to Critical security vulnerability in the ICP JavaScript agent v1.0.0" title="Direct link to Critical security vulnerability in the ICP JavaScript agent v1.0.0">​</a></h2><p>A critical security vulnerability in the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> versions 1.0.0 and older has been identified and patched. This vulnerability had to do with the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> library's <code>Ed25519KeyIdentity.generate</code> function, which generates an ed25519 key pair with the optional parameter to provide a 32 byte seed value. Due to a recent change in the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a>, this function was altered so that when no seed value was provided, the library generated an insecure seed for key pair generation. The resulting principal was a constant identity that was based on an all-zero private key. With this vulnerability, attackers could steal funds associated with this principal on a ledger or compromise access to canisters controlled by this principal.</p><p>The patch for the vulnerability is available in <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> <a href="https://github.com/dfinity/agent-js/releases/tag/v1.0.1" target="_blank" rel="noopener noreferrer">v1.0.1</a>. It is encouraged that all developers upgrade and deploy their canisters immediately.</p><ul><li><p><a href="https://forum.dfinity.org/t/agent-js-insecure-key-generation-in-ed25519keyidentity-generate/27732" target="_blank" rel="noopener noreferrer">Forum post</a>.</p></li><li><p><a href="https://github.com/advisories/GHSA-c9vv-fhgv-cjc3" target="_blank" rel="noopener noreferrer">GitHub advisory</a>.</p></li><li><p><a href="https://nvd.nist.gov/vuln/detail/CVE-2024-1631" target="_blank" rel="noopener noreferrer">CVE-2024-1631</a>.</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="nft-working-group-updates">NFT working group updates<a href="#nft-working-group-updates" class="hash-link" aria-label="Direct link to NFT working group updates" title="Direct link to NFT working group updates">​</a></h2><p>The NFT working group has recently concluded work on the ICRC-7 standard and is looking ahead to the next steps for NFTs on ICP. The group has put together 4 possible new ICRC standards that can be pursued by the working group moving forward:</p><ul><li><p>ICRC-8: Ledger markets: This standard would define marketplace standards for fungible or non-fungible ledgers, including the data structures and workflows necessary to support other token standards and achieve atomic trades.</p></li><li><p>ICRC-56: Infinitely scalable multi-canister file system: This standard would define parameters for a standard file system that can be used for storing onchain NFT media.</p></li><li><p>ICRC-59: Static NFT metadata interface standard: This standard would define a static standard for NFT metadata.</p></li><li><p>ICRC-60: Dynamic NFT metadata interface standard: This standard would define a dynamic standard for NFT metadata.</p></li></ul><p>The NFT working group meets every other Tuesday at 5PM CEST.</p><p><a href="https://forum.dfinity.org/t/nft-working-group-next-steps-icrc-8-icrc-56-icrc-59-icrc-60/27698" target="_blank" rel="noopener noreferrer">Read more and participate in the discussion on the forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="upcoming-event-ethdenver">Upcoming event: ETHDenver<a href="#upcoming-event-ethdenver" class="hash-link" aria-label="Direct link to Upcoming event: ETHDenver" title="Direct link to Upcoming event: ETHDenver">​</a></h2><p>If you're going to ETHDenver, be sure to stop by the ICP booth! Our team will be hosting and participating in some exciting events:</p><ul><li><p>Our DevRel engineer Jennifer Tran will be joining the <a href="https://www.encode.club/denver2024" target="_blank" rel="noopener noreferrer">Encode Club panel</a> to cover L2s.</p></li><li><p><a href="https://lu.ma/icp-denver" target="_blank" rel="noopener noreferrer">ICP Hubs Meetup Buidl community and technology</a>.</p></li><li><p><a href="https://www.meetup.com/cryptomondays-denver/events/298354132/?utm_medium=referral&amp;utm_campaign=share-btn_savedevents_share_modal&amp;utm_source=link" target="_blank" rel="noopener noreferrer">CryptoMondays - ETH X ICP</a>.</p></li><li><p><a href="https://www.ethdenver.com/buidlathon" target="_blank" rel="noopener noreferrer">Stop by the booth to participate in one of the ETHDenver bounties!</a>.</p></li></ul><p>Want to learn more or sign up for email updates on these events? <a href="https://mailchi.mp/internetcomputer/ethdenver2024" target="_blank" rel="noopener noreferrer">Join the mailing list</a> to stay updated!</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 14, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/02/14/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/02/14/news-and-updates/update"/>
        <updated>2024-02-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have a new dfx release, v0.17.0, which introduces a brand new `dfx new` workflow, a new PocketIC release that enables threshold ECDSA testing, and a new community-developed dapp that provides onchain exploring for tokens!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="February 14 2024" src="/assets/images/dev-update-blog-feb-14-43473c7844f165928df45c0466289385.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have a new <code>dfx</code> release, v0.17.0, which introduces a brand new <code>dfx new</code> workflow, a new PocketIC release that enables threshold ECDSA testing, and a new community-developed dapp that provides onchain exploring for tokens! Let's get started.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0170">dfx v0.17.0<a href="#dfx-v0170" class="hash-link" aria-label="Direct link to dfx v0.17.0" title="Direct link to dfx v0.17.0">​</a></h2><p>A new version of <code>dfx</code> has been released! This release is exciting because it introduces a new workflow for <code>dfx new</code>!</p><p>Now, when <code>dfx new</code> is used without any flags, an interactive prompt will be displayed that lets you customize what language backend canister you'd like to use, what frontend framework you'd like to use for your frontend canister (or choose 'No frontend canister'), and you can choose additional features to be generated within the project, such as Bitcoin integration functionality or Internet Identity!</p><p><img loading="lazy" alt="dfx new" src="/assets/images/dfx-new-71a760d057d783b5b595dacf7f905063.gif" width="600" height="352" class="img_ev3q"></p><p>Additional notable new features in this release include:</p><ul><li><p>The flag <code>--specified-id</code> can be used in the <code>dfx deploy</code> and <code>dfx canister create</code> commands to create a canister with a specific ID. <code>specified_id</code> is also supported in <code>dfx.json</code>.</p></li><li><p>Creating canisters on the same subnet as another canister is now supported with the flag <code>--next-to &lt;canister principal&gt;</code>. The <a href="https://dashboard.internetcomputer.org/canister/rwlgt-iiaaa-aaaaa-aaaaa-cai#get_subnet_for_canister" target="_blank" rel="noopener noreferrer">registry canister</a> is used as the source of truth for finding a canister's subnet ID.</p></li><li><p><code>init_arg</code> can now be set for canisters in <code>dfx.json</code>.</p></li><li><p>The <code>dfx upgrade</code> command will direct users to install <code>dfxvm</code>.</p></li></ul><p>You can read the <a href="https://github.com/dfinity/sdk/releases/tag/0.17.0-beta.1" target="_blank" rel="noopener noreferrer">full release notes on GitHub</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pocketic-v301">PocketIC v3.0.1<a href="#pocketic-v301" class="hash-link" aria-label="Direct link to PocketIC v3.0.1" title="Direct link to PocketIC v3.0.1">​</a></h2><p>This week, a new version of PocketIC has been released! This release includes support for testing threshold ECDSA calls by supporting trapping for t-ECDSA calls. Additional bug fixes are included in this version, such as the <code>inspect_message</code> no longer panics if a call is rejected, and the server will now reject JSON files that contain an invalid variant of the SubnetSpec.</p><p>You can read the <a href="https://github.com/dfinity/pocketic/releases/tag/3.0.1" target="_blank" rel="noopener noreferrer">full release notes on Github</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="221bravoapp---onchain-explorer-for-icp-and-icrc-tokens">221Bravo.App - Onchain explorer for ICP and ICRC tokens<a href="#221bravoapp---onchain-explorer-for-icp-and-icrc-tokens" class="hash-link" aria-label="Direct link to 221Bravo.App - Onchain explorer for ICP and ICRC tokens" title="Direct link to 221Bravo.App - Onchain explorer for ICP and ICRC tokens">​</a></h2><p><a href="https://221bravo.app/" target="_blank" rel="noopener noreferrer">221Bravo.App</a> is a new community project that provides a blockchain explorer for ICP and ICRC tokens! The exciting attribute of this app is that it is hosted 100% onchain and fully powered by ICP!</p><p>221Bravo.App can be used to search for things such as principals, accounts, and even Principal.Sub-account records. Data for tokens such as CHAT, SONIC, and OGY are displayed on the app's homepage and can be clicked on to provide detailed information about the token's statistics, mint/burn/transfer rates, transactions, and how many unique accounts hold the token.</p><p><img loading="lazy" alt="221Bravo.App" src="/assets/images/221Bravo-0db679fec79d3461213454594351c19d.png" width="3430" height="1780" class="img_ev3q"></p><p>You can read more about <a href="https://forum.dfinity.org/t/221bravo-a-fully-on-chain-explorer-for-icp-tokens/27586" target="_blank" rel="noopener noreferrer">221Bravo.App on the forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Don’t trust, verify — New node metrics on the Internet Computer]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/node-metrics</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/node-metrics"/>
        <updated>2024-02-07T22:33:37.000Z</updated>
        <summary type="html"><![CDATA[With the release of new metrics, node performance is fully transparent and verifiable.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Don’t trust, verify — New node metrics on the Internet Computer" src="/assets/images/node-metrics-1b7150c47a4070d6a892c8d5c6173ae6.webp" width="1400" height="758" class="img_ev3q"></p><p><em>This article was originally published on the <a href="https://medium.com/dfinity/dont-trust-verify-new-node-metrics-on-the-internet-computer-367cc154a572" target="_blank" rel="noopener noreferrer">DFINITY Medium blog</a></em></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="background">Background<a href="#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2><p><a href="https://internetcomputer.org/" target="_blank" rel="noopener noreferrer">The Internet Computer protocol</a> coordinates the creation and interaction of subnet blockchains created by standardized node machines run by independent owners and installed within independent data centers around the globe to ensure decentralization. Compared to other blockchains, the Internet Computer has stronger requirements on the performance and availability of the nodes. This is due to the fact that most of the node resources are dedicated to <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">performing useful work</a> such as executing smart contracts and participating in threshold cryptography — tasks that needs to be performed by all nodes of a given subnet blockchain, and at a much lower replication factor than other blockchains, for energy and cost efficiency.</p><p>The Internet Computer is designed in a way that allows anyone to become a <a href="https://internetcomputer.org/node-providers" target="_blank" rel="noopener noreferrer">node provider (NP)</a>. In a decentralized manner, each node provider is verified and voted in by token holders via the <a href="https://learn.internetcomputer.org/hc/en-us/articles/33692645961236-NNS-Network-Nervous-System" target="_blank" rel="noopener noreferrer">Network Nervous System (NNS)</a>, the DAO that governs the Internet Computer. The NNS acts as a decentralized algorithmic authority that oversees the network’s operations and evolution, including scaling the Internet Computer’s capacity by adding more nodes. In this regard, it makes sense to be able to measure node contributions and allow their providers to diagnose node problems efficiently. With trustworthy node metrics, the <a href="https://wiki.internetcomputer.org/wiki/Node_Provider_Remuneration" target="_blank" rel="noopener noreferrer">node provider remuneration model</a> can be adjusted to reward precise node contributions, rather than a fixed monthly sum to cover hardware and operational costs.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="trustworthy-metrics">Trustworthy metrics<a href="#trustworthy-metrics" class="hash-link" aria-label="Direct link to Trustworthy metrics" title="Direct link to Trustworthy metrics">​</a></h2><p>So far, the health of the nodes has been measured by collecting and analyzing logs and metrics on infrastructure external to the Internet Computer. When deviating from expected indicator values, the respective node providers and data centers are currently responsible for fixing the situation. But this is not exactly <em>trustless</em>. In the past few months, the Internet Computer protocol has been improved with the changes outlined below to allow some monitoring of tasks to be carried out by the nodes of the network themselves in a fully automated, trustless fashion. It is now possible for any party to collect information on the health of any node and its contributions without additional trust assumptions, purely by interacting with the Internet Computer itself.</p><p>While users normally need to process all blocks to infer this information on other blockchains, users on the Internet Computer can rely on chain-key technology and threshold-signing to retrieve node metrics directly.</p><p>In the long run, the availability of verifiable node metrics will lead to further refinements and improvements of the node remuneration process, as insights gained through the decentralized monitoring will allow automated adjustments to payments based on the performance of nodes, or rather the lack thereof.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-architecture-for-trustworthy-node-metrics">ICP architecture for trustworthy node metrics<a href="#icp-architecture-for-trustworthy-node-metrics" class="hash-link" aria-label="Direct link to ICP architecture for trustworthy node metrics" title="Direct link to ICP architecture for trustworthy node metrics">​</a></h2><p><img loading="lazy" alt="Node metrics diagram" src="/assets/images/node-metrics-diagram-2b14b4f498b15d4ce1e4823d050194cb.webp" width="1062" height="762" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-consensus-has-always-worked">How consensus has always worked<a href="#how-consensus-has-always-worked" class="hash-link" aria-label="Direct link to How consensus has always worked" title="Direct link to How consensus has always worked">​</a></h2><p>The job of the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus layer</a> of the Internet Computer is to <strong>order inputs to a subnet</strong> so that all nodes in a subnet <strong>process such inputs in the same order</strong>. The Internet Computer consensus protocol achieves this by creating a chain of blocks containing the inputs and handing over the content to the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34208241927316-Message-Routing" target="_blank" rel="noopener noreferrer">message routing layer</a>, which will ensure that the inputs reach their targets. To this end, the consensus protocol relies on an unbiased and unpredictable pseudorandom function to determine which node is supposed to create the next block. If the selected node fails to do so fast enough, the pseudorandom function picks another node to make a block.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="recent-updates">Recent updates<a href="#recent-updates" class="hash-link" aria-label="Direct link to Recent updates" title="Direct link to Recent updates">​</a></h2><p>Consensus now provides Message Routing (MR) with information on which nodes succeeded to be the block maker, and which nodes failed to be block makers even though it was their turn.</p><p>In turn, the MR layer adds this information into the replicated state, which is threshold-signed by nodes in the subnet to ensure all honest nodes have the same state. The metrics for the number of successfully proposed blocks and failures thereof are accumulated in the replicated state for nodes belonging to the subnet.</p><p>For each day over a 60-day period, the state of this accumulation is saved as a snapshot including the last replicated state update just before midnight in a queue of snapshots (in chronologically ascending order). Snapshots in the queue are immutable, meaning the current state is not included.</p><p>More functionalities have to be provided to make this useful. More precisely, node providers and members of the ICP community may be interested in different ranges. Hence, there is now functionality to query for a date range returning the difference between the value at the end and the start of the range. Since subnet membership can change over time, a culling mechanism had to be provided. If no changes in stats have been recorded for the node ID in question when a new snapshot is about to be pushed compared to the one preceding it, the node ID is pruned. This must be taken into account also when taking the difference between snapshots for range queries.</p><p>To make this available externally, via the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34210839162004-Canister-Smart-Contracts" target="_blank" rel="noopener noreferrer">management canister</a>, a new endpoint <code>node_metrics_history</code> was created. It returns data from the snapshots explained above for a given range of dates. More details are described in the <a href="/references/ic-interface-spec#ic-node-metrics-history">IC Interface Specification</a>. Note that this API is considered <strong>EXPERIMENTAL</strong>. In other words, feedback is much appreciated and canister developers must be aware that the API may evolve in a non-backward-compatible way.</p><p>Since retrieving the node metrics consumes resources (CPU, memory, bandwidth), the endpoint can only be called by canisters, to prevent abuse. Each request for fetching metrics will be charged for, which makes it harder for malicious users to conduct DOS attacks using this interface.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="tooling-for-trustworthy-node-metrics">Tooling for trustworthy node metrics<a href="#tooling-for-trustworthy-node-metrics" class="hash-link" aria-label="Direct link to Tooling for trustworthy node metrics" title="Direct link to Tooling for trustworthy node metrics">​</a></h2><p>A DFINITY R&amp;D team has created <a href="https://dfinity.github.io/dre/trustworthy-metrics/trustworthy-metrics.html" target="_blank" rel="noopener noreferrer">open-source tooling</a> that allows node providers and any other interested party to fetch metrics from the <a href="/references/system-canisters/management-canister">management canister(s)</a> of all subnets and inspect them in detail. Moreover, it also provides information about subnet membership changes (e.g, when a node joins a subnet it will not contribute blocks until it has finished state sync). The tooling retrieves the metrics from all subnets in parallel to reduce the amount of time needed to fetch them.</p><p>All data is retrieved through update calls in order to prevent a potentially malicious node from providing false data. Typically, it takes under 10 seconds to collect the most recent metrics from all 37 subnets. The metrics can then be stored in a local file in JSON format, and be further analyzed by other tools.</p><p>See <a href="https://dfinity.github.io/dre/trustworthy-metrics/trustworthy-metrics.html" target="_blank" rel="noopener noreferrer">https://dfinity.github.io/dre/trustworthy-metrics/trustworthy-metrics.html</a> for more information.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="a-gateway-to-more-milestones">A gateway to more milestones<a href="#a-gateway-to-more-milestones" class="hash-link" aria-label="Direct link to A gateway to more milestones" title="Direct link to A gateway to more milestones">​</a></h2><p>The ability to obtain trustworthy node metrics enables the next milestone in the transparency and operational efficiency of the Internet Computer. By providing clear insights into node performance, it lays the groundwork for decentralized data-driven decision making, and for future enhancements in node remuneration processes.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="further-reading">Further reading<a href="#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading">​</a></h2><ul><li><p><a href="https://dfinity.github.io/dre/trustworthy-metrics/trustworthy-metrics.html" target="_blank" rel="noopener noreferrer">Fetch trustworthy node metrics</a>.</p></li><li><p><a href="https://forum.dfinity.org/t/trustworthy-node-metrics-for-useful-work/22989" target="_blank" rel="noopener noreferrer">Join the discussion</a>.</p></li><li><p><a href="https://internetcomputer.org/node-providers" target="_blank" rel="noopener noreferrer">More about nodes on the Internet Computer</a>.</p></li></ul>]]></content>
        <author>
            <name>DFINITY</name>
        </author>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 7, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/02/07/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/02/07/news-and-updates/update"/>
        <updated>2024-02-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to announce new 'Hello, world' examples, some huge developer documentation updates, and a new community demo showcasing ETH and ICP.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="February 7 2024" src="/assets/images/dev-update-blog-feb-7-5c375cb43cfa795e416699d5f6460759.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we're excited to talk about the official 'soft' launch of <code>dfxvm</code>, the launch of the EVM RPC canister, and a new community-driven course called DAO Adventure. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfxvm-official-soft-launch"><code>dfxvm</code> official soft launch!<a href="#dfxvm-official-soft-launch" class="hash-link" aria-label="Direct link to dfxvm-official-soft-launch" title="Direct link to dfxvm-official-soft-launch">​</a></h2><p>The official dfx version manager tool known as <code>dfxvm</code> has beet an officially launched! <code>dfxvm</code> is designed to act like <code>rustup</code> but for <code>dfx</code>. It allows you to download, switch between, and manage different versions of <code>dfx</code> between projects. <code>dfxvm</code> is considered as a 'soft launch', meaning that it's available for download and use, but the <code>dfx</code> installation script still downloads and installs <code>dfx</code> as it has in the past. Soon, it will be updated to use <code>dfxvm</code> instead.</p><p>You can install <code>dfxvm</code> with the command:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">sh -ci "$(curl -fsSL https://raw.githubusercontent.com/dfinity/sdk/dfxvm-install-script/install.sh)"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>We'd love to hear your feedback about <code>dfxvm</code> on the <a href="https://forum.dfinity.org/t/introducing-the-dfx-version-manager/27408" target="_blank" rel="noopener noreferrer">forum post announcing the launch</a>, and you can contribute to the open source <a href="https://github.com/dfinity/dfxvm" target="_blank" rel="noopener noreferrer"><code>dfxvm</code> repo</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="evm-rpc-canister">EVM RPC canister<a href="#evm-rpc-canister" class="hash-link" aria-label="Direct link to EVM RPC canister" title="Direct link to EVM RPC canister">​</a></h2><p>This week, the EVM RPC canister has been launched! This canister provides the ability for ICP canisters to integrate with Ethereum smart contracts by making calls to the Ethereum JSON-RPC API! This integration allows for ICP canisters to use Ethereum data, such as block, transaction, account, or gas price information.</p><p>The key feature of this canister is that the API keys are managed within the canister on your behalf, meaning there is no need for you to go to an RPC provider such as Alchemy or CloudFlare and obtain an API key and manage it.</p><p>You can learn more about the <a href="/building-apps/chain-fusion/ethereum/evm-rpc/evm-rpc-canister">EVM RPC canister in the documentation</a>, including how to use it in your project!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dao-adventure-build-a-dao-in-7-days">DAO Adventure: Build a DAO in 7 days!<a href="#dao-adventure-build-a-dao-in-7-days" class="hash-link" aria-label="Direct link to DAO Adventure: Build a DAO in 7 days!" title="Direct link to DAO Adventure: Build a DAO in 7 days!">​</a></h2><p>A new Motoko bootcamp has been announced. This new bootcamp will focus on starting out at zero and within 7 days, developers will build an entire DAO! This bootcamp will include:</p><ul><li><p>5 guided Motoko projects.</p></li><li><p>A video series to accompany the projects.</p></li><li><p>Access to the Motoko Bootcamp community to ask questions and chat with other devs.</p></li><li><p>Access to weekly workshops and monthly bootcamps for additional support and advanced topics.</p></li></ul><p>Want to learn more? Check out the <a href="https://forum.dfinity.org/t/announcing-the-dao-adventure-build-a-dao-in-7-days/27218" target="_blank" rel="noopener noreferrer">forum post announcing this bootcamp</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The EVM RPC canister beta is live!]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/evm-rpc-canister-launch</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/evm-rpc-canister-launch"/>
        <updated>2024-02-06T00:20:10.000Z</updated>
        <summary type="html"><![CDATA[The EVM RPC canister allows you to integrate your canisters with Ethereum smart contracts.]]></summary>
        <content type="html"><![CDATA[<img loading="lazy" src="/img/blog/evm-rpc-canister.webp" alt="EVM RPC Canister image" width="300" class="img_ev3q"><h1>Summary</h1><p>Today we're excited to announce that the
<a href="https://github.com/internet-computer-protocol/evm-rpc-canister/releases/tag/release-2024-01-31" target="_blank" rel="noopener noreferrer">EVM RPC canister</a>
is now available for use! It is currently in beta, and will be while we iron out
any kinks to ensure that it meets all the demands of your dapps safely and
performantly. Test it out yourself and let us know if you run into any issues by
either
<a href="https://github.com/internet-computer-protocol/evm-rpc-canister/issues/new" target="_blank" rel="noopener noreferrer">opening up an issue on GitHub</a>
or submitting feedback on the
<a href="https://dx.internetcomputer.org" target="_blank" rel="noopener noreferrer">ICP Feedback Board</a>.</p><div class="flex flex-row gap-2"><a href="https://github.com/internet-computer-protocol/evm-rpc-canister" target="_blank" rel="noopener noreferrer" class="button button-outline bg-black text-white">View on GitHub</a><a class="button button-primary" href="/building-apps/chain-fusion/ethereum/evm-rpc/evm-rpc-canister">View the documentation</a></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-is-it">What is it?<a href="#what-is-it" class="hash-link" aria-label="Direct link to What is it?" title="Direct link to What is it?">​</a></h2><p>The EVM RPC canister is a service that lets you easily build integrations
between ICP canister smart contracts and Ethereum smart contracts. It simplifies
the process of procuring, managing, and paying for API keys for various
<a href="https://www.alchemy.com/best/rpc-node-providers" target="_blank" rel="noopener noreferrer">EVM RPC providers</a>. It also
helps keep dapps secure by automatically inferring consensus among multiple RPC
providers with each outbound request.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="the-problem">The problem<a href="#the-problem" class="hash-link" aria-label="Direct link to The problem" title="Direct link to The problem">​</a></h2><p>Building an integration between a canister and the Ethereum network currently
requires the use of HTTPS outcalls. These calls are facilitated by services
(often called RPC node providers) that require the use of subscription-based API
keys. This presents developers with a few non-trivial challenges:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="management-of-api-keys">Management of API keys<a href="#management-of-api-keys" class="hash-link" aria-label="Direct link to Management of API keys" title="Direct link to Management of API keys">​</a></h3><p>RPC providers for Ethereum typically charge a subscription-based fee in order to
use their services. While some offer free tiers, the quotas can be exhausted
quickly in a production setting.</p><p>Furthermore, it is not straightforward to manage an API key (let alone multiple)
in the context of a canister. There are a number of challenges to overcome:</p><ul><li><p>How do you ensure that a single developer managing API keys does not pose a
centralization risk to the users of the dapp?</p></li><li><p>What if you just want to kick the tires?</p></li><li><p>What if you want to build something quickly?</p></li><li><p>How do you keep your API keys secret?</p></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cost-complexity-and-consensus">Cost, complexity, and consensus<a href="#cost-complexity-and-consensus" class="hash-link" aria-label="Direct link to Cost, complexity, and consensus" title="Direct link to Cost, complexity, and consensus">​</a></h3><p>The problem is further compounded if we start to take cost into account. There
are a number of factors that go into the calculation a developer makes when
deciding to build something:</p><ul><li><p>How much engineering effort will this take?</p></li><li><p>How much do I need to pay for third-party services (e.g. Ethereum RPC
providers)?</p></li><li><p>How important is trust and security to my users?</p></li></ul><p>If managing API keys independently, the total cost begins to balloon as usage
scales and the need for additional layers of consensus becomes more important -
the latter requires querying multiple RPC providers, which each require an
individual subscription, API key, management, etc.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-the-evm-rpc-canister-solves">What the EVM RPC canister solves<a href="#what-the-evm-rpc-canister-solves" class="hash-link" aria-label="Direct link to What the EVM RPC canister solves" title="Direct link to What the EVM RPC canister solves">​</a></h2><p>The EVM RPC canister abstracts away much of the complexity around managing keys
and querying the Ethereum network for blocks, transactions, and other data with
an easy to use, onchain API. It performs automatic consensus inference by
sending requests to multiple providers in parallel and ensuring the responses
agree. It also lets you send requests to other EVM chains through a generic
<code>request</code> interface. Overall, it simplifies what you as a developer need to
think about when setting up your Ethereum integrations.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-to-use">How to use<a href="#how-to-use" class="hash-link" aria-label="Direct link to How to use" title="Direct link to How to use">​</a></h2><p>Below is a quick start to getting an integration with the EVM RPC canister up
and running. It's a simplified example that omits many complexities, but
hopefully it still shows you how easy it is to get started.</p><div class="admonition_WoCw admonitionInfo_zoGt"><p>Please ensure you <a href="/building-apps/getting-started/install">install</a> <code>dfx</code> before proceeding with the steps below.</p><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="24" height="24" rx="12" fill="#29ABE2"></rect><g clip-path="url(#a)"><path d="M12 5.333A6.674 6.674 0 0 1 18.667 12 6.674 6.674 0 0 1 12 18.667 6.674 6.674 0 0 1 5.333 12 6.674 6.674 0 0 1 12 5.333ZM12 4a8 8 0 1 0 0 16 8 8 0 0 0 0-16Zm0 3.833a.834.834 0 1 1-.001 1.669.834.834 0 0 1 0-1.669ZM13.332 16h-2.666v-.667c.322-.119.666-.134.666-.49v-2.978c0-.356-.344-.412-.666-.531v-.667h2v4.177c0 .357.344.372.666.49V16Z" fill="#fff"></path></g><defs><clipPath id="a"><path fill="#fff" transform="translate(4 4)" d="M0 0h16v16H0z"></path></clipPath></defs></svg></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="start-a-new-project">Start a new project<a href="#start-a-new-project" class="hash-link" aria-label="Direct link to Start a new project" title="Direct link to Start a new project">​</a></h3><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx new evm_rpc_example</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:#29ABE2">cd</span><span class="token plain"> evm_rpc_example</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="add-the-evm-rpc-canister-as-a-dependency">Add the EVM RPC canister as a dependency<a href="#add-the-evm-rpc-canister-as-a-dependency" class="hash-link" aria-label="Direct link to Add the EVM RPC canister as a dependency" title="Direct link to Add the EVM RPC canister as a dependency">​</a></h3><p>Using <code>dfx deps</code> we can automatically install the EVM RPC canister wasm into our
local environment.</p><p>Edit the <code>dfx.json</code> file at the root of your project to add the EVM RPC canister
as a dependency under the "canisters" key:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"canisters"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"evm_rpc"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"pull"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"7hfb6-caaaa-aaaar-qadga-cai"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"defaults"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"build"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"args"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">""</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"packtool"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"output_env_file"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">".env"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Next, from your terminal, run the following command to fetch all dependencies:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx deps pull</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Start the local development environment:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx start --clean --background</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Set the init args for the EVM RPC canister:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx deps init evm_rpc --argument </span><span class="token string" style="color:#F68E5F">'(record { nodesInSubnet = 31 })'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Locally deploy the <code>evm_rpc</code> canister:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx deps deploy evm_rpc</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Now, use <code>dfx</code> to get the current Ethereum gas price:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx canister call evm_rpc request </span><span class="token string" style="color:#F68E5F">'(variant {Custom=record {url="https://ethereum.publicnode.com"}},"{\"jsonrpc\":\"2.0\",\"method\":\"eth_gasPrice\",\"params\":[],\"id\":1}",1000)'</span><span class="token plain"> --wallet </span><span class="token variable" style="color:#EB318A">$(</span><span class="token variable" style="color:#EB318A">dfx identity get-wallet</span><span class="token variable" style="color:#EB318A">)</span><span class="token plain"> --with-cycles </span><span class="token number">1000000000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The response:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">variant </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"> Ok </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"{</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">id</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">:1,</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">jsonrpc</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">:</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">2.0</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">,</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">result</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">:</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">0x8ca25b481</span><span class="token string entity" style="color:#F68E5F">\"</span><span class="token string" style="color:#F68E5F">}"</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="raw-rpc">Raw RPC<a href="#raw-rpc" class="hash-link" aria-label="Direct link to Raw RPC" title="Direct link to Raw RPC">​</a></h4><p>You might be asking why the gas price is returned as a hex value. This endpoint
was reached using the generic <code>request</code> method expose by the EVM RPC canister.
This endpoint does not offer the same conveniences as the typed Candid RPC
endpoints, nor does it perform automatic consensus inference. This method is
exposed primarily to give you access to any Ethereum RPC API method in case the
typed Candid RPC endpoints are not sufficient.</p><div class="admonition_WoCw admonitionInfo_zoGt"><p>In the coming months, more tooling and improvements to the EVM RPC canister are expected to be released that will make it much easier to process raw Ethereum RPC data.</p><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="24" height="24" rx="12" fill="#29ABE2"></rect><g clip-path="url(#a)"><path d="M12 5.333A6.674 6.674 0 0 1 18.667 12 6.674 6.674 0 0 1 12 18.667 6.674 6.674 0 0 1 5.333 12 6.674 6.674 0 0 1 12 5.333ZM12 4a8 8 0 1 0 0 16 8 8 0 0 0 0-16Zm0 3.833a.834.834 0 1 1-.001 1.669.834.834 0 0 1 0-1.669ZM13.332 16h-2.666v-.667c.322-.119.666-.134.666-.49v-2.978c0-.356-.344-.412-.666-.531v-.667h2v4.177c0 .357.344.372.666.49V16Z" fill="#fff"></path></g><defs><clipPath id="a"><path fill="#fff" transform="translate(4 4)" d="M0 0h16v16H0z"></path></clipPath></defs></svg></div><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="candid-rpc">Candid RPC<a href="#candid-rpc" class="hash-link" aria-label="Direct link to Candid RPC" title="Direct link to Candid RPC">​</a></h4><p>Let's see what it looks like to call a typed Candid RPC method.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx canister call evm_rpc eth_getTransactionCount </span><span class="token string" style="color:#F68E5F">'(variant {EthMainnet = opt vec {variant {Cloudflare}}}, null, record {address = "0xdAC17F958D2ee523a2206206994597C13D831ec7"; block = variant {Latest}})'</span><span class="token plain"> --with-cycles </span><span class="token number">1000000000</span><span class="token plain"> --wallet</span><span class="token operator">=</span><span class="token variable" style="color:#EB318A">$(</span><span class="token variable" style="color:#EB318A">dfx identity get-wallet</span><span class="token variable" style="color:#EB318A">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Here, we call the <code>eth_getTransactionCount</code> method using Cloudflare as a
provider. This will return the number of transactions for the given contract
(i.e. address <code>0xdAC17F958D2ee523a2206206994597C13D831ec7</code>)</p><p>We get back the following, which tells us there is one transaction:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">variant </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"> Consistent </span><span class="token operator">=</span><span class="token plain"> variant </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"> Ok </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token builtin class-name" style="color:#29ABE2">:</span><span class="token plain"> nat </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bonus">Bonus<a href="#bonus" class="hash-link" aria-label="Direct link to Bonus" title="Direct link to Bonus">​</a></h2><p>The indomitable @rvanasa put together a small example that shows how to call the
EVM RPC canister from a Motoko canister. Check it out:
<a href="https://github.com/rvanasa/vite-react-motoko/tree/evm-rpc" target="_blank" rel="noopener noreferrer">Motoko EVM RPC</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2><p>The EVM RPC canister is designed to help you build integrations with Ethereum
smart contracts quickly, easily, and in a cost-effective manner. While it is
still early (and there are many improvements to come), this is a good chance to
get ahead and build slick ICP cross-chain dapps!</p><p>If you have any feedback, or feel that the EVM RPC canister is missing any
features or functionality, please write on
<a href="https://github.com/internet-computer-protocol/evm-rpc-canister" target="_blank" rel="noopener noreferrer">GitHub</a>, on the
<a href="https://forum.dfinity.org" target="_blank" rel="noopener noreferrer">Developer Forum</a>, or on the
<a href="https://dx.internetcomputer.org" target="_blank" rel="noopener noreferrer">Feedback Board</a>.</p><p>Looking forward to your comments!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="credits">Credits<a href="#credits" class="hash-link" aria-label="Direct link to Credits" title="Direct link to Credits">​</a></h2><p>This project would not have been possible without all the hard work and tireless
dedication from a truly world-class team. Big thank you to Manu, Thomas,
Grégory, and most of all Ryan for their contributions to this project. Ryan
really put his heart into this project and it shows. Thank you, Ryan!</p>]]></content>
        <author>
            <name>DFINITY</name>
        </author>
        <category label="Technology" term="Technology"/>
        <category label="Cross-chain" term="Cross-chain"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Improving query execution latencies]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/improving-query-latencies</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/improving-query-latencies"/>
        <updated>2024-02-05T21:53:29.000Z</updated>
        <summary type="html"><![CDATA[The improved in-replica caching reduces query execution latencies on the Internet Computer.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Improving query execution latencies" src="/assets/images/query-latency-c58cce56b7b39dd41ef33828cfde2db1.webp" width="1400" height="700" class="img_ev3q"></p><p><em>This article was originally published on the DFINITY Medium blog <a href="https://medium.com/dfinity/improving-query-latencies-f5bb2bc019dd" target="_blank" rel="noopener noreferrer">here</a> by Andriy Berestovskyy.</em></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="background">Background<a href="#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2><p>The Internet Computer can host a full dapp — frontend, backend, and data. Users can deploy their dapp as a canister (smart contract).</p><p>Just like HTTP <code>POST</code> and <code>GET</code> methods, the Internet Computer Protocol supports two types of messages: updates and queries. An update message is executed on all subnet nodes and persists canister state changes. A query message discards state changes and typically runs on a single node.</p><p>Web caching is a well-known technique to accelerate requests and reduces peak server load. However, the common caching challenge is data consistency, and the decentralized Web3 world raises the bar even higher.</p><p>Keep on reading to find out how the Internet Computer implements in-replica query caching.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="query-cache-properties">Query cache properties<a href="#query-cache-properties" class="hash-link" aria-label="Direct link to Query cache properties" title="Direct link to Query cache properties">​</a></h2><p>The Internet Computer implements an in-replica query cache with the following features:</p><ol><li><strong>Transparency:</strong> the cache is completely transparent, there is no need to worry about cache validity, max age etc.</li><li><strong>LRU cache replacement policy:</strong> the query cache discards least recently used (LRU) entries first. On a cache hit into a valid entry, that entry becomes the most recently used. Entries that remain unused for some time become less recently used and are eventually evicted from the cache.</li><li><strong>Cache validity:</strong> the implementation ensures that, for a given replicated state, any valid cache entry contains the most up-to-date result of query execution.</li></ol><p><strong>Cache validity is the main challenge</strong> of the query cache implementation, so let’s delve further!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cache-invalidation-factors">Cache invalidation factors<a href="#cache-invalidation-factors" class="hash-link" aria-label="Direct link to Cache invalidation factors" title="Direct link to Cache invalidation factors">​</a></h2><p>Cache validity means that a cached result matches the result of actual query execution.</p><p>The query cache is a key-value map, where each key is a tuple of <code>(source, receiver, method, payload)</code> and value is a result of the query execution. A cache hit happens when all 4 key components match.</p><p>But even if there is a hit, is the cached result still up-to-date? The result might become stale after:</p><ol><li><strong>State changes:</strong> update calls or canister upgrades alter the state, so the cached result is no longer up-to-date.</li><li><strong>Cycle balance and system time:</strong> the canister is periodically charged for the CPU and memory resources, execution, ingress messages, etc. The query might take a different execution path based on a specific balance level or at a particular point in time. Therefore, if the canister balance or system time changes, the cache entry becomes stale.</li></ol><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token attribute attr-name" style="color:#F8F8F2">#[query]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">event_started</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token class-name">String</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">if</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">ic_cdk</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token namespace" style="color:#26D76D">api</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">time</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token constant" style="color:#29ABE2">EVENT_START_TIME</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token class-name">Some</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"The new event has started!"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token class-name">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Given that many changing factors and the live data freshness property, the data might become stale too quickly to achieve high query cache efficiency. In fact, the initial implementation of the query cache released in May 2023 was just that.</p><p>The cache hit ratio of the initial version was about 10%. Most of the time, <strong>the cache was invalidated due to cycle balance and system time changes.</strong> Is there room for improvement?</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="improving-cache-invalidations">Improving cache invalidations<a href="#improving-cache-invalidations" class="hash-link" aria-label="Direct link to Improving cache invalidations" title="Direct link to Improving cache invalidations">​</a></h2><p>One way to improve cache invalidations is to determine whether the query execution depends on the cycle balance and system time:</p><ol><li><strong>Query execution does not modify the blockchain state:</strong> this Internet Computer property enables executing queries in any order and cache the result of their execution.</li><li><strong>Query execution is deterministic:</strong> the result of the execution is always the same, provided the same state, cycles balance, and system time. This property is also crucial for query caching.</li><li><strong>Tracking query execution:</strong> the system can monitor if the query attempted to read the current cycle balance or system time.</li><li><strong>Ignoring cache invalidations:</strong> since most queries never read the balance and time, their cached result remains valid even when the balance or time changes.</li></ol><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="results">Results<a href="#results" class="hash-link" aria-label="Direct link to Results" title="Direct link to Results">​</a></h2><p>With the query execution tracking, the cache hit ratio has increased from around 10% to 50%:</p><p><img loading="lazy" alt="Results" src="/assets/images/query-graph-ca4d62096c510bfb64443dc7ca2f9f7c.webp" width="1400" height="596" class="img_ev3q"></p><p>Also, the median query latency is also improved from around 1.2ms down to 0.4ms. When the cache hit ratio reaches above 50%, the median goes down to just 0.1ms:</p><p><img loading="lazy" alt="Results 2" src="/assets/images/query-results2-4dfe428ea3d398d26300ecbc23da3b3a.webp" width="1400" height="596" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="takeaways-how-to-improve-query-latencies">Takeaways: How to improve query latencies?<a href="#takeaways-how-to-improve-query-latencies" class="hash-link" aria-label="Direct link to Takeaways: How to improve query latencies?" title="Direct link to Takeaways: How to improve query latencies?">​</a></h2><p>Developers can improve cache efficiency of their queries even more by following these tips.</p><ol><li>Avoid unnecessary calls to the time() and balance() System APIs:</li></ol><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token attribute attr-name" style="color:#F8F8F2">#[query]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">status</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">String</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u64</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token constant" style="color:#29ABE2">STATUS</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">clone</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace" style="color:#26D76D">ic_cdk</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token namespace" style="color:#26D76D">api</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">time</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// ← this is BAD for caching!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ol start="2"><li>Try to move the System API calls to places where they are actually used:</li></ol><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token attribute attr-name" style="color:#F8F8F2">#[query]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">ready_time</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u64</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> now </span><span class="token operator">=</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">ic_cdk</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token namespace" style="color:#26D76D">api</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">time</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"> </span><span class="token comment" style="color:#707070">// ← this is BAD for caching!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:#EB318A">if</span><span class="token plain"> </span><span class="token constant" style="color:#29ABE2">STATUS</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">is_ready</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// The `time()` should be called here, when the STATUS is ready.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token class-name">Some</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">now</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token class-name">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The new functionality is transparent and available on all the subnets and local development environments.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><ul><li><p><a href="https://github.com/dfinity/ic/" target="_blank" rel="noopener noreferrer">Source code of the Internet Computer query cache implementation</a></p></li><li><p><a href="/references/ic-interface-spec#synchronicity-across-nodes">The Internet Computer interface specification: Synchronicity across nodes</a></p></li></ul>]]></content>
        <author>
            <name>Andriy Berestovskyy</name>
        </author>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 31, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/31/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/31/news-and-updates/update"/>
        <updated>2024-01-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to announce new 'Hello, world' examples, some huge developer documentation updates, and a new community demo showcasing ETH and ICP.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 31 2024" src="/assets/images/dev-update-blog-jan-31-521a86d111c65dabb08f26892b743c89.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we're excited to announce new 'Hello, world' examples, some huge developer documentation updates, and a new community demo showcasing ETH and ICP. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-hello-world-examples">New 'Hello, world!' examples<a href="#new-hello-world-examples" class="hash-link" aria-label="Direct link to New 'Hello, world!' examples" title="Direct link to New 'Hello, world!' examples">​</a></h2><p>Ready to get started developing on ICP? The 'ICP Hello, world!' example templates for Motoko and Rust have been updated! Updates to these templates include:</p><ul><li><p>The ability to run either template in <a href="https://gitpod.io/#https://github.com/dfinity/icp-hello-world-motoko" target="_blank" rel="noopener noreferrer">Gitpod</a> or <a href="https://codespaces.new/dfinity/icp-hello-world-motoko?quickstart=1" target="_blank" rel="noopener noreferrer">Github workspaces</a>, meaning there is no need to download dfx or setup a local environment.</p></li><li><p><a href="/building-apps/test/pocket-ic">PocketIC</a> for unit testing, allowing you to simulate deployment on the mainnet for an enhanced developer workflow.</p></li></ul><p>You can check out the <a href="https://github.com/dfinity/icp-hello-world-motoko/" target="_blank" rel="noopener noreferrer">Motoko repo</a> or <a href="https://github.com/dfinity/icp-hello-world-rust" target="_blank" rel="noopener noreferrer">Rust repo</a> to get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="documentation-updates">Documentation updates<a href="#documentation-updates" class="hash-link" aria-label="Direct link to Documentation updates" title="Direct link to Documentation updates">​</a></h2><p>The developer documentation has received some huge updates this past week! These updates are intended to enhance, optimize, and improve the developer onboarding experience. The primary focus has been on improving the documentation that developers would interact with when approaching ICP for the first time.</p><p>The most notable of these updates is the newly reformatted top and side navigation bars. Additionally, the UI has been updated to include divider bars in the side navigation menu to help separate different categories and be more visually appealing. Here is a before and after:</p><p><img loading="lazy" alt="Docs before" src="/assets/images/docs-before-fb7dfc052f21eae8d662229ce7c30569.png" width="3412" height="1800" class="img_ev3q"></p><p><img loading="lazy" alt="Docs after" src="/assets/images/docs-after-3c686e3cf39b24711bd87e1631210abc.png" width="3418" height="1802" class="img_ev3q"></p><p>UI changes aren't the only new updates, though. There are a handful of brand new documentation pages, such as:</p><ul><li><p><a href="/building-apps/developing-canisters/write">Hello, world! Getting started guide</a>.</p></li><li><p><a href="/building-apps/getting-started/identities">Creating a developer account</a>.</p></li><li><p><a href="https://docs.bitfinity.network/" target="_blank" rel="noopener noreferrer">Introduction to Solidity smart contracts</a>.</p></li></ul><p>These changes mark a half-way point in the overarching 'Developer Documentation Accelerator project'. The second half of this project will focus on adding more new documentation pages, so expect some additional updates coming soon!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-eth--icp-demo">New ETH + ICP demo<a href="#new-eth--icp-demo" class="hash-link" aria-label="Direct link to New ETH + ICP demo" title="Direct link to New ETH + ICP demo">​</a></h2><p>A new community-contributed demo showcasing how ETH and ICP can work together in a single dapp. This new demo showcases how users can sign into an ICP canister with Ethereum and create a 1:1 link between their ETH address and ICP principal.</p><p>Want to try it out? <a href="https://shtr2-2iaaa-aaaal-qckva-cai.icp0.io/" target="_blank" rel="noopener noreferrer">Check out the demo canister</a> and read more about it on the <a href="https://forum.dfinity.org/t/ic-siwe-sign-in-with-ethereum-support-libraries-for-ic/25306" target="_blank" rel="noopener noreferrer">forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 24, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/24/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/24/news-and-updates/update"/>
        <updated>2024-01-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we'll talk about a new version of the ICP JavaScript agent, a new developer documentation series, and an important update to the replica.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 24 2024" src="/assets/images/dev-update-blog-jan-24-abe02d7ede3ab791fafbe79b3600fc2d.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we'll talk about a new version of the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a>, a new developer documentation series, and an important update to the replica. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-javascript-agent-v0212">ICP JavaScript agent v0.21.2<a href="#icp-javascript-agent-v0212" class="hash-link" aria-label="Direct link to ICP JavaScript agent v0.21.2" title="Direct link to ICP JavaScript agent v0.21.2">​</a></h2><p>This week, a new version of the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> has been released! In this release, there are several new features, such as:</p><ul><li><p>Introducing <code>PartialIdentity</code> export, allowing you to use @dfinity/identity in @dfinity/auth-client and delegate any public key without the full key pair in the agent.</p></li><li><p>Replacing the <code>secp256k1</code> npm package with <code>@noble/curves</code>.</p></li><li><p><code>github.dev</code> and <code>gitpod.io</code> have been added as known hosts.</p></li></ul><p>This release also includes several bug fixes, such as:</p><ul><li><p>Fix for running audit.</p></li><li><p>Honoring the <code>disableIdle</code> flag.</p></li><li><p>Limiting the delegation depth of <code>read_state</code> certificates to 1.</p></li></ul><p>For more information, read the <a href="https://github.com/dfinity/agent-js/releases/tag/v0.21.2" target="_blank" rel="noopener noreferrer">full release notes</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="hackathon-prep-course-series">Hackathon prep course series<a href="#hackathon-prep-course-series" class="hash-link" aria-label="Direct link to Hackathon prep course series" title="Direct link to Hackathon prep course series">​</a></h2><p>A new tutorial series has been published in the dev docs! This series is designed to act as preparatory materials for hackathon participants, giving them a crash-course style for developing on ICP and kickstarting their hackathon projects!</p><p>This series contains the modules:</p><ul><li><p><a href="/tutorials/hackathon-prep-course/what-is-icp">1: What is the Internet Computer?</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/deploying-first-fullstack-dapp">2: Deploying your first fullstack dapp</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/exploring-the-backend">3: Exploring the backend</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/exploring-the-frontend">4: Exploring the frontend</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/integrating-with-tokens">5: Integrating with tokens</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/authentication">6: Authentication</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/obtaining-cycles">7: Obtaining cycles</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/managing-canisters">8: Managing canisters</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/sample-starter-projects">9: Sample starter projects</a>.</p></li><li><p><a href="/tutorials/hackathon-prep-course/resources">10: Resources to learn more</a>.</p></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="latest-replica-version">Latest replica version<a href="#latest-replica-version" class="hash-link" aria-label="Direct link to Latest replica version" title="Direct link to Latest replica version">​</a></h2><p>The latest version of the IC replica contains an important update that enables P2P implementation for t-ECDSA and HTTPS outcalls! The following technological improvements are included in this update:</p><ul><li><p>Replicas are guaranteed not to crash due to unbounded memory growth.</p></li><li><p>Congestion control is fair, meaning that messages from one peer should not be favored over messages from another.</p></li><li><p>No head-of-line blocking delays.</p></li><li><p>Replication latency has been reduced by pushing small artifacts less than 1KB.</p></li></ul><p>This update lays the groundwork for future improvements to the finalization rate of the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus</a> protocol, meaning faster interaction with dapps.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 17, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/17/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/17/news-and-updates/update"/>
        <updated>2024-01-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're going to talk about the upcoming SNS developer office hours, the scalability and performance working group, and the new Cycle.Express tool for topping up canisters with fiat currency!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 17 2024" src="/assets/images/dev-update-blog-jan-17-b468e2fc173114ae652ff25cde13804d.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we're going to talk about the upcoming SNS developer office hours, the scalability and performance working group, and the new Cycle.Express tool for topping up canisters with fiat currency! Let's get started.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sns-office-hours">SNS office hours<a href="#sns-office-hours" class="hash-link" aria-label="Direct link to SNS office hours" title="Direct link to SNS office hours">​</a></h2><p>Last fall, the SNS office hours began as a regular, reoccurring meeting group for developers to ask questions about how to create and manage an SNS, while also providing feedback to the DFINITY team about the SNS process. This year, the SNS office hours are resuming in a new format. </p><p>In this new format, developers are asked to submit their questions before the session starts so that the team can best prepare answers to the community's questions. The following process will be used:</p><ul><li><p>SNS office hours will be every other Wednesday at 5PM CET / 8AM PST, beginning January 24, 2024.</p></li><li><p>Questions can be submitted using <a href="https://airtable.com/appnzpIOLS42Nqv6G/pagethaq2ZGIO5j9Y/form" target="_blank" rel="noopener noreferrer">this form</a>. Questions will be evaluated on Tuesday prior to the office hour session. </p></li></ul><p>You can learn more about the SNS office hours on the <a href="https://forum.dfinity.org/t/sns-office-hours-format-2024/26407" target="_blank" rel="noopener noreferrer">forum</a>, and you can subscribe to the weekly <a href="https://airtable.com/appnzpIOLS42Nqv6G/shrAtmnN4gOxcIuq3" target="_blank" rel="noopener noreferrer">calendar invitation</a> if you'd like to attend. </p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="scalability--performance-working-group">Scalability &amp; performance working group<a href="#scalability--performance-working-group" class="hash-link" aria-label="Direct link to Scalability &amp; performance working group" title="Direct link to Scalability &amp; performance working group">​</a></h2><p>The next meeting of the scalability and performance working group will be on Thursday, January 25, 2024 at 5:30 PM CET. The agenda for this meeting will be to provide an update on backup and restore features and functionality. </p><p>You can prepare for the group by reviewing the <a href="https://drive.google.com/drive/folders/1DADNPf7HJjgu2lzny7ZuzxT1VcVebqtI?usp=sharing" target="_blank" rel="noopener noreferrer">meeting notes for past sessions</a> or contributing to the <a href="https://forum.dfinity.org/t/technical-working-group-scalability-performance/14265" target="_blank" rel="noopener noreferrer">forum post</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cycleexpress">Cycle.Express<a href="#cycleexpress" class="hash-link" aria-label="Direct link to Cycle.Express" title="Direct link to Cycle.Express">​</a></h2><p>Obtaining and managing cycles has been a common pain point for developers onboarding into the ICP ecosystem. This process has now been made easier with a new tool: <a href="https://cycle.express/" target="_blank" rel="noopener noreferrer">Cycle.Express!</a>.</p><p>Cycle.Express provides developers with a way to top up their canisters with fiat money directly, rather than converting ICP into cycles and topping up the canister using those cycles. </p><p>Cycle.Express is a new tool, and feedback or suggestions are appreciated! You can provide them on the <a href="https://forum.dfinity.org/t/introduce-cycle-express-pay-credit-cards-to-get-cycles-at-steep-discount/25919" target="_blank" rel="noopener noreferrer">forum post</a> announcing this tool. </p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 10, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/10/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/10/news-and-updates/update"/>
        <updated>2024-01-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have an exciting new release of Motoko, some news regarding increasing canister smart contract memory, and a call for community input!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 10 2024" src="/assets/images/dev-update-blog-jan-10-0420090b44d2329c9d57ff118f879dc3.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers, and welcome to this week's developer weekly update! This week, we have an exciting new release of Motoko, some news regarding increasing canister smart contract memory, and a call for community input! Let's get started.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0104">Motoko v0.10.4<a href="#motoko-v0104" class="hash-link" aria-label="Direct link to Motoko v0.10.4" title="Direct link to Motoko v0.10.4">​</a></h2><p>This week, Motoko <code>v0.10.4</code> has been released! The release notes for this version are short, but for good reason: this Motoko update officializes the new incremental garbage collector after a successful beta testing phase! That's right, the incremental GC has officially been flagged for release outside of beta, meaning it is now regarded as safe for use in production. Some important notes about using the new incremental GC:</p><ul><li><p>Thoroughly test the upgrade: Be sure to take adequate measures to verify that the amount of stable data is supported when upgrading your canister. Utilize different data volumes and heap sizes to conservatively determine the amount of stable data supported by your program. </p></li><li><p>Monitor the heap size: Be sure to monitor memory size and heap size of your code in production.</p></li><li><p>Avoid large allocations per message: Avoid allocations of 100 MB or more per message, as they extend the duration of the GC's increment. Instead, distribute large allocations across multiple messages.</p></li><li><p>Limit the heap size: Set a custom limit within your program to keep the heap size and data volume below the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34576974172692-Evolution-Scaling" target="_blank" rel="noopener noreferrer">scalability</a> limit that you determined during testing.</p></li></ul><p>To review the full list of recommendations along with the full release details, see the Motoko release notes <a href="https://github.com/dfinity/motoko/releases/tag/0.10.4" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="increased-canister-smart-contract-memory">Increased canister smart contract memory<a href="#increased-canister-smart-contract-memory" class="hash-link" aria-label="Direct link to Increased canister smart contract memory" title="Direct link to Increased canister smart contract memory">​</a></h2><p>The DFINITY engineering team has announced that testing of canister stable memory has been successful for 400 GB of memory! There are plans to propose in an upcoming replica version to increase the stable memory limit from 96 GB to 400 GB. </p><p>You can read more or contribute your thoughts in the forum post <a href="https://forum.dfinity.org/t/increased-canister-smart-contract-memory/6148/173" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="request-for-community-input-short-videos">Request for community input: short videos!<a href="#request-for-community-input-short-videos" class="hash-link" aria-label="Direct link to Request for community input: short videos!" title="Direct link to Request for community input: short videos!">​</a></h2><p>Have a developer question that you'd like a short video explanation of? Kai from the SDK team is taking suggestions on questions to answer in a short-form video format. Ideally, the question can be answered in a short 60-second explanation, helping developers get quick, visual answers to some of their questions. Some examples are:</p><ul><li><p>"Should I use Motoko or Rust?"</p></li><li><p>"How do I create an Internet Identity?"</p></li><li><p>"What are threshold signatures?"</p></li></ul><p>You can find an example <a href="https://www.youtube.com/shorts/_AKZwwG6Z_k" target="_blank" rel="noopener noreferrer">here</a>, that answers the question, "How do you make sure a Principal is not anonymous? How would you execute this using II?"</p><p>You can leave your questions in the forum post <a href="https://forum.dfinity.org/t/video-short-suggestions/26368" target="_blank" rel="noopener noreferrer">here</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 3, 2024]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/03/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2024/01/03/news-and-updates/update"/>
        <updated>2024-01-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[To kick off the year, let's explore some of the upcoming features and tools that developers can look forward to in 2024!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="January 3 2024" src="/assets/images/dev-update-blog-jan-3-7e06264be043626f519335656455a3e8.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and happy New Year! To kick off the year, let's explore some of the upcoming features and tools that developers can look forward to in 2024!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-new-updates"><code>dfx new</code> updates<a href="#dfx-new-updates" class="hash-link" aria-label="Direct link to dfx-new-updates" title="Direct link to dfx-new-updates">​</a></h2><p><code>dfx new</code> is a core command used by developers to create new projects. By default, it uses a 'Hello, world!' template. Currently, this command doesn't support the ability to choose a different project template, CDK, or frontend framework. To offer a richer workflow for bootstrapping new projects, the <code>dfx new</code> command will be updated and reworked to enhance the developer experience. Part of this update will include the ability to choose between different project templates, languages, and frontend frameworks when creating a new project.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="version-manager-for-dfx">Version manager for dfx<a href="#version-manager-for-dfx" class="hash-link" aria-label="Direct link to Version manager for dfx" title="Direct link to Version manager for dfx">​</a></h2><p>When developers want to use different versions of dfx, the current workflow to switch between them can be tedious and time consuming. To make this process easier, a new dfx version manager tool is currently under development. The tool, known as <code>dfxvm</code>, will provide developers the ability to install and manage different versions of dfx seamlessly. It will also pave the way for supporting package manager installations of dfx in the future.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cycles-ledger">Cycles ledger<a href="#cycles-ledger" class="hash-link" aria-label="Direct link to Cycles ledger" title="Direct link to Cycles ledger">​</a></h2><p>To enhance and improve cycles management across projects, the upcoming cycles ledger will replace the current cycles wallet workflow. The current cycles wallet workflow is a common pain point for new developers, since it requires significant prerequisite knowledge to be used effectively. Once the cycles ledger has been released, dfx will use this new cycles ledger to simplify the cycles management workflow for developers deploying their dapps to the mainnet. The cycles wallet will still be maintained and available for developers to use if they prefer.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="canister-logging">Canister logging<a href="#canister-logging" class="hash-link" aria-label="Direct link to Canister logging" title="Direct link to Canister logging">​</a></h2><p>An important enhancement for canister debugging is on the way: logging for canisters deployed on the mainnet. This logging feature will support storing and retrieving logs to get detailed insights into the behavior of a project's canisters. Logging will support both canister and replica level information depending on the preferred detail level.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="streaming-support">Streaming support<a href="#streaming-support" class="hash-link" aria-label="Direct link to Streaming support" title="Direct link to Streaming support">​</a></h2><p>To support video hosting and streaming dapps, the asset canister will soon support streaming through content-range requests. For example, this support will include the ability for the HTML <code>&lt;video&gt;</code> tag to be used and the ability to seek or scrub the video playback. This will help pave the way for more types of applications to be deployed on ICP.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="rust-developer-liftoff-tutorial-series">Rust Developer Liftoff tutorial series<a href="#rust-developer-liftoff-tutorial-series" class="hash-link" aria-label="Direct link to Rust Developer Liftoff tutorial series" title="Direct link to Rust Developer Liftoff tutorial series">​</a></h2><p>To further build upon the ICP <a href="/tutorials/developer-liftoff/">Developer Liftoff tutorial series</a>, a new variation will be released this year in 2024 that focuses on Rust development rather than Motoko development. A Rust version has been highly requested by the ICP developer community, and we're excited to provide more resources for Rust development on ICP.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="documentation-additions">Documentation additions<a href="#documentation-additions" class="hash-link" aria-label="Direct link to Documentation additions" title="Direct link to Documentation additions">​</a></h2><p>In addition to a Rust variation of the Developer Liftoff, there are several other additions planned for the developer documentation, such as:</p><ul><li><p>Quick start guides for Python, TypeScript, C++, Solidity, and other languages to help onboard developers of all backgrounds.</p></li><li><p>Guides for Ethereum development on ICP, showcasing the upcoming EVM RPC canister and Ethereum integration.</p></li><li><p>Updates and additions to the Motoko documentation.</p></li><li><p>New tutorials, guides, and code examples.</p></li></ul><p>We hope you're all as excited for this year as we are! That'll wrap up this week's developer weekly update, be sure to tune in next week!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Developer relations]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-devrel</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-devrel"/>
        <updated>2024-01-02T19:01:19.000Z</updated>
        <summary type="html"><![CDATA[In this final interview, we sat down with the developer relations team, also known as the DevRel team, to learn more about their role in the ICP community.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Developer relations team spotlight" src="/assets/images/dev-update-blog-devrel-ab2474620be6a6dc812384391fcf4bdc.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome to the final installment of the Dev Blog's team spotlight series! In this final interview, we sat down with the developer relations team, also known as the DevRel team, to learn more about their role in the ICP community. </p><p><strong>To kick things off, what is the purpose of the DevRel team?</strong></p><p><em>DevRel is the abbreviation for Developer Relations. Our main goal is to nourish and grow a flourishing developer ecosystem.</em></p><p><strong>What is the composition of the DevRel team?</strong></p><p><em>We are a team of four engineers. Two of us are in Switzerland, one in Germany, and one in the US West Coast. We are part of the Growth team, and many activities are done in collaboration with the broader Growth team.</em></p><p><strong>The goal of nourishing and growing the ICP ecosystem must include several different activities and tasks. More specifically, what is the DevRel team responsible for? How does it interact with the ICP developers and community?</strong></p><p><em>We are at the pulse of the developer community, and this has many facets. Our goal is to attract new promising developers and teams to ICP, understand their needs and pain points, and help them build and be successful.</em></p><p><em>A main vehicle to support  developers in the initial stages is the DFINITY Developer Grants program, which allows us to provide some financial support, but more importantly regular touch points with the teams to help them build and grow.</em></p><p><em>We are active on many communication platforms like the ICP Developer Discord and the DFINITY Forum, but also on (crypto) X, as well as OpenChat or new platforms like Farcaster. We run weekly Office Hours on Discord, are coordinating Technical Working Groups, organize Hackathons and Workshops, and create and aggregate resources for developers.</em></p><p><strong>While interacting with the community in so many different ways, what are some of the challenges that the team faces?</strong></p><p><em>The Internet Computer is a general purpose and powerful computing platform. Hence, the ecosystem and applications are wide ranging with many different needs and requirements.</em></p><p><em>Furthermore, the Internet Computer becomes ever more powerful as we are always adding new capabilities on top of it. This <!-- -->[past]<!-- --> year, e.g., the SNS, vetKeys (Phase 1) and ckETH was launched. Each of these capabilities are essentially products on their own, and we need to understand them well to help teams use them effectively.</em></p><p><em>These challenges are very exciting and fun but still, well, challenging. :)</em></p><p><strong>What is something important about developing on ICP that new developers should know?</strong></p><p><em>The Internet Computer is a powerful but very nascent computing platform. New developers often come with a specific frame of reference to the IC. Either they are coming from a blockchain platform like Ethereum or they come from a traditional web development background. So, don’t get frustrated too early, it’s definitely worth it.</em></p><p><strong>You've mentioned that one responsibility of the DevRel team is to aggregate resources for developers. What are some of those resources that are available for the ICP community?</strong></p><p><em>The main landing page for developers is <a href="https://docs.internetcomputer.org/" target="_blank" rel="noopener noreferrer">https://docs.internetcomputer.org/</a> which is the entry point to our developer documentation. In addition, we curate developer resources at <a href="https://github.com/dfinity/awesome-internet-computer" target="_blank" rel="noopener noreferrer">Awesome Internet Computer</a>, and with the <a href="https://dfinityorg.notion.site/ICP-Hackathon-Cheat-Sheet-b2921239266149de81021412f572351c" target="_blank" rel="noopener noreferrer">ICP Hackathon Cheatsheet</a>. Furthermore, we are currently working on an aggregation of all educational resources available in the ICP ecosystem, which should go live in January 2024.</em></p><p><strong>How does the DevRel team work with other teams?</strong></p><p><em>We work closely with the Product and R&amp;D teams to help them understand and prioritize the pain points and requirements of the developer ecosystem. We collaborate with the Marketing &amp; Global Adoption team on events and the creation of educational resources, and support the Partnerships team with the technical onboarding of new partners.</em></p><p><strong>What primary project is the DevRel team currently working on?</strong></p><p><em>We are working on a revamp of the Developer Grants program. First, we want to increase transparency and community involvement. Therefore, we start with making the grant proposals for micro grants (USD 5k) public in the Developer Forum, and invite experienced community members to contribute reviews of the proposals. Furthermore, we will put more emphasis on targeted Requests for Proposals (RFPs) and Bounties to focus the grants program in the most promising directions.</em></p><p><strong>Developers can learn more about the DFINITY Developer Grants program <a href="https://dfinity.org/grants" target="_blank" rel="noopener noreferrer">here</a>.</strong></p><p><strong>To wrap things up, what makes the DevRel team unique compared to some of the other teams at DFINITY?</strong></p><p><em>We strive to be advocates for the community more than we are DFINITY employees.</em></p><p>As this blog series comes to a close, we hope you've enjoyed learning more about each team and what projects they've been working on! In a new, upcoming series, we'll interview individuals rather than entire teams to learn more about their role on ICP and the hand that they play in current and upcoming features, tools, research, and development. Be sure to stay tuned for that series! </p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New WebAssembly instrumentation]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/new-webassembly-instumentation</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/new-webassembly-instumentation"/>
        <updated>2023-12-20T20:08:08.000Z</updated>
        <summary type="html"><![CDATA[The Internet Computer (IC) is a blockchain-based platform that hosts general-purpose applications. Each application runs in a WebAssembly (Wasm) virtual machine to ensure security, safety, performance, and determinism.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="New WebAssembly instrumentation" src="/assets/images/webassembly-instru-fecfc313b0db5ada6268090bac4c09e9.webp" width="1400" height="550" class="img_ev3q"></p><p><em>This article was originally published on the DFINITY Medium blog <a href="https://medium.com/dfinity/new-webassembly-instrumentation-2c93631e5718" target="_blank" rel="noopener noreferrer">here</a> by Andriy Berestovskyy, Ulan Degenbaev, Maciej Kot &amp; Alexandru Uta.</em></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="background">Background<a href="#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2><p>The Internet Computer (IC) is a blockchain-based platform that hosts general-purpose applications. Each application runs in a WebAssembly (Wasm) virtual machine to ensure security, safety, performance, and determinism.</p><p><img loading="lazy" alt="New WebAssembly instrumentation" src="/assets/images/webassembly-instru-1-d156a24b9c533be66e6df8e3a92236a9.webp" width="682" height="417" class="img_ev3q"></p><p>The application lifecycle on the IC includes the following steps:</p><ol><li><p>Development. Using one of the supported high-level languages (Rust, Motoko, Typescript, Python…) and the corresponding Canister Development Kit library (CDK), developers implement their general-purpose applications.</p></li><li><p>Wasm compilation and deployment. The application source code is compiled and linked with the CDK library. The resulting Wasm binary is deployed on the IC, and is called a canister.</p></li></ol><p>Once deployed, the canister is ready to receive messages from users and other canisters. Prior to the very first message execution, the newly deployed Wasm binary must undergo two more transformations:</p><ol><li><p>Instrumentation. The Internet Computer inserts system-level code into the Wasm binary to count the number of executed instructions.</p></li><li><p>Native compilation. Finally, the instrumented Wasm binary is being compiled into native x86 code to achieve near-native application performance.</p></li></ol><p>More details can be found in the <a href="https://medium.com/dfinity/webassembly-on-the-internet-computer-a1d0c71c5b94" target="_blank" rel="noopener noreferrer">WebAssembly on the Internet Computer article.</a></p><p>Now, let’s dive into the instrumentation process.</p><p><img loading="lazy" alt="New WebAssembly instrumentation" src="/assets/images/webassembly-instru-2-7ae5167a8dcc0aa330eb3248c2b59107.webp" width="713" height="406" class="img_ev3q"></p><p>The Internet Computer instruments Wasm binaries by injecting tiny snippets of code to count the number of executed instructions. This is needed to ensure that canister execution terminates and the canister is fairly charged. The number of executed instructions is also known as the program counter on other blockchains.</p><p>As every single executed instruction must be correctly counted, the instrumentation step is critical for the performance of the canisters and the Internet Computer block rate consistency.</p><p>The old Wasm instrumentation algorithm works well, but is inefficient for certain kinds of applications such as language interpreters. The new Wasm instrumentation addresses these inefficiencies and achieves an order of magnitude better performance for such applications, allowing developers to run their canisters more efficiently and cheaper.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="old-instrumentation-algorithm">Old instrumentation algorithm<a href="#old-instrumentation-algorithm" class="hash-link" aria-label="Direct link to Old instrumentation algorithm" title="Direct link to Old instrumentation algorithm">​</a></h2><p>The high-level idea of the old instrumentation algorithm is to detect “straight-line code” (<a href="https://en.wikipedia.org/wiki/Basic_block" target="_blank" rel="noopener noreferrer">basic block</a>) and inject a few Wasm instructions to update the instruction counter at the beginning of each basic block. For reentrant blocks, such as functions and loops, the algorithm also adds a check for the out-of-instructions condition.</p><p>The old instrumentation algorithm was written before the Internet Computer Genesis, as there was no other way to measure the fuel/gas at the time.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="problematic-cases">Problematic cases<a href="#problematic-cases" class="hash-link" aria-label="Direct link to Problematic cases" title="Direct link to Problematic cases">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="problem-1-over-estimation">Problem 1: Over-estimation<a href="#problem-1-over-estimation" class="hash-link" aria-label="Direct link to Problem 1: Over-estimation" title="Direct link to Problem 1: Over-estimation">​</a></h3><p>The old instrumentation algorithm doesn’t properly handle cases when the control flow is transferred across multiple blocks. The algorithm overestimates the number of executed instructions:</p><p>Original Wasm code:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">(block $b1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  (block $b2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    br $b1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  )</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  [N other instructions]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Instrumented Wasm code:</p><p>(block $b1</p><blockquote><p> instruction_counter -= N
(block <span class="math math-inline"><span class="katex-error" title="ParseError: KaTeX parse error: Can't use function '$' in math mode at position 34: …unter -= 1  br $̲b1  )  [N other…" style="color:#cc0000">b2  instruction_counter -= 1  br $b1  )  [N other instructions] ) In the example above, the `br` instruction transfers control to the end of block `</span></span>b1<code>, jumping over *N* instructions. However, the algorithm considers the *N* instructions to be part of block </code>$b1` and accounts for them at the beginning of the block. Many languages implement switch/match expressions using nested blocks and labeled branches, which means that overestimation is probably common in practice.</p></blockquote><p>The root cause of the issue is that the algorithm detected basic blocks incorrectly. The crucial property of the “straight-line code” is that the whole block must be executed unconditionally. This property does not hold as demonstrated in the example above.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="problem-2-performance">Problem 2: Performance<a href="#problem-2-performance" class="hash-link" aria-label="Direct link to Problem 2: Performance" title="Direct link to Problem 2: Performance">​</a></h3><p>A basic block has a single entry and a single exit point. There is <a href="https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/Control_flow/block" target="_blank" rel="noopener noreferrer">a Wasm instruction</a> called <code>block</code>, but the instruction does not mark neither the beginning nor the end of a “straight-line code”. The old algorithm mistakenly treated the <code>block</code> instruction as the beginning of the basic block.</p><p>Since the <code>instruction_counter</code> is stored in a global variable, updating it requires two memory accesses: one load and one store. The old instrumentation mistakenly inserts them after each <code>block</code> Wasm instruction. This had a huge negative impact on some applications with lots of nested <code>block</code>’s.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="problem-3-scheduling-and-fairness">Problem 3: Scheduling and fairness<a href="#problem-3-scheduling-and-fairness" class="hash-link" aria-label="Direct link to Problem 3: Scheduling and fairness" title="Direct link to Problem 3: Scheduling and fairness">​</a></h3><p>Whereas the old instrumentation treats all instructions as equal in terms of cost, the actual cost of an instruction depends on its type. For example, division is more expensive than addition, so, even if the number of Wasm instructions is the same, it would be fair to charge more for divisions.</p><p>Also, charging equally for all the instructions poses a great challenge for the Internet Computer scheduler. To be deterministic, it tries to schedule the same number of instructions per round. If most of those instructions happen to be “light”, the round finishes earlier, while if most of the instructions are “heavy”, users might observe unexpected delays.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-instrumentation-algorithm">New instrumentation algorithm<a href="#new-instrumentation-algorithm" class="hash-link" aria-label="Direct link to New instrumentation algorithm" title="Direct link to New instrumentation algorithm">​</a></h2><p>To address problem 1 (over-estimation) and problem 2 (performance) a new instrumentation algorithm was proposed for voting through the NNS. It properly detects the basic blocks (“straight-line code”) and reduces the number of memory accesses.</p><p>More specifically, the new instrumentation algorithm works as follows:</p><ul><li>Inject a new global variable: <code>instruction_counter = slice_limit</code></li></ul><p>The counter is initialized to the execution slice limit and decreases during execution.</p><ul><li>At the beginning of each reentrant block (function entry or loop instruction), inject the following snippet:</li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">instruction_counter = instruction_counter — N</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">if instruction_counter &lt; 0</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">call out_of_instructions()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><p>Decrement the <code>instruction_counter</code> by the number of the top-level instructions in this block (not nested in other blocks) until the beginning of a next block.</p></li><li><p>If the counter goes below zero, call the out_of_instructions() handler to either pause (with DTS) or terminate the execution.</p></li><li><p>At the beginning of each basic block (after each <code>if, else, br, br_if, br_table, end, return, unreachable, return_call, return_call_indirect</code> instructions), inject:
<code>instruction_counter = instruction_counter — N</code></p></li><li><p>Decrement the <code>instruction_counter</code> by the number of the top-level instructions in this block (not nested in other blocks) until the beginning of a next block.</p></li></ul><p>Let’s quickly compare the old and new instrumentation algorithms. Here is the example seen previously:</p><p>Old Wasm instrumentation:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">(block $b1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;  instruction_counter -= N</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">   (block $b2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&gt;    instruction_counter -= 1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">     br $b1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">   )</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">   [N other instructions]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>New Wasm instrumentation:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">(block $b1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  (block $b2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    br $b1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  )</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&gt; instruction_counter -= N</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  [N other instructions]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>As the block instruction is neither the beginning nor the end of the “straight-line code” in the new algorithm, there are no more decrements after each block instruction, and hence the number of memory accesses for this example just halved. This might seem like a subtle difference, but many language interpreters use quite entangled match/switch statements in the very heart of the interpreting loop.</p><p>More details can be found in the <code>instrument()</code> function source code on <a href="https://github.com/dfinity/ic" target="_blank" rel="noopener noreferrer">github.com/dfinity/ic</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="adjustments-of-costs">Adjustments of costs<a href="#adjustments-of-costs" class="hash-link" aria-label="Direct link to Adjustments of costs" title="Direct link to Adjustments of costs">​</a></h2><p>Each Wasm instruction is assigned a “weight” as is standard practice in the blockchain world. Different instructions usually have different costs, for example varying gas costs per opcode in the EVM, as specified in the <a href="https://ethereum.github.io/yellowpaper/paper.pdf" target="_blank" rel="noopener noreferrer">Yellow Paper</a>. Therefore, and to address problem 3 (block rate and fairness), each Wasm instruction was assigned a new “weight” while reworking the instrumentation.</p><p>This leads to a non-uniform instruction cost model and could affect the total cycle consumption of certain workloads. To address this concern, a lot of effort was put into communicating the changes to the community, working internally with DFINITY teams, and testing.</p><p>To assign each Wasm instruction a correct weight, most instructions were benchmarked. The benchmarks provide a good estimation of the actual time the CPU spends on each Wasm instruction.</p><p>More details can be found in the <code>wasm_instructions_bench()</code> function on <a href="https://github.com/dfinity/ic" target="_blank" rel="noopener noreferrer">github.com/dfinity/ic</a>.</p><p>The <a href="https://github.com/dfinity/ic/blob/09c3000df0a54c470994ceb5bc33bd8457b02fe7/rs/execution_environment/benches/wasm_instructions/WASM_INSTRUCTIONS.md" target="_blank" rel="noopener noreferrer">results for the benchmarks</a> correlate pretty closely with the <a href="https://www.agner.org/optimize/instruction_tables.pdf" target="_blank" rel="noopener noreferrer">CPU instruction tables</a>web, which confirms that the benchmarks make sense and pose no surprises for developers. A short summary of the costs adjustments:</p><p><img loading="lazy" alt="Cost table" src="/assets/images/webassembly-instru-3-70a4a672a550983aa0dc495e59cd6dc5.webp" width="964" height="256" class="img_ev3q"></p><p>More details can be found in the <code>instruction_to_cost_new()</code> function on <a href="https://github.com/dfinity/ic" target="_blank" rel="noopener noreferrer">github.com/dfinity/ic</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="results">Results<a href="#results" class="hash-link" aria-label="Direct link to Results" title="Direct link to Results">​</a></h2><p>Below you can find how some applications are impacted by the new instrumentation algorithm and the new Wasm instruction weights. While this is no exhaustive list, it gives an indication of what canister developers should expect for different types of applications.</p><p><img loading="lazy" alt="Results" src="/assets/images/webassembly-instru-4-b8eaac1ccc421249879c8039913febe0.webp" width="964" height="420" class="img_ev3q"></p><p>Note that an X% increase in the number of instructions does not directly translate to an X% increase in overall cost, as this does not include ingress and message execution fees.</p><p>Overall, interpreters are order of magnitude more efficient, both in terms of the number of executed instructions and the execution time. This opens the door for the new languages on the Internet Computer, like TypeScript, JavaScript and Python.</p><p>For the rest of the workloads, the results oscillate +/-20% around the old instrumentation results.This is a modest overhead, and should not surprise developers.</p><p>The new instrumentation is implemented and rolled out on all the mainnet subnets and development environments (<code>dfx</code> v0.15+).</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><ul><li><p>Documentation: <a href="https://internetcomputer.org/capabilities/webassembly" target="_blank" rel="noopener noreferrer">WebAssembly on ICP</a>.</p></li><li><p>Blog post: <a href="https://medium.com/dfinity/webassembly-on-the-internet-computer-a1d0c71c5b94" target="_blank" rel="noopener noreferrer">WebAssembly on the Internet Computer</a>.</p></li><li><p>ICP developers forum: <a href="https://forum.dfinity.org/t/new-wasm-instrumentation/22080" target="_blank" rel="noopener noreferrer">New Wasm instrumentation</a></p></li></ul><p>If you have questions/suggestions or just want to meet Internet Computer developers and DFINITY engineers, join the <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">forum.dfinity.org</a>.</p>]]></content>
        <author>
            <name>Andriy Berestovskyy, Ulan Degenbaev, Maciej Kot &amp; Alexandru Uta</name>
        </author>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update December 20, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/12/20/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/12/20/news-and-updates/update"/>
        <updated>2023-12-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to talk about the upcoming 'Zero to Dapp' hackathon, introduce a new node metrics API, and the latest episode of the Developer Liftoff video series!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="December 20 2023" src="/assets/images/dev-update-blog-dec-20-8f2d2534c9741f81e8c3df7164c255e5.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome back to developer weekly! This week, we're excited to talk about the upcoming 'Zero to Dapp' hackathon, introduce a new node metrics API, and the latest episode of the Developer Liftoff video series! Let's get started.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="zero-to-dapp-hackathon">'Zero to Dapp' hackathon<a href="#zero-to-dapp-hackathon" class="hash-link" aria-label="Direct link to 'Zero to Dapp' hackathon" title="Direct link to 'Zero to Dapp' hackathon">​</a></h2><p>In a collaboration with Encode Club, ICP is launching a four-week hackathon starting January 16, 2024. This hackathon will contain exclusive technical workshops that will help developers of all skill levels grow and enhance their skills for building on ICP. You can sign up on the Encode Club website <a href="https://www.encode.club/zero-to-dapp-hackathon" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="trustworthy-node-metrics">Trustworthy node metrics<a href="#trustworthy-node-metrics" class="hash-link" aria-label="Direct link to Trustworthy node metrics" title="Direct link to Trustworthy node metrics">​</a></h2><p>Node Provider compensation is receiving an upgrade! ICP is introducing a new approach that will enable a new node provider compensation model that rewards nodes for providing 'useful work' rather than the current, fixed-rate location based model. This change has the potential to improve the network's performance and reliability.</p><p>Providing a new node metrics API endpoint is the first step toward implementing a new reward distribution model in the future. The metrics are determined through <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus</a>, which ensure that the metrics provided are authentic and not manipulated by a node provider. Developing these new trustworthy node metrics has been a collaboration between the Consensus, Message Routing, Execution, and Decentralized Reliability Engineering teams.</p><p>For developers and users, this initiative signifies a performance-driven and transparent system that strives to encourage node providers to maintain optimal performance and health of their nodes. These new metrics enable reliable monitoring and provide deeper insights into the operation of nodes, and ensures alignment with the network's goals.</p><p>You can learn more in the forum post <a href="https://forum.dfinity.org/t/trustworthy-node-metrics-for-useful-work/22989" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-episode-11-exploring-a-live-demo">Developer Liftoff episode 1.1: Exploring a live demo<a href="#developer-liftoff-episode-11-exploring-a-live-demo" class="hash-link" aria-label="Direct link to Developer Liftoff episode 1.1: Exploring a live demo" title="Direct link to Developer Liftoff episode 1.1: Exploring a live demo">​</a></h2><p>In this episode of the ICP Developer Liftoff, developers will learn how to explore a live, deployed canister that utilizes the playground  through the <code>dfx deploy --playground</code> command to get a feel for deploying canisters on the IC before developing and deploying their own.</p><p>The documentation for this episode can be found <a href="/tutorials/developer-liftoff/level-1/1.1-motoko-lvl1">here</a>, and you can watch the full video on the DFINITY YouTube channel <a href="https://www.youtube.com/watch?v=-se6Se9z-aM" target="_blank" rel="noopener noreferrer">here</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update December 13, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/12/13/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/12/13/news-and-updates/update"/>
        <updated>2023-12-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we discuss the latest release of dfx, the EU subnet proposal status, and an important security advisory for the Candid Rust library.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="December 13 2023" src="/assets/images/dev-update-blog-dec-13-207f2158d08b0f15a0522d921ccf8324.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello ICP developers and welcome to this edition of developer weekly! This week, we discuss the latest release of dfx, the EU subnet proposal status, and an important security advisory for the Candid Rust library. Let's get into it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-0152">dfx 0.15.2<a href="#dfx-0152" class="hash-link" aria-label="Direct link to dfx 0.15.2" title="Direct link to dfx 0.15.2">​</a></h2><p>The latest version of dfx, <code>0.15.2</code> has been released! This new release introduces several new features, such as: </p><ul><li><p>Canister install arguments can now be read from a file using the <code>--argument-file</code> flag, such as <code>dfx canister install --argument-file ./my/argument/file.txt my_canister_name</code>.</p></li><li><p>The <code>list_permitted</code> and <code>list_authorized</code> methods can now be called as an update call. Calling these methods as a query call has been disabled. </p></li><li><p>The <code>dfx cycles</code> command has been added, which is not yet supported on the mainnet, but will work locally after installing the <a href="https://github.com/dfinity/cycles-ledger" target="_blank" rel="noopener noreferrer">cycles ledger</a> (which is still in development). Subcommands included in this new feature are:</p><ul><li><p><code>dfx cycles balance</code>: Returns the current cycles balance of the cycles ledger.</p></li><li><p><code>dfx cycles transfer &lt;to&gt; &lt;amount&gt;</code>: Transfers cycles from one account to another account.</p></li><li><p><code>dfx cycles top-up &lt;to&gt; &lt;amount&gt;</code>: Sends cycles from an account to a canister.</p></li></ul></li><li><p>Additional ways to specify cycle and e8s amounts have been added. Underscores can now be used to make large numbers readable, such as <code>dfx canister deposit-cycles 1_234_567 mycanister</code>.
In addition to underscores, certain suffixes that replace a number of zeros are now supported:</p></li><li><p><code>k</code> for 000, e.g. 500k.</p></li><li><p><code>m</code> for 000_000, e.g. 5m.</p></li><li><p><code>b</code> for 000_000_000, e.g. 50B.</p></li><li><p><code>t</code> for 000_000_000_000, e.g. 0.3T.</p></li></ul><p>Alongside these new features are a handful of bug fixes and enhancements, including:</p><ul><li><p>The <code>dfx canister delete &lt;canister id&gt;</code> command now removes the related entry from the canister ID store.</p></li><li><p><code>dfx extension install</code> can no longer create a corrupt cache directory.</p></li><li><p>The <code>output_env_file</code> is now considered relative to the project's root.</p></li><li><p><code>dfx ledger transfer</code> now logs to <code>stderr</code> messages about duplicates rather than printing them to <code>stdout</code>.</p></li></ul><p>You can read the full detailed release notes on the IC SDK repo <a href="https://github.com/dfinity/sdk/releases/tag/0.15.2" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="eu-subnet">EU subnet<a href="#eu-subnet" class="hash-link" aria-label="Direct link to EU subnet" title="Direct link to EU subnet">​</a></h2><p>In last week's <a href="/blog/2023/12/06/news-and-updates/update#eu-subnet-nns-proposal">developer weekly update</a>, we announced that the first proposals to create an EU subnet had been submitted to the NNS for voting. The first two proposals have passed, and the third is currently up for voting! You can vote on the NNS dapp <a href="https://nns.ic0.app/proposal/?u=qoctq-giaaa-aaaaa-aaaea-cai&amp;proposal=126391" target="_blank" rel="noopener noreferrer">here</a>. </p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="candid-security-advisory">Candid security advisory<a href="#candid-security-advisory" class="hash-link" aria-label="Direct link to Candid security advisory" title="Direct link to Candid security advisory">​</a></h2><p>DFINITY has issued an important security advisory regarding Candid. An upgrade of the Candid Rust library is required due to a security vulnerability that revealed a possible denial of service exploitation. We've released a separate Dev Blog post that goes into further detail on this advisory, which can be found <a href="/blog/news-and-updates/candid-security-advisory">here</a>.</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Async-friendly performance counter]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/async-performance-counter</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/async-performance-counter"/>
        <updated>2023-12-12T20:54:01.000Z</updated>
        <summary type="html"><![CDATA[Introducing a new performance counter on the Internet Computer to easily optimize async canister code.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Async-friendly performance counter" src="/assets/images/async-performance-counter-29117aa3fbdc8bc354cb191f4170e378.webp" width="1400" height="700" class="img_ev3q"></p><p><em>This article was originally published on the DFINITY Medium blog <a href="https://medium.com/dfinity/async-friendly-performance-counter-dcf928226c2b" target="_blank" rel="noopener noreferrer">here</a> by Andriy Berestovskyy.</em></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="background">Background<a href="#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2><p>The Internet Computer can host a full dapp — frontend, backend and data. Users can deploy their dapp as a canister (smart contract) on the Internet Computer. Each canister can store up to 500GiB of data and execute up to 40 Billion WebAssembly instructions per transaction.</p><p>Unlike other blockchains, the Internet Computer offers developers <a href="/building-apps/canister-management/resource-limits">enormous amounts of resources</a>. This poses a real challenge for canister developers: writing efficient canister code. The more efficient a canister is, the less cycles it pays.</p><p>Performance counter is the way for a canister (smart contract) to track the amount of work done. This information could be used as the main metric to optimize the code.</p><p>The Internet Computer provides this System API call:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">ic0.performance_counter : (counter_type : i32) -&gt; i64</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The type argument specifies which performance counter to return. For a long time only <code>type 0</code> counter was supported on the Internet Computer — the number of WebAssembly instructions the canister has executed since the beginning of the current message execution.</p><p>This <code>type 0</code> counter works well, and many developers use it daily. But the counter is valid only for the current message, and it resets after each await point.</p><p>How could it be improved?</p><p>We are introducing a new call context performance counter (<code>type 1</code>) to track the executed WebAssembly instructions across await points.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="comparing-the-performance-counters">Comparing the performance counters<a href="#comparing-the-performance-counters" class="hash-link" aria-label="Direct link to Comparing the performance counters" title="Direct link to Comparing the performance counters">​</a></h2><p>Consider this example function:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">#[query(composite = true)]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">async fn example() -&gt; (u64, u64) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❶   call(id(), "nested_call", ())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❷       .await;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❶   call(id(), "nested_call", ())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❷       .await;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❸   (performance_counter(0), performance_counter(1))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The function ❶ makes two nested calls, ❷ awaits them, and finally ❸ replies to the original call.</p><p>From the developer’s point of view, it’s just one function. From the user’s perspective, it’s just one call. But in fact, under the hood, there are three message executions:</p><p><img loading="lazy" alt="Performance counter" src="/assets/images/performance-counter-1-331aa57d34144db1ca8a0a4f4dd63139.webp" width="720" height="386" class="img_ev3q"></p><ol><li><p>The original call is executed up until the first await point.</p></li><li><p>Then the reply to that call triggers the second execution.</p></li><li><p>At the end, yet another reply triggers the final part, which replies to the original call with two performance counters.</p></li></ol><p>There is a call context to track the original call. The Internet Computer creates it for each call and keeps it around until the call is either replied or rejected.</p><p>The performance counter <code>type 0</code> just follows those three message executions. It starts from <code>0</code> and goes up to some value <code>i</code>. After the first await, it resets and goes up to <code>j</code>, and then up to <code>k</code>.</p><p>On the other hand, the new <code>type 1</code> counter lives in the call context, so it monotonically increases until the original call is replied. In this example, it starts from <code>0</code> and goes to <code>i</code>, <code>i+j</code> and then up to <code>i+j+k</code>.</p><p>The results are similar. Can just the old <code>type 0</code> counter do the job?</p><p>To get the same <code>i+j+k</code> result with the counter <code>type 0</code>, the counter should be saved before each reset:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">#[query(composite = true)]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">async fn example() -&gt; u64 {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    let c = call(id(), "nested_call", ());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❶   let i = performance_counter(0);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    c.await;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    let c = call(id(), "nested_call", ());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❷   let j = performance_counter(0);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    c.await;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❸   let k = performance_counter(0);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    i + j + k</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Even this simple example becomes spaghetti, as every single await point must be changed. Imagine a bit more complicated code, with many nested functions and library calls… It’s a challenge to properly instrument production asynchronous code!</p><p>On the other hand, the new call context counter still must be explicitly collected at the end of the function:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">#[query(composite = true)]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">async fn example() -&gt; u64 {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    call(id(), "nested_call", ()).await;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    call(id(), "nested_call", ()).await;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    do_some_work();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">❶   performance_counter(1) // i + j + k</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>But in this case there is no need to instrument every single await point in the nested functions or libraries. There is just one place, right before the counter is returned. It’s a huge step forward to fully automate the code instrumentation and profiling in the future.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="using-performance-counters">Using performance counters<a href="#using-performance-counters" class="hash-link" aria-label="Direct link to Using performance counters" title="Direct link to Using performance counters">​</a></h2><p>To quickly run the performance counters example (assuming the Internet Computer SDK is <a href="/building-apps/getting-started/install">already installed</a>):</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ git clone git@github.com:dfinity/examples.git</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ cd examples/rust/performance_counters</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ cargo update</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ dfx start --clean --background</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ dfx deploy</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ dfx canister call performance_counters example</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">(7_012_128 : nat64, 21_568_690 : nat64)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The example function returns two values: the old counter (<code>type 0</code>) and the new one (<code>type 1</code>). As the new call context counter includes all three message executions, it reports three times more WebAssembly instructions: 21 million vs just 7 million.</p><p>Please check the <a href="https://github.com/dfinity/examples/tree/master/rust/performance_counters" target="_blank" rel="noopener noreferrer">performance counters example on GitHub</a> for detailed instructions.</p><p>The new async-friendly performance counter is available everywhere:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Rust:       ic_cdk::api::performance_counter(1);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Motoko:     import IC "mo:base/ExperimentalInternetComputer";</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            IC.performanceCounter(1);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">TypeScript: import ic from 'azle';</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            ic.performanceCounter(1);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Python:     from kybra import ic</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            ic.performance_counter(1)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><ul><li><p>Backend developers guide: <a href="/building-apps/advanced/optimize/rust">Optimizing Rust canisters</a>.</p></li><li><p>Motoko developers guide: <a href="/building-apps/advanced/optimize/motoko">Optimizing canisters</a>.</p></li></ul>]]></content>
        <author>
            <name>Andriy Berestovskyy</name>
        </author>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Deprecation of the Service Worker]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/deprecation-of-service-worker</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/deprecation-of-service-worker"/>
        <updated>2023-12-12T20:39:40.000Z</updated>
        <summary type="html"><![CDATA[In September, DFINITY proposed to deprecate the Internet Computer Service Worker in favorite of ICX Proxy, a service hosted on the DFINITY Boundary Nodes. This proposal has been adopted, and as of December 7, 2023, the Service Worker has been deprecated.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Deprecation of the Service Worker" src="/assets/images/deprecating-the-service-worker-70431c0d33cd2e04afc3986f95355000.png" width="1200" height="650" class="img_ev3q"></p><p>In September, DFINITY proposed to deprecate the Internet Computer Service Worker in favour of ICX Proxy, a service hosted on the DFINITY Boundary Nodes. This proposal has been adopted, and as of December 7, 2023, the Service Worker has been deprecated.</p><p>Beginning December 7, 2023, the new version of boundary nodes which uses icx-proxy to verify HTTP responses on the boundary node itself has begun to gradually roll out.</p><p>For more information on the reasons behind this change, check out the full proposal blog post <a href="https://internetcomputer.org/blog/features/deprecating-the-service-worker" target="_blank" rel="noopener noreferrer">here</a>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="who-is-affected">Who is affected<a href="#who-is-affected" class="hash-link" aria-label="Direct link to Who is affected" title="Direct link to Who is affected">​</a></h3><p>This update affects all dapps being served via a DFINITY gateway (<em>.ic0.app, </em>.icp0.io and hosted custom domains). Dapps being served from a custom gateway implementation will remain unchanged.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-to-expect">What to expect<a href="#what-to-expect" class="hash-link" aria-label="Direct link to What to expect" title="Direct link to What to expect">​</a></h3><p>Most notably with this change, you will no longer see the service worker loading screen. Inspecting requests in your browser console will show regular HTTP calls for fetching static assets instead of the encoded ones.</p><p>An important note is that streamed resources that are larger than 8MB will not be verified through icx-proxy; they will be served as-is. This is because requests with larger responses are fairly infrequent and represented an almost insignificant percentage of total HTTP traffic according to our metrics. Verification for larger streamed responses will be addressed at a later stage.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="resources">Resources<a href="#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2><p>You can join the forum discussion on this topic <a href="https://forum.dfinity.org/t/deprecating-the-service-worker/23401/6?u=raymondk" target="_blank" rel="noopener noreferrer">here</a>, and you can read the full proposal on the Dev Blog <a href="https://internetcomputer.org/blog/features/deprecating-the-service-worker" target="_blank" rel="noopener noreferrer">here</a>.</p>]]></content>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Languages]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-languages</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-languages"/>
        <updated>2023-12-12T19:25:12.000Z</updated>
        <summary type="html"><![CDATA[In this issue, we're excited to dive into all things Motoko by sitting down with the DFINITY languages team, who are the primary contributors to the development of Motoko.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Languages team spotlight" src="/assets/images/dev-update-blog-languages-9ce46ff7ba1af2d8e2db0b68a91f7f3d.jpg" width="1400" height="675" class="img_ev3q"></p><p><strong>Hello developers and welcome to this edition of team spotlight! In this issue, we're excited to dive into all things Motoko by sitting down with the DFINITY languages team, who are the primary contributors to the development of Motoko. Motoko is a programming language developers specifically for deploying canisters on ICP. It supports the unique features and workflows of ICP, while providing a syntax that is approachable for entry level developers. Let's get started!</strong></p><p><strong>What is the purpose of the Languages team?</strong> </p><p><em>The Languages team is primarily responsible for the development of the Motoko programming language. In addition, the team builds and maintains several tools that help developers write Motoko programs and build and interact with their canisters on ICP. Some examples include the Motoko VSCode extension, Prettier plugin, ic-wasm, ic-repl, and the canister profiling suite.</em></p><p><strong>What is the composition of the Languages team?</strong></p><p><em>The Languages team is composed of 5 engineers and researchers from various technical backgrounds, ranging from low-level compiler experts, to language designers, to library and tools experts.</em></p><p><strong>The Languages team is responsible for creating and developing Motoko. How would you describe Motoko as a programming language? Is there a language it is similar to?</strong></p><p><em>In a nut-shell, Motoko is an actor-oriented, eager, impure functional language with strong static typing, subtyping and generics and automatic memory management. Actor orientation is a perfect fit for the ICP’s isolated canisters, communicating by shared-nothing, asynchronous message passing. Its correctness-oriented support for statically checked pattern matching on values is familiar from languages in the ML family (Haskell, OCaml and SML). Subtyping is usually associated with object-oriented languages such as C# and Java as well as the module system of SML. Most mainstream languages adopt nominal typing, which  is hard to maintain across distributed actors. Instead, Motoko, like TypeScript, uses structural typing, with the notable difference that the Motoko type system offers the standard safety guarantees of types, which TypeScript does not.</em></p><p><em>Andreas Rossberg wrote a very nice article on the design of Motoko <a href="https://stackoverflow.blog/2020/08/24/motoko-the-language-that-turns-the-web-into-a-computer" target="_blank" rel="noopener noreferrer">here.</a></em></p><p><strong>What kind of developer is Motoko aimed at?</strong></p><p><em>If you’ve used a high-level programming language such as TypeScript, Java, C#, or Python, you’ll see a lot of familiar syntax in Motoko. The benefit of using Motoko over these languages is the modern algebraic type system, which is important for writing secure canister smart contracts.</em></p><p><em>For those trying to decide between using Motoko and Rust for their next project, the best reason to use Motoko is its excellent support for ICP features such as stable memory, native Candid encoding/decoding, and calling other canisters. Motoko is also a lot more approachable for beginners, and all third-party libraries work on the IC (compared to a small fraction of the Rust crate ecosystem). When in doubt, try Motoko first!</em></p><p><strong>What are some of the challenges that the team faces when developing a programming language?</strong></p><p><em>It’s no longer enough to just design the language and implement a compiler. Nowadays, developers expect IDE support, a rich standard library, package manager and package ecosystem, debuggers, profilers, code formatters, documentation tools, testing frameworks, you name it! Actually gaining adoption requires patience and hard work on all these fronts.</em></p><p><strong>What is something important about Motoko that new developers should know when they start learning the language?</strong></p><p><em>We value your feedback! If you have a bug report or feature request, please feel free to <a href="https://github.com/dfinity/motoko/issues/new" target="_blank" rel="noopener noreferrer">open a GitHub issue</a> or contact us on the <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">DFINITY developer forum</a>. You can also ask for help on the <a href="https://discord.com/invite/rB96MMn" target="_blank" rel="noopener noreferrer">ICP developer Discord</a> or even use the AI chatbot on <a href="https://internetcomputer.org/" target="_blank" rel="noopener noreferrer">internetcomputer.org</a> to speed up the learning process.</em></p><p><strong>Since the team is known as the Languages team, other than Motoko, what else does the team work on or contribute to?</strong></p><p><em>A bunch! The team also develops tools that help you benchmark canister performance – you can find that repo <a href="https://github.com/dfinity/canister-profiling" target="_blank" rel="noopener noreferrer">here</a>. We also develop tools like <a href="https://github.com/dfinity/ic-repl" target="_blank" rel="noopener noreferrer">ic-repl</a> which is sort of like a simple IDL for sending commands to your canister. It’s neat, give it a go!</em></p><p><strong>How does the Languages team work with other teams?</strong></p><p><em>The Languages team is a bit different from other teams at DFINITY since we do our work mostly out in the open, on GitHub. When we do work with other teams, it is often to distill requirements from some hot new protocol feature and flesh out the design. That process can take many iterations to get right, as there could be subtle nuances that aren’t obvious during the first pass.</em></p><p><strong>Speaking of new protocol features, is the languages team currently working on a project that implements a new feature? What's the primary focus of the team currently?</strong></p><p><em>The Languages team is currently focused on making the need for serialization during upgrades mostly obsolete. The goal is to make the process of upgrading a canister completely seamless, which would result in “true” orthogonal persistence becoming a reality!</em></p><p><strong>What are the primary components of this project?</strong></p><p><em>The compiler and Motoko runtime system, as well as the underlying replica runtime system.</em></p><p><strong>What are the primary benefits of this project?</strong></p><p><em>The primary benefit is never needing to think about serialization to and deserialization from stable memory for most ordinary data structures – data can essentially live forever and continue to be represented in the same way after an upgrade as it was before. Stable memory could then be used for more specialized scenarios where a large amount of storage is necessary.</em></p><p><strong>When can developers expect the project to be completed?</strong></p><p><em>The project will take several months to complete; however, you can follow our progress on GitHub and get regular updates through our monthly Motoko Developer Working Group meetings as well as Global R&amp;D.</em></p><p><strong>Where should developers look for the latest Motoko updates?</strong></p><p><em>If you are not already engaged with other ICP developers in the <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">forum</a>, this would be a good time to sign up. We often provide updates through the forum and the dev blog. We also do all of our work out in the open, so GitHub is a great place to keep up with the latest developments. Furthermore, you can attend the Motoko Working Group which takes place the second Thursday of every month at 10AM PST.</em></p><p><strong>What is one feature or aspect of Motoko that the team is the most proud of?**</strong></p><p><em>I think one feature that is largely taken for granted but is actually quite novel is the seamless integration of Candid and Motoko. Motoko users never have to generate stubs or implement skeletons to consume or produce a service and Candid interface. All of this is done behind the scenes by the compiler.</em></p><p><em>Another feature which is unique is the support for static (and soon dynamic) checking of stable variable compatibility, giving users some degree of confidence that upgrades will not lose data.</em></p><p><em>We are also very proud of the new incremental GC which is our first GC that actually meets the novel requirements of the IC and, moreover, is able to scale beyond 32-bit main memory to 64-bit main memory, when that time comes.</em></p><p><strong>To wrap things up, what makes the Languages team unique compared to some of the other teams at DFINITY?</strong></p><p><em>The fact that we implement against the public spec, like external teams would need to, not to the replica implementation.</em></p><p>Thank you to the Languages team for sitting down with us today and providing such educational and insightful information! I hope everyone reading has enjoyed this interview as much as we have; it was great to learn so much about Motoko!</p><p>Until next time!</p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Candid upgrade required due to important security advisory]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/candid-security-advisory</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/candid-security-advisory"/>
        <updated>2023-12-11T15:50:47.000Z</updated>
        <summary type="html"><![CDATA[This important update details a recently discovered security vulnerability that should be addressed by upgrading the Candid Rust library to the latest version as soon as possible.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Candid security advisory" src="/assets/images/dev-blog-candid-security-advisory-53b020f309f82331377ed0d4e44669df.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers,</p><p>Today, we have an important security update to share. Recently, the DFINITY security team discovered a vulnerability in the Candid Rust library which indicated that the library could be vulnerable to a denial of service (DOS) exploitation, which could degrade canister performance. This security advisory does not affect Motoko canisters.</p><p>To address this security flaw, a patch has been applied in the latest Candid Rust library update, <code>0.9.10</code>. It is strongly advised that all canisters that are running Candid <code>0.9.0</code> and older upgrade to the latest version of the Candid Rust library (<code>0.9.10</code>).</p><p>For asset canisters that are bundled with dfx running dfx versions <code>0.14.4</code> and older, it is strongly advised to upgrade to the latest version of dfx, <code>0.15.2</code>, then redeploy the asset canister(s).</p><p>It is encouraged that the ICP community report any bugs or security issues found responsibly. You can refer to the <a href="https://dfinity.org/bug-bounty/" target="_blank" rel="noopener noreferrer">Bug Bounty</a> program for more information.</p><p>All affected canisters that are developed and maintained by DFINITY have been upgraded to the latest version.</p><p>A GitHub security advisory has been published and can be viewed <a href="https://github.com/dfinity/candid/security/advisories/GHSA-7787-p7x6-fq3j" target="_blank" rel="noopener noreferrer">here</a>.</p><p>If you have questions, the forum post discussion for this security advisory can be found <a href="https://forum.dfinity.org/t/security-advisory-candid-upgrade-required/25341" target="_blank" rel="noopener noreferrer">here</a>.</p><p>Additional resources can be found here:</p><ul><li><p><a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-6245" target="_blank" rel="noopener noreferrer">CVE for this vulnerability.</a></p></li><li><p><a href="https://rustsec.org/advisories/RUSTSEC-2023-0073.html" target="_blank" rel="noopener noreferrer">RustSec advisory.</a></p></li><li><p><a href="/building-apps/canister-management/settings/#upgrade-a-canister">Documentation for upgrading a canister.</a></p></li><li><p><a href="/building-apps/frontends/using-an-asset-canister">Documentation for building a web frontend.</a></p></li></ul>]]></content>
        <category label="Security advisory" term="Security advisory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update December 6, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/12/06/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/12/06/news-and-updates/update"/>
        <updated>2023-12-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have some very exciting announcements about ckETH, an EU subnet proposal, and the final level of the Developer Liftoff series!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="December 6 2023" src="/assets/images/dev-update-blog-dev-6-8bb6f47b5888d855318a417e0dbe3b4e.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome back to developer weekly! This week, we have some very exciting announcements about ckETH, an EU subnet proposal, and the final level of the Developer Liftoff series! Let's get started.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cketh-now-live">ckETH: now live!<a href="#cketh-now-live" class="hash-link" aria-label="Direct link to ckETH: now live!" title="Direct link to ckETH: now live!">​</a></h2><p>On Friday, December 1st, the NNS proposals to enable ckETH on ICP went live. We're excited to announce that all proposals were passed by the NNS, and ckETH is now live on the mainnet!</p><p>ckETH has been added to the ICP dashboard, which you can view <a href="https://dashboard.internetcomputer.org/ethereum" target="_blank" rel="noopener noreferrer">here</a>. You can learn how to interact with ckETH by reviewing the ckETH minter documentation <a href="https://github.com/dfinity/ic/blob/master/rs/ethereum/cketh/minter/README.adoc" target="_blank" rel="noopener noreferrer">here</a>.</p><p>ckETH support is also live in the ICRC-1 wallet, which includes ckETH has a pre-defined token. The index canister has been integrated, allowing you to mint directly to your principal. The ICRC-1 wallet canister can be found <a href="https://e4hv6-7yaaa-aaaao-a2ida-cai.icp0.io/" target="_blank" rel="noopener noreferrer">here</a></p><p>With the current ckETH integration, you will not be able to withdraw to ETH directly from the ICRC-1 wallet. This is because the ICRC-1 wallet does not support the withdrawal process (withdraws are supported in the ICRC-2 standard). To withdraw ckETH for ETH, you can send your ckETH to your dfx principal, then withdraw from there following <a href="https://github.com/timohanke/ic/blob/d34903fc2c41e2cff5df86248628f5d0b4fd7168/rs/ethereum/cketh/minter/README.adoc#withdrawal-cketh-to-eth" target="_blank" rel="noopener noreferrer">these steps</a>.</p><p>To encourage you to try it out, the first person who logs into the ICRC-1 wallet using the “Seed method” with seed “ckETH”, then adds the subaccount whose index is “ckETH” in hex will find some ETH in it!</p><p>You can join the forum discussion <a href="https://forum.dfinity.org/t/cketh-a-canister-issued-ether-twin-token-on-the-ic/22819/95" target="_blank" rel="noopener noreferrer">here</a> to let us know your thoughts on ckETH and report any bugs you might encounter.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="eu-subnet-nns-proposal">EU subnet NNS proposal<a href="#eu-subnet-nns-proposal" class="hash-link" aria-label="Direct link to EU subnet NNS proposal" title="Direct link to EU subnet NNS proposal">​</a></h2><p>Another new and exciting proposal is now live for voting on the NNS. This proposal is the first of three proposals that proposes launching an EU subnet! Adding this subnet would be a huge milestone in enabling GDPR-compliant services on ICP.</p><p>This proposal will create a new subnet type of 'European'. If this initial proposal passes, two additional proposals will be submitted. The first will propose the creation of a subnet with only node machines located in the European geographic region, and a second proposal will assign the subnet type 'European' to the newly created subnet.</p><p>This new subnet type will enable developers and enterprises alike to benefit from:</p><ul><li><p>Building and deploying applications that require a GDPR-aligned infrastructure.</p></li><li><p>Building and deploying applications that leverage blockchain decentralization with regional data sovereignty needs.</p></li></ul><p>It is important to note that while the creation of an EU subnet would enable applications to be GDPR-compliant, developers and enterprises will need to take further measures to ensure that their applications meet all GDPR requirements.</p><p>You can join the discussion on the forum <a href="https://forum.dfinity.org/t/european-subnet-on-the-internet-computer-a-step-toward-gdpr-ready-infrastructure/25110" target="_blank" rel="noopener noreferrer">here</a>, and you can vote on the first proposal <a href="https://nns.ic0.app/proposal/?u=qoctq-giaaa-aaaaa-aaaea-cai&amp;proposal=126328" target="_blank" rel="noopener noreferrer">here</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-level-5">Developer Liftoff level 5<a href="#developer-liftoff-level-5" class="hash-link" aria-label="Direct link to Developer Liftoff level 5" title="Direct link to Developer Liftoff level 5">​</a></h2><p>The final level of the Developer Liftoff tutorial series has been published! In this final level, you can learn about the most advanced features of ICP, how to build dapps that utilize these features, and where to go to further your Developer Liftoff on your own. This level's tutorials cover:</p><ul><li><p><a href="/tutorials/developer-liftoff/level-5/5.1-vetKeys-tutorial">5.1 Developing an encrypted notes dapp with vetKeys</a>: The Internet Computer vetKeys feature provides developers with more enhanced privacy, encryption, threshold decryption, and security capabilities for their projects and dapps:</p><ul><li>What is vetKeys?<ul><li>Crypto primitives.</li><li>Public key encryption (PKE).</li><li>Identity based encryption (IBE).</li><li>vetKD.</li><li><a href="https://learn.internetcomputer.org/hc/en-us/articles/34209540682644-Subnet-Keys-and-Subnet-Signatures" target="_blank" rel="noopener noreferrer">BLS signatures</a>.</li></ul></li><li>vetKeys example dapp.<ul><li>Prerequisites.</li><li>Closing the <code>encrypted-notes-dapp-vetkd</code> example.</li><li>Setting up the project.</li><li>Reviewing the project's files.</li><li>Starting a local replica.</li><li>Deploying the Internet Identity canister.</li><li>Deploying the vetKD system API canister.</li><li>Deploying the encrypted notes backend canister.</li><li>Updating the generated canister interface bindings.</li><li>Deploying the frontend canister.</li><li>Starting the local development server.</li><li>Using the dapp.</li></ul></li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-5/5.2-ICP-ETH-tutorial">5.2 Developing a dapp using the IC Ethereum integration</a>: In this tutorial, you'll use the DFINITY IC ETH starter project to deploy a boilerplate dapp that showcases how the IC can query information from the Ethereum network using HTTPS outcalls:</p><ul><li>Deploying the ETH starter project.<ul><li>Project technology stack.</li><li>Prerequisites.</li><li>Downloading the starter project’s files.</li><li>Exploring the project's files.</li><li>Creating a testnet wallet.</li><li>Obtaining Sepolia testnet tokens.</li><li>Deploying the project.</li><li>Using the dapp.</li></ul></li><li>Going further.</li><li>Resources.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-5/5.3-token-swap-tutorial">5.3 Creating a decentralized token swap</a>: In this tutorial, you'll deploy a simple token swap canister that demonstrates how to deposit, swap, and withdraw tokens:</p><ul><li>Decentralized token swap canister.<ul><li>Prerequisites.</li><li>Cloning the <code>icrc2-swap</code> example.</li><li>Reviewing the project's files.</li><li>Starting a local replica.</li><li>Creating identities for <code>user_a</code> and <code>user_b</code>.</li><li>Deploying <code>token_a</code>.</li><li>Deploying <code>token_b</code>.</li><li>Exporting the token canister IDs as environmental variables.</li><li>Deploying the swap canister.</li><li>Depositing tokens into the swap canister.</li><li>Performing a token swap.</li><li>Withdrawing tokens.</li><li>Checking token balances.</li></ul></li></ul></li></ul><ul><li><p><a href="/tutorials/developer-liftoff/level-5/5.4-NFT-tutorial">5.4 Creating NFTs on the IC</a>: A <strong>non-fungible token</strong>, commonly referred to as an NFT, is a type of tokenized asset that is assigned a unique identifier that is used to distinguish one NFT from another:</p><ul><li>How do NFTs work?</li><li>NFT standards.<ul><li>DIP721.</li><li>ICRC-7.</li></ul></li><li>Creating and deploying an NFT.<ul><li>Prerequisites.</li><li>Cloning the <code>dip-721-nft-container</code> example.</li><li>Confirm your local identity.</li><li>Reviewing the project's files.</li><li>Starting a local replica.</li><li>Deploying the project’s canister.</li><li>Minting an NFT.</li><li>Transferring an NFT.</li><li>Querying the balance of NFTs for your user principal.</li><li>Querying the maximum amount of NFTs that can be minted.</li><li>Querying the NFT's metadata.</li><li>Querying token IDs owned by your user.</li><li>Querying the NFT’s information.</li><li>Querying the owner of a specific token ID.</li></ul></li><li>Resources.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-5/5.5-auction-tutorial">5.5 Creating an auction dapp</a>:</p></li><li><p>How does an auction work?</p></li><li><p>Creating an auction dapp.</p><ul><li>Prerequisites.</li><li>Cloning the <code>auction</code> example.</li><li>Reviewing the project's files.</li><li>Creating the backend canister.</li><li>Starting a local replica.</li><li>Deploying the project's canisters.</li><li>Using the dapp.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-5/5.6-next-steps">5.6 Next steps</a>: In this final tutorial, you'll learn about some of the different resources to help guide you further in your personal Developer Liftoff:</p><ul><li>Developer grants.</li><li>Developer bounties.</li><li>Hackathons.</li><li>ICP.Hubs.</li><li>Contributing to the IC.</li><li>Developer resources.</li></ul></li></ul><p>That'll wrap up this week's developer weekly update! See you next week!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 29, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/29/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/29/news-and-updates/update"/>
        <updated>2023-11-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to talk about a new version of PocketIC, an exciting development in the ICP ETH integration, and the upcoming ICRC-3 standard.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 29 2023" src="/assets/images/dev-update-blog-nov-29-66f574d47d33c425a4a412c4b896a38a.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome back to developer weekly! This week, we're excited to talk about a new version of PocketIC, an exciting development in the ICP ETH integration, and the upcoming ICRC-3 standard. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pocketic-v200">PocketIC v2.0.0<a href="#pocketic-v200" class="hash-link" aria-label="Direct link to PocketIC v2.0.0" title="Direct link to PocketIC v2.0.0">​</a></h2><p>PocketIC is a canister testing platform for Rust and Python canisters. A detailed blog post about PocketIC is coming soon, but for today's update we're excited to share that a new version of PocketIC has been released. In v2.0.0 of PocketIC, multi-subnet testing is now supported! With multi-subnet testing, canister deployments can be tested on different locally simulated subnets using the PocketIC Rust library. </p><p>For example, to create an ICP instance with two local application subnets and an NNS subnet, you can use the following code snippet: </p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> pic </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">PocketIcBuilder</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">new</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with_nns_subnet</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with_application_subnet</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with_application_subnet</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">build</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Then, to target the NNS subnet to create a canister, use the following piece of code:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> nns_sub </span><span class="token operator">=</span><span class="token plain"> pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">topology</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">get_nns_subnet</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">unwrap</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> nns_can_id </span><span class="token operator">=</span><span class="token plain"> pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">create_canister_on_subnet</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">...</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> nns_sub</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>To target one of the application subnets, use the code:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> app_sub_2 </span><span class="token operator">=</span><span class="token plain"> pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">topology</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">get_app_subnets</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token number">1</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> app_can_id </span><span class="token operator">=</span><span class="token plain"> pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">create_canister_on_subnet</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">...</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> app_sub_2</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Then, create a canister with a specific <code>canister_id</code> on a named subnet. A named subnet are subnets such as the NNS, SNS, II, or Bitcoin subnets:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> ledger_canister_id </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">Principal</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">from_text</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"ryjl3-tyaaa-aaaaa-aaaba-cai"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">unwrap</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">create_canister_with_id</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">...</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> ledger_canister_id</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">install_canister</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">ledger_canister_id</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">...</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can read more about this release of PocketIC on the forum <a href="https://forum.dfinity.org/t/pocketic-multi-subnet-canister-testing/24901" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cketh">ckETH<a href="#cketh" class="hash-link" aria-label="Direct link to ckETH" title="Direct link to ckETH">​</a></h2><p>An exciting development in the ICP ETH integration has been announced! DFINITY plans to submit NNS proposals to install the ckETH token this Friday, December 1st! </p><p>The ckETH code has been tested thoroughly on the ckSepoliaETH environment and working well for the past two months. Several internal security reviews have been executed to validate the code's integrity, and there have been no major security flaws or findings as a result of these reviews. </p><p>If the proposal is adopted, real mainnet ckETH would be available for anyone to use on ICP. This will alow for new workflows such as creating UIs for converting between ETH and ckETH, and in the future enable functionalities for ckERC20 and the upcoming EVM RPC canister. </p><p>You can vote on the proposal once it has been submitted via the <a href="https://nns.ic0.app/" target="_blank" rel="noopener noreferrer">NNS dapp</a>.</p><p>Additionally, you can learn more about ckETH on the forum post <a href="https://forum.dfinity.org/t/cketh-a-canister-issued-ether-twin-token-on-the-ic/22819/69" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icrc-3-standard">ICRC-3 standard<a href="#icrc-3-standard" class="hash-link" aria-label="Direct link to ICRC-3 standard" title="Direct link to ICRC-3 standard">​</a></h2><p>A second draft of the ICRC-3 standard has been finalized. The next step for this standard is for the working group to proceed with voting on the standard and if approved, create the NNS motion proposal to implement the standard. </p><p>The ICRC-3 standard will be used for accessing the block log of a ledger on ICP. The proposed standard specifics the following:</p><ul><li><p>A generic format for sharing the block log without losing information, including the fields that a block must contain.</p></li><li><p>A mechanism to verify the block log from the client side.</p></li><li><p>A way for future standards to define new transaction types compatible with ICRC-3.</p></li><li><p>Two new endpoints; one for getting blocks and one for getting the last block certification.</p></li></ul><p>You can read more about the proposed ICRC-3 standard in the specification document <a href="https://github.com/dfinity/ICRC-1/blob/c1cfd5fb2893134d90b48622166203b04c650233/standards/ICRC-3/README.md" target="_blank" rel="noopener noreferrer">here</a> and leave feedback on the forum <a href="https://forum.dfinity.org/t/icrc-3-draft-v2-and-next-steps/25132" target="_blank" rel="noopener noreferrer">here</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 22, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/22/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/22/news-and-updates/update"/>
        <updated>2023-11-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we dive into the new replica-signed queries feature, the new ICP JavaScript agent release, and episode 4 of the Developer Liftoff video series!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 22 2023" src="/assets/images/dev-update-blog-nov-22-31c6623688a860b223a861f2eb3b389f.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome to this week's edition of developer weekly! This week, we dive into the new replica-signed queries feature, the new <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a>` release, and episode 4 of the Developer Liftoff video series!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="replica-signed-queries">Replica-signed queries<a href="#replica-signed-queries" class="hash-link" aria-label="Direct link to Replica-signed queries" title="Direct link to Replica-signed queries">​</a></h2><p>This past week, we've rolled out our newest feature: replica-signed queries! This feature strives to enhance the trustworthiness of queries by providing signatures in query responses that provide a level of validation to better guarantee against malicious query attacks.</p><p>This feature includes two primary changes. First, the subnet state tree now exposes the public keys of the replicas. Then, query responses will now contain a signature that signs specific parts of the response using the replica's private key. The query response can be validated by fetching the replica's public key from the state tree, reading the public key of the signing replica, then verifying the signature.</p><p>You can read the full blog post that dives deeper into the feature <a href="/blog/features/replica-signed-queries">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-javascript-agent-v0200">ICP JavaScript agent <code>v.0.20.0</code><a href="#icp-javascript-agent-v0200" class="hash-link" aria-label="Direct link to icp-javascript-agent-v0200" title="Direct link to icp-javascript-agent-v0200">​</a></h2><p>To support replica-signed queries, a new version of the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> has been released, which introduces support for replica-signed queries amongst other new features and bug fixes. Some highlights from the release notes include:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-features">New features:<a href="#new-features" class="hash-link" aria-label="Direct link to New features:" title="Direct link to New features:">​</a></h3><ul><li><p>Node keys can now be fetched from subnet certificates.</p></li><li><p>Logic catches that throw errors are now retried.</p></li><li><p><code>canisterStatus</code> now shows subnet metrics.</p></li><li><p>Round ingress expiry is now enabled.</p></li><li><p>Nonce values have been removed from queries.</p></li><li><p><code>ExpirableMap</code> has been introduced and is used for subnet keys.</p></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes">Bug fixes:<a href="#bug-fixes" class="hash-link" aria-label="Direct link to Bug fixes:" title="Direct link to Bug fixes:">​</a></h3><ul><li><p>Fixed a bug where <code>canisterStatus</code> returned a full list of controllers.</p></li><li><p>Fixed a bug regarding <code>bigint</code> <code>toJson</code> trailing space.</p></li><li><p>Fixed a bug where service ordering must be alphabetical.</p></li></ul><p>You can read the full release notes <a href="https://github.com/dfinity/agent-js/releases/tag/v0.20.0" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-episode-04-introduction-to-canisters">Developer Liftoff episode 0.4: Introduction to canisters<a href="#developer-liftoff-episode-04-introduction-to-canisters" class="hash-link" aria-label="Direct link to Developer Liftoff episode 0.4: Introduction to canisters" title="Direct link to Developer Liftoff episode 0.4: Introduction to canisters">​</a></h2><p>The fourth video installment of the Developer Liftoff video series has been released! In this episode, developers are introduced to canisters, their architecture, and the different types of canisters that they'll come across in the Developer Liftoff.</p><p>You can watch the full video on YouTube here:</p><p><a href="https://www.youtube.com/watch?v=mwbRRk9T5Nw" target="_blank" rel="noopener noreferrer"><img loading="lazy" src="https://img.youtube.com/vi/mwbRRk9T5Nw/0.jpg" alt="ICP Developer Liftoff 0.4 | Introduction to Canisters" class="img_ev3q"></a></p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 15, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/15/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/15/news-and-updates/update"/>
        <updated>2023-11-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's issue, we're excited to talk about episode 3 of the ICP Developer Liftoff video series, the recent 'Let's Talk ICP-ETH integration' talk, and the latest Motoko release, v0.10.2.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 15 2023" src="/assets/images/dev-update-blog-nov-15-c5e98e05e439a09dd312ef8f1302cf24.jpg" width="1400" height="675" class="img_ev3q"></p><p>Good afternoon developers and welcome to this week's edition of developer weekly! In this week's issue, we're excited to talk about episode 3 of the ICP Developer Liftoff video series, the recent 'Let's Talk ICP-ETH integration' talk, and the latest Motoko release, v0.10.2. Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="episode-3-of-the-developer-liftoff-video-series">Episode 3 of the Developer Liftoff video series<a href="#episode-3-of-the-developer-liftoff-video-series" class="hash-link" aria-label="Direct link to Episode 3 of the Developer Liftoff video series" title="Direct link to Episode 3 of the Developer Liftoff video series">​</a></h2><p>Episode 3 of the video series corresponding to the Developer Liftoff tutorial series is now live on the DFINITY YouTube channel! In this episode, we walk through how to set up your developer environment by installing IC SDK, Node.js, and getting familiar using a command line interface through gaining a basic introduction to using CLI commands.</p><p>New episodes of the Developer Liftoff are released every week, and will correspond to each tutorial included in the Developer Liftoff series on the <a href="/tutorials/developer-liftoff/">developer documentation</a>.</p><p>You can find the video tutorial on YouTube <a href="https://t.co/X9nF5k9zFF" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="lets-talk-icp-eth-integration-cketh-evm-world-computer-and-more">Let’s talk ICP-ETH integration: ckETH, EVM world computer and more<a href="#lets-talk-icp-eth-integration-cketh-evm-world-computer-and-more" class="hash-link" aria-label="Direct link to Let’s talk ICP-ETH integration: ckETH, EVM world computer and more" title="Direct link to Let’s talk ICP-ETH integration: ckETH, EVM world computer and more">​</a></h2><p>In addition to the Developer Liftoff video, another great educational asset has been published on the DFINITY YouTube channel this past week: 'Let’s talk ICP-ETH integration: ckETH, EVM world computer and more'! This video features an insightful, in-depth discussion about the upcoming ICP-ETH integration, featuring Kyle Langham,  Director of Data and Analytics at DFINITY, Jan Camenisch, CTO of DFINITY</p><p>Lomesh Dutta, VP of Growth at DFINITY, Manu Drijvers, Director of Engineering at DFINITY, Marcin Kaźmierczak, COO at Redstone Oracles, and Max Chamberlin, CEO of BITFINITY. You'll definitely want to give this one a listen!</p><p>You can find the full talk on YouTube <a href="https://www.youtube.com/watch?v=JuwHREhrsTc" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-v0102">Motoko v0.10.2<a href="#motoko-v0102" class="hash-link" aria-label="Direct link to Motoko v0.10.2" title="Direct link to Motoko v0.10.2">​</a></h2><p>This week, Motoko version 0.10.2 was released! Some important takeaways from the release notes include:</p><ul><li><p>A breaking change where values of type <code>Principal</code> are now constrained to contain at most 29 bytes. This matches ICP's notion of a principal. In this change specifically:</p><ul><li><p>An actor import will be rejected if the binary representation of the aliased textually encoded principal contains more than 29 bytes.</p></li><li><p><code>Principal.fromBlob(b)</code> will trap if <code>b</code> contains more than 29 bytes.</p></li><li><p>The actor literal (actor <code>&lt;exp&gt;</code>) will trap if the binary representation of the textually encoded principal <code>&lt;exp&gt;</code> contains more than 29 bytes.</p></li></ul></li><li><p>A bug fix to separate <code>tag</code> from <code>underscore</code> in coverage warnings.</p></li><li><p>Code compiled for targets WASI (-wasi-system-api) and pure Wasm (-no-system-api) can now use up to 4GB of stable memory.</p></li><li><p>A bug fix to fully implement Region.loadXXX/storeXXX for <code>Int8</code>, <code>Int16</code>, and <code>Float</code>.</p></li><li><p>A bug fix in <code>motoko-base</code> that fixes <code>Array.tabulateVar</code> to avoid repeated side effects.</p></li></ul><p>You can read the full release notes <a href="https://github.com/dfinity/motoko/releases/tag/0.10.2" target="_blank" rel="noopener noreferrer">here</a>.</p><p>That'll wrap up this week's developer weekly update, be sure to tune in next week!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Announcing replica-signed queries]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/replica-signed-queries</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/replica-signed-queries"/>
        <updated>2023-11-14T19:10:10.000Z</updated>
        <summary type="html"><![CDATA[To enhance the trustworthiness of queries by providing better guarantees against attacks, we're excited to announce the release of replica-signed queries!]]></summary>
        <content type="html"><![CDATA[<p>When an update call is made to a canister on the Internet Computer, the response to it includes a subnet signature that proves the data sent within the request is trustworthy. Query calls, however, are handled by single replicas and don't bear any information that validates their response is trustworthy, since their data could be tampered with by a malicious replica or malicious boundary node. As a workaround, certified data and certified variables can be used, which are embedded in responses to query calls that provide a layer of validation. However, using certified data and variables requires extra work for developers and sometimes does not fit into a developer's workflow seamlessly.</p><p>To enhance the trustworthiness of queries by providing better guarantees against attacks, we're excited to announce the release of replica-signed queries!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-are-replica-signed-queries">What are replica-signed queries?<a href="#what-are-replica-signed-queries" class="hash-link" aria-label="Direct link to What are replica-signed queries?" title="Direct link to What are replica-signed queries?">​</a></h2><p>Replica-signed queries are a new feature that introduces replica signatures in query responses. Every response to query call will contain a signature that signs specific parts of the response using the replica's private key. Then, query responses can be validated by fetching the replica's public key from the subnet's state tree, reading the public key of the signing replica, then verifying the signature.</p><p>This new feature includes two primary changes: first, the subnet state tree now exposes the public keys of the replicas, then query responses will now contain a signature.</p><p>Having a single replica signature in a query response doesn't completely solve the problem that query responses cannot be trusted, however, replica-signed queries do help improve the security of queries since the recipient can validate that the response came from a replica on the correct subnet. The primary goal of this feature is to provide better guarantees against malicious boundary nodes, since replica-signed queries make it impossible for a malicious boundary node to return false data.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-do-replica-signed-queries-work">How do replica-signed queries work?<a href="#how-do-replica-signed-queries-work" class="hash-link" aria-label="Direct link to How do replica-signed queries work?" title="Direct link to How do replica-signed queries work?">​</a></h2><p>First, a list of node IDs and their corresponding public keys is put into the subnet's state tree so that they can be certified by the subnet. Users can obtain the certificate to validate the node's keys through an HTTPS <code>read_state</code> call that includes a timestamp value.</p><p>To support replica-signed queries, the query response format has been changed. The response to a query call adds a list with one signature for the returned response produced by the ICP node that evaluated the query call.</p><p>If the call is replied to, the <code>reply</code> field is included. If the call is rejected, the <code>error_code</code>, <code>reject_code</code>, and <code>reject_message</code> fields will be included in the response.</p><p>If the query call resulted in a reply, the response is a CBOR (see <a href="/references/ic-interface-spec#cbor">CBOR</a>) map with the following fields:</p><ul><li><p><code>status (text)</code>: "replied".</p></li><li><p><code>reply</code>: a CBOR map with the field arg (blob) which contains the reply data.</p></li><li><p><code>signatures ([+ node-signature])</code>: a list containing one node signature for the returned query response.</p></li></ul><p>If the call resulted in a reject, the response is a CBOR map with the following fields:</p><ul><li><p><code>status (text)</code>: "rejected".</p></li><li><p><code>reject_code (nat)</code>: The reject code (see Reject codes: /references/ic-interface-spec#reject-codes).</p></li><li><p><code>reject_message (text)</code>: a textual diagnostic message.</p></li><li><p><code>error_code (text)</code>: an optional implementation-specific textual error code (see Error codes: /references/ic-interface-spec#error-codes).</p></li><li><p><code>signatures ([+ node-signature])</code>: a list containing one node signature for the returned query response.</p></li></ul><p>The query's signature (whose type is denoted as node-signature) is a <a href="/references/ic-interface-spec#cbor">CBOR</a> (see CBOR) map with the following fields:</p><ul><li><p><code>timestamp (nat)</code>: the timestamp of the signature.</p></li><li><p><code>signature (blob)</code>: the actual signature.</p></li><li><p><code>identity (principal)</code>: the principal of the node producing the signature.</p></li></ul><p>The actual parts that are signed include the query response from the execution layer, the timestamp and the request ID of the query, which is a SHA256 hash of the query's contents. With this <code>request_id</code> value, signatures for one query cannot be confused or exchanged for another.</p><p>Query response verification is done via agents, such as the <a href="https://docs.rs/ic-agent/latest/ic_agent/" target="_blank" rel="noopener noreferrer">ICP Rust agent</a> and <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a>, and other agents developed by members of the ICP community. Agents now introduce a new <code>AgentError</code> type that indicates a verification failure.</p><p>replica-signed queries are supported in the <a href="https://docs.rs/ic-agent/latest/ic_agent/" target="_blank" rel="noopener noreferrer">ICP Rust agent</a> <a href="https://github.com/dfinity/agent-rs/releases" target="_blank" rel="noopener noreferrer">versions v0.30.0</a> and newer.</p><p>replica-signed queries are supported in the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> <a href="https://github.com/dfinity/agent-js/releases" target="_blank" rel="noopener noreferrer">versions v0.20.0</a> and newer.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-are-query-responses-verified">How are query responses verified?<a href="#how-are-query-responses-verified" class="hash-link" aria-label="Direct link to How are query responses verified?" title="Direct link to How are query responses verified?">​</a></h2><p>To verify a replica-signed query, first the agent requests the path <code>/subnet</code> in a read state call that is separate to <code>/api/v2/canister/&lt;effective_canister_id&gt;/read_state</code> to get the certificate. A boundary node routes this call to the subnet that hosts the canister. A subnet's state tree only contains the keys of its own nodes. All node keys are cached.</p><p>Then, to verify the certificate, the timestamp stored at <code>/time</code> of the node keys will be checked to assure that the nodes are still within the subnet. The agent can look up the key of the node that is present in the query response signature, either from the cache or the <code>read_state</code> response. Once the node's public key is obtained, the client can verify the signature against the hash of the response's relevant fields.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-to-use-replica-signed-queries">How to use replica-signed queries<a href="#how-to-use-replica-signed-queries" class="hash-link" aria-label="Direct link to How to use replica-signed queries" title="Direct link to How to use replica-signed queries">​</a></h2><p>On ICP, the replica has already begun producing signatures on query responses.</p><p>To use the <a href="https://docs.rs/ic-agent/latest/ic_agent/" target="_blank" rel="noopener noreferrer">ICP Rust agent</a>, signature verification on query responses is enabled by default on versions v0.30.0 and newer. Tools such as dfx will be updated to use the latest version of the <a href="https://docs.rs/ic-agent/latest/ic_agent/" target="_blank" rel="noopener noreferrer">ICP Rust agent</a> in the next release (v0.15.2).</p><p>To use the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a>, existing applications will need to update their <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> version to v0.20.0 and newer. dfx always uses the <code>@latest</code> version of the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a>, meaning new applications will automatically have signature verification enabled on query responses.</p><p>Older versions of the agents will automatically ignore the <code>signature</code> field.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2><p>In conclusion, replica-signed queries are a new feature that aims to provide a level of trustworthiness to query calls by preventing attacks that may alter the response of a query call.</p><p>Replica-signed queries are available in the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> <a href="https://github.com/dfinity/agent-js/releases" target="_blank" rel="noopener noreferrer">versions v0.20.0</a> and newer, the <a href="https://docs.rs/ic-agent/latest/ic_agent/" target="_blank" rel="noopener noreferrer">ICP Rust agent</a> <a href="https://github.com/dfinity/agent-rs/releases" target="_blank" rel="noopener noreferrer">versions v0.30.0</a> and newer, and dfx <a href="https://github.com/dfinity/sdk/releases" target="_blank" rel="noopener noreferrer">versions v0.15.2</a> and newer.</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 8, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/08/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/08/news-and-updates/update"/>
        <updated>2023-11-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this issue, we're excited to talk about the planned ICP events for DevConnect 2023 next week, the PocketIC testing library, and introduce the 'Zero to Dapp' educational series!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 8 2023" src="/assets/images/dev-update-blog-nov-8-58e87a853dc41f341346a284e6749259.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello devs! Welcome to this week's developer weekly update. In this issue, we're excited to talk about the planned ICP events for DevConnect 2023 next week, the PocketIC testing library, and introduce the 'Zero to Dapp' educational series! </p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-at-devconnect-2023">ICP at DevConnect 2023<a href="#icp-at-devconnect-2023" class="hash-link" aria-label="Direct link to ICP at DevConnect 2023" title="Direct link to ICP at DevConnect 2023">​</a></h2><p>Next week, ICP will be at DevConnect 2023 in Istanbul! There are several ICP events planned, so if you'll be at the event be sure to stop by! </p><p>Here's the full schedule of events:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="wednesday-november-15-2023">Wednesday, November 15, 2023:<a href="#wednesday-november-15-2023" class="hash-link" aria-label="Direct link to Wednesday, November 15, 2023:" title="Direct link to Wednesday, November 15, 2023:">​</a></h3><p><strong>Cross-Chain Hacker's Den</strong>: Come join ICP in this hacker-house style event, filled with discussions about ICP's cross-chain capabilities. There will be chances to submit bounties and win prizes! </p><p>You can sign up <a href="https://lu.ma/HackersDen" target="_blank" rel="noopener noreferrer">here</a>.</p><p><strong>Threshold Crypto Day</strong>: A one-day conference for learning, exploration, and networking that covers threshold cryptography research, engineering, product, and more. </p><p>You can sign up <a href="https://lu.ma/ThresholdCryptoday" target="_blank" rel="noopener noreferrer">here</a>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="thursday-november-16-2023">Thursday, November 16, 2023:<a href="#thursday-november-16-2023" class="hash-link" aria-label="Direct link to Thursday, November 16, 2023:" title="Direct link to Thursday, November 16, 2023:">​</a></h3><p><strong>ETH Pragma</strong>: Pragma is a one-day event for high-quality talks and discussions for leaders, builders, and developers within the Ethereum ecosystem. This event will feature DFINITY Founder Dominic Williams as a roundtable speaker, and also include an ICP booth location. </p><p>You can purchase a ticket <a href="https://ethglobal.com/events/pragma-istanbul" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="pocketic">PocketIC<a href="#pocketic" class="hash-link" aria-label="Direct link to PocketIC" title="Direct link to PocketIC">​</a></h2><p>Introducing PocketIC! PocketIC is a testing library that enables a canister testing suite for Rust and Python canisters. It supports deterministic and programmatic canister testing through a lightweight infrastructure that can be seamlessly integrated with existing testing infrastructures such as <code>cargo test</code>. </p><p>PocketIC runs as a standalone binary on macOS and Linux systems without needing to run additional containers or virtual machines.</p><p>Here's an example canister test written using PocketIC:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">use</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">candid</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain">encode_one</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token class-name">Principal</span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">use</span><span class="token plain"> </span><span class="token namespace" style="color:#26D76D">pocket_ic</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token class-name">PocketIc</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token attribute attr-name" style="color:#F8F8F2">#[test]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">test_counter_canister</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> pic </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">PocketIc</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">new</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// Create an empty canister as the anonymous principal.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> canister_id </span><span class="token operator">=</span><span class="token plain"> pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">create_canister</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">None</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">add_cycles</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">canister_id</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token number">1_000_000_000_000_000</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> wasm_bytes </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#26D76D">load_counter_wasm</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">...</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">install_canister</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">canister_id</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> wasm_bytes</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token macro property">vec!</span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token class-name">None</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// 'inc' is a counter canister method.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:#26D76D">call_counter_canister</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token operator">&amp;</span><span class="token plain">pic</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> canister_id</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"inc"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// Check if it had the desired effect.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> reply </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#26D76D">call_counter_canister</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token operator">&amp;</span><span class="token plain">pic</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> canister_id</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"read"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property">assert_eq!</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">reply</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token class-name">WasmResult</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token class-name">Reply</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token macro property">vec!</span><span class="token punctuation" style="color:#F1EEF5">[</span><span class="token number">0</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:#F1EEF5">]</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">call_counter_canister</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">pic</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token operator">&amp;</span><span class="token class-name">PocketIc</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> canister_id</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">Principal</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> method</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token operator">&amp;</span><span class="token keyword" style="color:#EB318A">str</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">WasmResult</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    pic</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">update_call</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">canister_id</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token class-name">Principal</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">anonymous</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> method</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token function" style="color:#26D76D">encode_one</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">unwrap</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">expect</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"Failed to call counter canister"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>PocketIC allows for versatile, custom control over execution environments to run specific tests, such as providing functionality to manipulate the stable memory of a canister and test canister upgrade. It provides the ability to create reproducible test executions, as non-deterministic components of the replica such as networking and <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus</a>, are replaced with deterministic counterparts for testing. It also allows for fast test execution since networking related timeouts are removed.</p><p>You can learn more about PocketIC and ask questions in the forum post discussion <a href="https://forum.dfinity.org/t/pocketic-fast-and-versatile-canister-testing-in-rust-and-python/23793/" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="zero-to-dapp-education-series">Zero to Dapp education series<a href="#zero-to-dapp-education-series" class="hash-link" aria-label="Direct link to Zero to Dapp education series" title="Direct link to Zero to Dapp education series">​</a></h2><p>Introducing the new Zero to Dapp education series! This series is the latest education initiative through a collaboration with Encode Club to help onboard new developers onto the ICP. </p><p>This series will contain 8 live, online sessions to teach developers about the fundamentals of the Internet Computer. Topics for this series include:</p><ol><li>The Internet Computer Protocol</li><li>Canisters — Smart Contracts on steroids</li><li>Internet Identity — A secure and privacy preserving identity for all services</li><li>Connecting canisters to the Web with HTTPS Outcalls — No Oracles required</li><li>The Bitcoin Direct Integration &amp; ckBTC — Bringing smart contracts to Bitcoin</li><li>Unlocking More Awesomeness — Dive Deeper with These Resources</li><li>IC Developer Grantee Showcase</li><li>Hackathon Success Stories and Ideation</li></ol><p>The programme launches on November 14, 2023 and will run through December 2023. Attendees that attend the majority of the sessions will receive an NFT certificate of completion that makes a great LinkedIn or CV asset! </p><p>You can register for the series <a href="https://encodeclub.typeform.com/icpedu23q4reg" target="_blank" rel="noopener noreferrer">here</a>. </p><p>Want to read the full announcement? Head over to <a href="https://www.blog.encode.club/announcing-the-zero-to-dapp-educate-series-learn-and-build-on-the-internet-computer-b264abefd451" target="_blank" rel="noopener noreferrer">Medium</a> for the full blog post. </p><p>That'll wrap up this week's developer weekly update! See you next week!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update November 1, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/01/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/11/01/news-and-updates/update"/>
        <updated>2023-11-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this update, we announce the publication of the Developer Liftoff level 4 documentation, a handful of other documentation updates, and a new ledger method for retrieving your account identifier.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="November 1 2023" src="/assets/images/dev-update-blog-nov-1-f536e0733722bc191d9a3161d3660383.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome to this week's developer weekly update! In this update, we announce the publication of the Developer Liftoff level 4 documentation, a handful of other documentation updates, and a new ledger method for retrieving your account identifier. Let's dive in!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-level-4">Developer Liftoff level 4<a href="#developer-liftoff-level-4" class="hash-link" aria-label="Direct link to Developer Liftoff level 4" title="Direct link to Developer Liftoff level 4">​</a></h2><p>This week, the Space Pilot level of the Developer Liftoff series was published! In this level, developers learn about tokens such as ICP and ICRC-1, how to deploy and use their respective ledgers, and how to use the ICP Bitcoin integration. This level also covers ICP's form of governance through the NNS and the CLI tool quill that can be used to interact with the ICP ledger, ckBTC, and the NNS.
Here's the full breakdown of level 4:</p><ul><li><p><a href="/tutorials/developer-liftoff/level-4/4.1-icp-ledger">4.1 Using the ICP ledger</a>: In this tutorial, we'll dive into how to deploy a local instance of the ICP ledger canister and how to interact with it:</p><ul><li>Accounts.</li><li>Transaction types.</li><li>Deploying the ICP ledger locally.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Locating the Wasm and Candid files.</li><li>Creating a <code>minting</code> account.</li><li>Deploying the canister.</li></ul></li><li>Interacting with the ICP ledger canister.<ul><li>Using <code>dfx ledger</code>.</li><li>Using <code>dfx canister</code>.</li><li>Using the Candid UI.</li></ul></li><li>Resources.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-4/4.2-icrc-tokens">4.2 ICRC-1 tokens</a>: For developers to create their own fungible tokens on the Internet Computer, the ICRC-1 token standard can be used. For this tutorial, we'll focus on the ICRC-1 standard, ICRC-1 ledger, and briefly look into the ICRC-2 standard:</p><ul><li>What’s the difference between the ICP and ICRC-1 ledgers?<ul><li><code>Account</code>s versus <code>AccountIdentifier</code>s.</li><li>Endpoints.</li></ul></li><li>Index canisters.</li><li>Extensions of the standard.</li><li>Metadata.</li><li>Deploying the ICRC-1 ledger locally.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Locating the Wasm and Candid files.</li><li>Deploying the ICRC-1 ledger on the mainnet.</li></ul></li><li>Interacting with the ICRC-1 ledger.<ul><li>Using the <code>dfx canister</code> command with ICRC-1 endpoints.</li><li>Using ICRC-2 endpoints.</li><li>Using the Candid UI.</li></ul></li><li>Resources.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-4/4.3-ckbtc-and-bitcoin">4.3 ckBTC and Bitcoin integration</a>: One of the key features of the Internet Computer is known as <strong>chain-key cryptography</strong>. This feature enables integrations with other networks, such as the Bitcoin network. In this tutorial, we take a look at ckBTC and the Internet Computer's Bitcoin integration:</p><ul><li>Bitcoin integration architecture.</li><li>What is ckBTC?</li><li>Bitcoin use cases on ICP.</li><li>Deploying a Bitcoin dapp.<ul><li>Prerequisites.</li><li>Setting up a local Bitcoin network.</li><li>Cloning the <code>basic_bitcoin</code> example.</li><li>Deploying the example canister.</li><li>Generating a Bitcoin address.</li><li>Receiving BTC.</li><li>Checking your BTC balance.</li><li>Sending BTC.</li></ul></li><li>Resources.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-4/4.4-nns-governance">4.4 NNS governance and staking</a>: The Network Nervous System (NNS) is the governing body of the Internet Computer. It is a decentralized autonomous organization that is hosted fully onchain and is responsible for making protocol-level upgrades to ICP:</p><ul><li>What is the NNS?<ul><li>Neurons.</li><li>Proposals.</li></ul></li><li>Why is the NNS important to developers?</li><li>Using the NNS dapp.<ul><li>Transferring ICP tokens into your Internet Identity <code>Main</code> account.</li><li>Staking ICP in a neuron.</li><li>Interacting with NNS proposals.</li></ul></li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-4/4.5-using-quill">4.5 Using quill</a>: Quill is a ledger and governance toolkit that provides support for self-custody of ICP tokens and functionality to interact with the NNS, SNSs, and ICP ledger from a <strong>cold wallet</strong>:</p><ul><li>What is quill?</li><li>Downloading and installing quill.</li><li>Using quill’s basic commands.</li><li>Using quill with ckBTC.</li><li>Using quill with the NNS.</li><li>Resources.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-4/4.6-motoko-lvl4">4.6 Motoko level 4</a>: In this final Motoko module of the Developer Liftoff series, we'll cover the following Motoko concepts and components:</p><ul><li>Mutable state.<ul><li>Immutable variables versus mutable variables.</li><li>Reading data from mutable memory.</li><li>Immutable arrays.</li><li>Mutable arrays.</li></ul></li><li>Local objects and classes.<ul><li>Object classes versus actor classes.</li><li>Object types.</li><li>Object subtyping.</li><li>Object classes.</li><li>Data arguments.</li></ul></li><li>Message inspection.</li><li>Errors and options.<ul><li>Error handling best practices.</li><li>Error reporting with <code>Option</code> values.</li><li>Error reporting with <code>Result</code> variants .</li><li>Asynchronous errors.</li></ul></li><li>Resources.</li></ul></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-account_identifier-method-for-the-ledger">New <code>account_identifier</code> method for the ledger<a href="#new-account_identifier-method-for-the-ledger" class="hash-link" aria-label="Direct link to new-account_identifier-method-for-the-ledger" title="Direct link to new-account_identifier-method-for-the-ledger">​</a></h2><p>A new method for the ICP ledger is available. This method, <code>account_identifier</code> is used to return your account identifier. Before, developers had to get the SHA224 hash for their <code>principal</code> and <code>subaccount_identifier</code>, then prepend this value with the CRC32 value to get their account identifier. This method does this work behind the scenes for you, so there is no longer a risk of getting a wrong identifier due to incorrect byte manipulation.</p><p>You can view the reference documentation for the ledger <a href="/references/ledger#_accounts">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="documentation-updates">Documentation updates<a href="#documentation-updates" class="hash-link" aria-label="Direct link to Documentation updates" title="Direct link to Documentation updates">​</a></h2><p>This week, the developer docs saw several updates, which include:</p><ul><li>Publication of the six documents that make up <a href="/tutorials/developer-liftoff/level-4/">Level 4 of the Developer Liftoff</a>.</li><li>The <a href="/references/ledger#_accounts">ledger reference documentation</a> has been updated to include the new <code>account_identifier</code> method.</li><li>A new document on the canister history feature has been created.</li><li>A new community-contributed JavaScript signature verification library has been added to the documentation for independently verifying signatures.</li><li>The playground documentation has been updated to include instructions for how to create a custom local playground instance.</li></ul><p>That'll wrap things up for this week! See everyone in the next issue of developer weekly!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - SDK]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-sdk</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-sdk"/>
        <updated>2023-10-27T17:49:35.000Z</updated>
        <summary type="html"><![CDATA[In this issue, we sat down with the SDK team to talk all things IC SDK and the upcoming Cycles Ledger feature! For most IC devs, the IC SDK is at the center of their workflow, so I'm sure many of you have been looking forward to this team spotlight!]]></summary>
        <content type="html"><![CDATA[<p>Hey devs and welcome to this edition of ICP team spotlight! In this issue, we sat down with the SDK team to talk all things IC SDK and the upcoming Cycles Ledger feature! For most IC devs, the IC SDK is at the center of their workflow, so I'm sure many of you have been looking forward to this team spotlight! With that, let's dive into the interview. </p><p><strong>To get started, let's get a brief overview of the team. What is the purpose of the SDK team?</strong></p><p><em>To provide tools that make building on the Internet Computer fast, easy, and fun.</em></p><p><strong>What is the composition of the SDK team?</strong></p><p><em>The SDK team includes six engineers, a technical writer, a research scientist, and an engineering manager.</em></p><p><strong>On a fundamental level, what is the IC SDK? What are the components of it?</strong></p><p><em>The IC SDK is a command line interface that provides a developer with everything they need to locally run an instance of the internet computer for development purposes. It comes with a copy of the replica, a command line tool to build and install canisters, and many utilities. Some such utilities are:</em></p><ul><li><p><em>Cycles management</em></p></li><li><p><em>Interacting with the ICP ledger</em></p></li><li><p><em>Uploading frontend assets</em></p></li><li><p><em>The Asset (frontend) Canister</em></p></li><li><p><em>Project templates for quick starts</em></p></li><li><p><em>And so on</em></p></li></ul><p><em>The SDK team is also responsible for maintaining the Rust and JavaScript agents, as well as the Rust Canister Development Kit (CDK).</em>   </p><p><strong>It sounds like the SDK is definitely designed to set up devs with everything they need to get started! How does the IC SDK fit into ICP’s stack? What layer does it primarily operate on?</strong></p><p><em>The IC SDK is how most developers will interact with the Internet Computer. Rather than implementing the Internet Computer interface specification from scratch, most applications will use DFX and the Rust or JavaScript agent to make their calls to canisters.</em></p><p><em>SDK team code runs in every ICP website, inside the service worker, in all the Rust canisters running on ICP, and in most Continuous Integration jobs. We depend on builds of the replica, new releases of the Motoko compiler, and any new updates to the internet computer specification.</em></p><p><strong>What is the process of creating a project using the IC SDK?</strong></p><p>*Once the IC SDK has been downloaded and installed, the process of creating a project is simple. You can use the <code>dfx new</code> command to guide you through the process of bootstrapping a new project. You can decide on the language you’d like to use, whether or not you’d like to incorporate a frontend (UI), and add a number of supported integrations using the <code>dfx deps</code> feature.**</p><p><strong>The SDK team has several important projects in the pipeline. What project do you think developers are the most excited about?</strong></p><p><em>Developers have been waiting for our answer to the shortcomings of the Cycles Wallet for a long time. We know it has been a pain point, and we’ve felt this pain ourselves. Luckily, we are really close to finishing work on the Cycles Ledger, which will make working with Cycles drastically easier. We want developers to be able to focus on the fun stuff (their own application!), and so one of our goals is to abstract away as much of the boring, complicated stuff as possible. This is one instance where we feel that we have done  that successfully.</em></p><p><strong>I'm sure devs are just as excited about the Cycles Ledger as the team is! What are the primary components of this project?</strong></p><p><em>We built an entirely new ledger canister that allows for Cycles accounting.</em></p><p><strong>When can we expect the Cycles Ledger to be completed?</strong></p><p><em>The end of the year. It will be our holiday gift to you :)</em></p><p><strong>I'm sure that since the IC SDK is such a fundamental part of the developer experience, the SDK team must interact with other teams quite frequently. How does the SDK team work with other teams?</strong></p><p><em>There are a number of “sister” teams to SDK, such as Execution and Runtime. We rely on the code shipped by them (replica) and they also rely on us for developer-driven feedback that helps us make the replica (and underlying platform) better in all aspects.</em></p><p><em>We also occasionally work with other teams when there is a cross-functional initiative going on. One example was when the Service Nervous System was developed. SDK worked closely with the SNS team to ensure that the tooling provided met all of the specifications.</em></p><p><strong>What feature of the IC SDK do developers benefit from the most? What features are solely quality of life features for developers?</strong></p><p>*Developers rely on many dfx functions to perform critical tasks and obtain important information. One example is the <code>dfx deploy</code> command - this command seems simple, but there is a lot going on beneath the hood that allows your code to be deployed to the mainnet. <code>dfx ledger</code> commands are another great example of simple commands that go a long way in terms of impact.**</p><p><strong>The SDK team is pretty involved with the dev community on the forum and Discord server, which I'm sure has lead to features derived as a result of community feedback. What are some of the improvements made as a direct result of developer feedback?</strong></p><p><em>Lots! We built the <a href="https://dx.internetcomputer.org" target="_blank" rel="noopener noreferrer">developer feedback board</a> a while back, and every two weeks, our internal focus group meets to go over the latest items and check-in on the progress we’ve made addressing others. One thing that's come as a result of the feedback received is the <code>dfx</code> version manager. Developers expressed that they want a way to switch <code>dfx</code> versions easily. We spent some time working out how best to accomplish that, and the <code>dfx</code> version manager was born. Another example is the Cycles Ledger - we heard feedback that the Cycles Wallet was a pain to use and developers wanted a better solution. We are continuously looking for ways to improve our tooling, so keep the feedback coming!</em></p><p><strong>Where should developers look for the latest SDK updates?</strong></p><p><em>The Developer Blog is a great place to look for updates 🙂. We also post important updates and discussions in the forum - that is a great place to take part in discussions that shape what we ultimately develop.</em></p><p><strong>What is one feature or aspect of the IC SDK that the team is the most proud of?</strong></p><p><em>We take pride in everything we do, and we go to great lengths to make sure that the code we ship is stable and reliable. I am personally proud of our track record of reliability. We have over 150 checks in our CI workflow, and that includes end to end tests, unit tests, and smoke tests that we run across multiple platforms.</em></p><p><strong>That is definitely something to be proud of! To wrap things up, what makes the SDK team unique compared to some of the other dev teams at DFINITY?</strong></p><p><em>We are almost entirely remote and spread geographically across 4 time zones. This gives us the unique advantage of being able to interact with our developer community (almost) around the clock.</em></p><p>A huge thank you to the SDK team for chatting with us today and giving us some great insight into the IC SDK! Be sure to tune in next time for another team spotlight post! </p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 25, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/10/25/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/10/25/news-and-updates/update"/>
        <updated>2023-10-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to share the first video tutorial in the Developer Liftoff series, announce the name for the dfx version manager, and take a look at the details of a proposed new workflow for SNS launches.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 25 2023" src="/assets/images/dev-update-blog-oct-25-b7b572ddca9076c16b43d3cdbe021e21.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome back to developer weekly! This week, we're excited to share the first video tutorial in the Developer Liftoff series, announce the name for the <code>dfx</code> version manager, and take a look at the details of a proposed new workflow for SNS launches.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-video-series">Developer Liftoff video series<a href="#developer-liftoff-video-series" class="hash-link" aria-label="Direct link to Developer Liftoff video series" title="Direct link to Developer Liftoff video series">​</a></h2><p>In previous dev updates, we've introduced the Developer Liftoff documentation series and provided updates when new 'levels' of the tutorial series have been published. In today's update, we're excited to share that the first video corresponding to the documentation has been released!</p><p>The first video, <strong>ICP Developer Liftoff 0.1 | Overview of the Internet Computer</strong> corresponds to the very first page in the Developer Liftoff series, which can be found <a href="/tutorials/developer-liftoff/level-0/ic-overview">here</a>.</p><p>New videos will be released every week, and will follow each page of the Developer Liftoff documentation - that means there will be a total of 36 videos!</p><p>The first video can be found on the DFINITY Youtube channel:</p><p><a href="https://youtu.be/oBUpJ4CqmN0?si=q5r223tFnWoZTMGz" target="_blank" rel="noopener noreferrer"><img loading="lazy" src="https://img.youtube.com/vi/oBUpJ4CqmN0/0.jpg" alt="ICP Developer Liftoff 0.1 | Overview of the Internet Computer" class="img_ev3q"></a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-version-manager-name-decision"><code>dfx</code> version manager name decision<a href="#dfx-version-manager-name-decision" class="hash-link" aria-label="Direct link to dfx-version-manager-name-decision" title="Direct link to dfx-version-manager-name-decision">​</a></h2><p>Last week, we asked for your feedback on naming an upcoming tool known as the <code>dfx</code> version manager. The results are in, and a name has been decided!</p><p>The <code>dfx</code> version manager will be called <strong>dfxvm</strong>.</p><p>Stay tuned for more updates on this new tool!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="proposed-new-sns-workflow">Proposed new SNS workflow<a href="#proposed-new-sns-workflow" class="hash-link" aria-label="Direct link to Proposed new SNS workflow" title="Direct link to Proposed new SNS workflow">​</a></h2><p>Recently, a new SNS hand-off workflow has been proposed on the developer forum. This new workflow has been proposed because there has been a high amount of friction during the canister hand-off process, especially when handing off the SNS's asset canister.</p><p>For an SNS to be launched, the dapp's canisters must be handed over from the developers to the SNS itself. Prior to August 2023, this process included the following steps:</p><ul><li><p>An SNS is first approved to be launched through an NNS proposal.</p></li><li><p>The dapp's canisters are then created and initialized, with the SNS governance canister's ID being publicly known.</p></li><li><p>Then, developers hand over the dapp's canisters to the SNS.</p></li><li><p>The SNS root canister is set as the controller of the canisters, and the SNS's proposal methods are configured so that they can only be called by the governance canister.</p></li><li><p>Lastly, an NNS proposal is used to start the SNS decentralization swap and launch the SNS.</p></li></ul><p>This process was amended in August 2023 to simplify and condense several steps, ultimately providing an SNS to be created through a single NNS proposal. In this revised workflow, the dapp's canisters are handed over from the developers to the NNS, then an NNS proposal creates the SNS canisters, initializes them, hands them over to the SNS, then starts the decentralization swap and launches the SNS.</p><p>This is how the SNS process currently operates.</p><p>The newly proposed workflow takes this current workflow and adds an additional step where once the SNS is launched, the SNS community upgrades the dapp's canisters through an SNS proposal. Within this upgrade, they can set the privileges within the dapp appropriately.</p><p>You can read more about this proposed workflow and provide your thoughts on the <a href="https://forum.dfinity.org/t/handing-over-dapp-canisters-to-an-sns-dao/23877" target="_blank" rel="noopener noreferrer">developer forum</a>.</p><p>That'll wrap up this week. Tune back in next week for more developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 18, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/10/18/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/10/18/news-and-updates/update"/>
        <updated>2023-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we'll take a look at a new AI tool on the developer documentation, the latest level of the Developer Liftoff series, and ask for your feedback on naming a new tool!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 18 2023" src="/assets/images/dev-update-blog-oct-18-c71540f8f852a950f95aef2d61f90eef.jpg" width="1400" height="675" class="img_ev3q"></p><p>This week, we'll take a look at a new AI tool on the developer documentation, the latest level of the Developer Liftoff series, and ask for your feedback on naming a new tool!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-docs-ask-ai-chat-bot">Developer docs 'Ask AI' chat bot<a href="#developer-docs-ask-ai-chat-bot" class="hash-link" aria-label="Direct link to Developer docs 'Ask AI' chat bot" title="Direct link to Developer docs 'Ask AI' chat bot">​</a></h2><p>This past week, ICP developer docs got a new exciting widget addition: an AI chat widget! This AI chat widget uses an LLM trained on the ICP wiki, developer docs, and developer forum, to provide answers to questions and help developers find resources. Additionally, developers have given the DFINITY team valuable feedback on other resources that the LLM should be trained on. That feedback can be found and submitted in the forum post <a href="https://forum.dfinity.org/t/use-an-llm-to-help-build-on-icp-feedback-appreciated/23804" target="_blank" rel="noopener noreferrer">here</a></p><p>This chat widget is powered by <a href="https://www.kapa.ai/" target="_blank" rel="noopener noreferrer">Kapa.ai</a>, which hosts the LLM data off-chain. The ICP website, however, is fully onchain.</p><p>An example question might be, "What is ckBTC?", in which, the AI replies with a generated area such as:</p><p><img loading="lazy" alt="AI chat bot" src="/assets/images/ai-chat-3c7c7c033c086ab473474ba35c86b4a9.png" width="1344" height="1504" class="img_ev3q"></p><p>Try it yourself on the <a href="/">developer docs</a> by clicking the 'Ask AI' button!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-level-3">Developer Liftoff level 3<a href="#developer-liftoff-level-3" class="hash-link" aria-label="Direct link to Developer Liftoff level 3" title="Direct link to Developer Liftoff level 3">​</a></h2><p>Level 3 of the <a href="/tutorials/developer-liftoff/">Developer Liftoff tutorial series</a> is now live on the developer docs! In level 3, we cover Motoko package managers, HTTPS outcalls, certified data, agents, and Internet Identity. A full breakdown can be found below:</p><ul><li><p><a href="/tutorials/developer-liftoff/level-3/3.1-package-managers">3.1 Motoko package managers.</a>: To use packages developed outside of the Motoko base library, a Motoko package manager can be used. This module covers:</p><ul><li>What is a package manager?</li><li>Installing Mops.</li><li>Installing Vessel.</li><li>Using Mops.<ul><li>Creating a new project.</li><li>Configuring your project to use Mops.</li><li>Initializing Mops.</li><li>Adding packages to <code>mops.toml</code>.</li></ul></li><li>Publishing a package.</li><li>Using Vessel.</li><li>Importing packages into your Motoko code.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-3/3.2-https-outcalls">3.2 Using HTTPS outcalls.</a>: HTTPS outcalls are a feature of canisters on ICP that allow smart contracts to directly make calls to HTTP servers that are external to ICP. This module covers:</p><ul><li>Supported HTTP methods.</li><li>Cycles.</li><li>HTTPS outcalls API.</li><li>HTTP <code>GET</code>.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Creating an HTTP <code>GET</code> request.</li><li>Calling the HTTP <code>GET</code> request.</li></ul></li><li>HTTP <code>POST</code>.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Creating an HTTP <code>POST</code> request.</li><li>Calling the HTTP <code>POST</code> request.</li></ul></li></ul></li></ul><ul><li><p><a href="/tutorials/developer-liftoff/level-3/3.3-certified-data">3.3 Certified data.</a>: Certified data utilizes <strong>chain-key cryptography</strong> at the canister level to generate a digital signature that can be validated using a permanent, public key that belongs to the Internet Computer, whose private key counterpart is constantly distributed across many different nodes on the network. This module covers:</p><ul><li>How data is certified.<ul><li>Data certificates.</li><li>How canisters certify data.</li><li>Certified data API methods.</li></ul></li><li>How Developers can certify data.<ul><li>Certified data Motoko module.</li><li>Certified data Rusk CDK module.</li></ul></li><li>Generating an HTTP response.<ul><li>Example.</li></ul></li><li>Using certified variables.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Creating an HTTP request.</li><li>Interacting with certified variables.</li></ul></li><li>Resources.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-3/3.4-intro-to-agents">3.4 Introduction to agents.</a>: On the Internet Computer, an <strong>agent</strong> is a library used to make calls to ICP's public interface. This module covers:</p><ul><li>What does an agent do?<ul><li>Structuring data.</li><li>Decoding data.</li><li>Managing authentication.<ul><li>Accepted identities.</li></ul></li></ul></li><li>Available agents.</li><li>Using the JavaScript agent.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Generating Candid declarations.</li><li>Creating the JavaScript agent.</li><li>Using the agent.</li></ul></li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-3/3.5-identities-and-auth">3.5 Identities and authentication.</a>: When developing on the Internet Identity, there are several types of identities and methods of authentication that you'll encounter. This module covers:</p><ul><li>Types of identity.</li><li>Internet Identity.<ul><li>Internet Identity architecture.</li><li>What is a passkey?</li></ul></li><li>Creating an Internet Identity.</li><li>Integrating an Internet Identity into your app.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Creating an actor.</li><li>Importing the <code>auth-client</code> package.</li><li>Pulling the Internet Identity canister.</li><li>Interacting with the integration.</li></ul></li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-3/3.6-motoko-lvl3">3.6 Motoko level 3.</a>: In this Motoko level, we'll look into caller identification, adding access control with identities, plus other non-identity related functionalities such as pattern matching and periodic tasks. This module covers:</p><ul><li>Principals and caller identification.</li><li>Adding access control with identities.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Creating an owner identity.</li><li>Writing backend code with access control.</li><li>Interacting with the dapp.</li></ul></li><li>Pattern matching.</li><li>Periodic timers.</li></ul></li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-version-manager"><code>dfx</code> version manager<a href="#dfx-version-manager" class="hash-link" aria-label="Direct link to dfx-version-manager" title="Direct link to dfx-version-manager">​</a></h2><p>We need your feedback!</p><p>An upcoming tool, currently known as the <code>dfx</code> version manager, needs a name! There is an ongoing naming thread on the forum that can be found <a href="https://forum.dfinity.org/t/dfx-version-manager-naming-thread/23665" target="_blank" rel="noopener noreferrer">here</a>.</p><p>The <code>dfx</code> version manager will be a tool designed to simplify and improve installing and using different versions of <code>dfx</code> locally. Currently, switching between different versions is clunky and can cause discrepancies within your local environment. The <code>dfx</code> version manager will provide a solution to this common developer pain point.</p><p>That'll wrap things up for this week, be sure to check back in next time!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 11, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/10/11/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/10/11/news-and-updates/update"/>
        <updated>2023-10-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we'll talk about updates to ckBTC, the ic-js library, and increased subnet storage and resource reservation.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 11 2023" src="/assets/images/dev-update-blog-oct-11-6804b17418d68fe14793255ea8e25c88.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello everyone and welcome to DFINITY developer weekly! This week, we'll talk about updates to ckBTC, the <code>ic-js</code> library, and increased subnet storage and resource reservation. Let's dive in!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ckbtc-now-supports-icrc-2-standards">ckBTC now supports ICRC-2 standards<a href="#ckbtc-now-supports-icrc-2-standards" class="hash-link" aria-label="Direct link to ckBTC now supports ICRC-2 standards" title="Direct link to ckBTC now supports ICRC-2 standards">​</a></h2><p>The ledger, index, and archive canisters for ckBTC have been upgraded to now support the ICRC-2 standard! As part of this upgrade, the ckBTC minter has also been upgraded to support a simpler flow for transferring ckBTC into BTC. In this new minter workflow, the minter can be authorized to take ckBTC and use it to obtain BTC using the new <code>retrieve_btc_with_approval</code> endpoint instead of sending ckBTC to a minter-controlled subaccount.</p><p>You can read the full details on the DFINITY <a href="https://forum.dfinity.org/t/ckbtc-a-canister-issued-bitcoin-twin-token-on-the-ic-1-1-backed-by-btc/17606/166" target="_blank" rel="noopener noreferrer">forum</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icpicrc-ledger-breaking-changes">ICP/ICRC ledger breaking changes<a href="#icpicrc-ledger-breaking-changes" class="hash-link" aria-label="Direct link to ICP/ICRC ledger breaking changes" title="Direct link to ICP/ICRC ledger breaking changes">​</a></h2><p>Recently, the <code>ic-js</code> library has undergone breaking changes. Part of these changes include relocating ICP ledger features previously included in the package <code>@dfinity/nns</code> to <code>@dfinity/ledger-icp</code> and moving the ICRC ledger features to <code>@dfinity/ledger-icrc</code>. The <code>@dfinity-ledger</code> package will be deprecated and retired in the future.</p><p>Essentially, as a result of these changes, the <code>@dfinity/ledger-icp</code> package encompasses the ICP ledger functions, and the <code>@dfinity/ledger-icrc</code> package encompasses functions for ICRC tokens, ckBTC, and SNSes.</p><p>The full details can be found on the forum <a href="https://forum.dfinity.org/t/breaking-changes-in-ledger-icrc-icp-javascript-libraries/23465?utm_source=weekininternetcomputer.beehiiv.com&amp;utm_medium=referral&amp;utm_campaign=week-in-internet-computer-icp-news-oct-7-2023" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="increased-subnet-storage-capacity-and-resource-reservation">Increased subnet storage capacity and resource reservation<a href="#increased-subnet-storage-capacity-and-resource-reservation" class="hash-link" aria-label="Direct link to Increased subnet storage capacity and resource reservation" title="Direct link to Increased subnet storage capacity and resource reservation">​</a></h2><p>The subnet storage capacity has been increased from 450GiB to 700GiB as of replica version <code>76fd768b</code>. This increase is the first significant milestone in the movement to push the subnet storage capacity toward terabytes rather than gigabytes.</p><p>In addition to this storage increase, a new resource reservation mechanism is designed to enable consistent, long-term use of storage for nodes running on application subnets by making it more expensive for inconsistent, high spikes of usage, and keeping costs the same for consistent, long-term users. This for application subnets only because system subnets and verified application subnets do not need protection from sudden, unexpected, large spikes in storage usage.</p><p>This new mechanism has been added to <code>dfx</code> through the new fields <code>reserved_cycles</code> and <code>reserved_cycles_limits</code>. Check out this <a href="https://forum.dfinity.org/t/increasing-subnet-storage-capacity-and-introducing-resource-reservation-mechanism/23447" target="_blank" rel="noopener noreferrer">forum post</a> for the full information and how these changes work.</p><p>That'll wrap it up for this week, until next time!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Financial integration]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-fi</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-fi"/>
        <updated>2023-10-10T19:56:33.000Z</updated>
        <summary type="html"><![CDATA[For this spotlight showcase, we're going to dive into the financial integration (FI) team, also known as the team behind the development of ICP ledgers and token standards.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Financial integration team spotlight" src="/assets/images/dev-update-blog-FI-642abe60d69f884b0217e23154bb9f7a.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello ICP developers and welcome to another DFINITY team spotlight! For this spotlight showcase, we're going to dive into the financial integration team, also known as the team behind the development of ICP ledgers and token standards. With all of the recent ICRC and ckBTC developments, and the upcoming ckETH feature, now is the perfect time to get to know the FI team! Let's get started!</p><p><strong>To dive right in, what is the purpose of the Financial Integration team?</strong></p><p><em>The Financial Integration team contributes to ICP as follows:</em></p><ul><li><p><em>The development of the Ledgers and the standards around fungible tokens.</em></p></li><li><p><em>Onchain integration with other blockchains (e.g., Bitcoin and Ethereum).</em></p></li><li><p><em>Off-chain integration, such as integration with Binance, Coinbase, and many other financial tools.</em></p></li></ul><p><strong>What is the composition of the Financial Integration team?</strong></p><p><em>The team is composed of 5 developers and 1 researcher.</em></p><p><strong>Tokens and tokenomics are are essential concepts for blockchains. On a fundamental level, what role do tokens and tokenomics play on ICP?</strong></p><p><em>The Internet Computer's utility token is ICP, named after the Internet Computer Protocol. This utility token is used for several functions within the network, such as staking to participate in the governance of the network, for getting cycles powering canister smart contracts, or the protocol rewards independent node providers (NPs) with newly minted ICP tokens for having their sovereign nodes contribute to the protocol.  There are various other tokens that the community has created or governance tokens that were created in the process of decentralizing dapps by means of SNSes. Similar to the ICP token, SNS communities use SNS tokens to govern their dapp in a decentralized fashion.</em></p><p><strong>Could you explain the difference between ICP, an ICRC token, and an ICRC-1 token? When would developers use one over another?</strong></p><p><em>The Internet Computer has two key canisters for managing tokens: the ICP Ledger and the ICRC Ledgers. The ICP Ledger primarily handles the ICP token, while the ICRC Ledgers manage various fungible tokens like ckBTC, ckEth, SNSes, etc., using the ICRC-1 fungible token standard. ICRC-1 provides a common standard for fungible tokens and addresses the need for uniformity, as various non-compatible interfaces had emerged alongside the ICP Ledger. To create this standard, a community working group was formed, resulting in the ICRC-1 Fungible Token Standard.</em></p><p><em>Following ICRC-1, ICRC-2 was introduced to enhance the standard by incorporating "approve" and "transfer_from" operations, akin to Ethereum's ERC-20 standard. This change makes ICRC-2 Ledgers more familiar to those coming from the Ethereum ecosystem. Looking ahead, ICRC-3 is in development and will extend ICRC-1 by allowing the download and verification of Ledger blocks.</em></p><p><em>The ICRC Ledger is designed to implement ICRC-1, ICRC-2, and ICRC-3, providing a comprehensive solution for token management. In contrast, the ICP Ledger supports ICRC-1 and ICRC-2 but cannot accommodate ICRC-3 due to fundamental differences in how it stores accounts. This standardization effort aims to streamline token interfaces on ICP and enhance interoperability while catering to different user needs and backgrounds.</em></p><p><strong>Thank you for that detailed explanation, I think that's extremely insightful for our developers and community to know the history behind the different tokens and their standards. Could you talk a bit about the ICP ledger, and how is it different from the ICRC ledger?</strong></p><p><em>There are two noteworthy differences:</em></p><ol><li><em>Accounts vs AccountIdentifier: The main one is the way accounts are stored in the Ledgers. Accounts can hold tokens on the Ledger and they are represented by a Principal, which is the owner of the account, and an optional subaccount. Subaccounts allow a Principal to own multiple Accounts on a Ledger.</em></li></ol><p><em>On the ICP Ledger, Accounts are obfuscated to prevent linking the owner with them. The obfuscated version of Account is called AccountIdentifier and is the hash of the Account together with the subaccount information.</em></p><p><em>On the ICRC Ledgers, Accounts are not obfuscated so the link between the principal and the accounts that it controls is in clear.</em></p><ol start="2"><li><em>Standards supported and additional API: The ICRC Ledger will support all the ICRC fungible token standards (ICRC-1, ICRC-2 and ICRC-3) together with some utility endpoints. The ICP Ledger supports only ICRC-1 and ICRC-2 as discussed above but has a lot of legacy endpoints.</em></li></ol><p><strong>In addition to tokens using the ICRC standards, ICP also supports 'twin tokens', or 'ck' tokens. What are ‘ck’ tokens, like ckBTC or ckETH?</strong></p><p><em>Chain-Key (ck) tokens are a family of twin tokens 1:1-backed by the original token on the original chain and fully automated via canisters. A twin token is “twin to” a token from another chain, e.g. ckBTC is the twin token of BTC and ckETH is the twin token of ETH.</em></p><p><em>Ck tokens are safer than traditional wrapped tokens (e.g., soBTC) because they are fully automated, don’t rely on any central entity or multi-sig setup, and the canisters running the code are under NNS control.</em></p><p><em>Ck tokens are also much faster and cheaper than the counterparts on other chains. For instance, ckBTC makes it possible to use BTC for small payments because the transaction time is a few seconds and the transaction fee is negligible. Another important point is that, by design, the fee is paid directly in the token, you don’t have to worry about having another token to pay for gas, it’s a huge improvement in terms of UX.</em></p><p><strong>How do tokens like ckBTC or ckETH fit into the ecosystem? What makes them groundbreaking for developers?</strong></p><p><em>Ck tokens allow using existing assets such as BTC and ETH on ICP. The conversion from the original token to the ck counterpart is easy.</em></p><p><em>What makes ck tokens groundbreaking is a combination of two properties:</em></p><ul><li><p><em>The tokens run at the speed and with the fee of tokens on ICP. Transferring ckBTC is much faster and cheaper than transferring BTC to the point where BTC can be used for daily transactions, such as paying for a coffee.</em></p></li><li><p><em>Ck tokens are converted from and to the original tokens via a smart contract controlled by a DAO.</em></p></li></ul><p><strong>How do tokens on ICP differ from how other chains use or create tokens?</strong></p><p><em>As said previously, cheap, no need to have another token to pay for gas, allows you to port your token to whole new way of using them as the Internet Computer’s capabilities are unique.</em></p><p><strong>Let's transition to talking a bit more about the team itself. How does the Financial integration team work with other teams?</strong></p><p><em>We collaborate with most teams at the application level, such as the NNS team and the GIX team. Our canisters are used in the NNS and SNSes; the frontend developed by the GIX team uses our canisters as backends.</em></p><p><strong>What’s the biggest challenge the team has faced?</strong></p><p><em>The proliferation of standards on ICP and the creation of a common fungible token standard known as ICRC-1.</em></p><p><strong>Have there been any improvements made as a direct result of developer feedback?</strong></p><p><em>Plenty of improvements have been made as a result of developer feedback. We also created a working group to meet with the community about improvements and feedback.</em></p><p><strong>Let's talk about the team's current focus and road map. What is the primary project that the team is working on or focused on currently?</strong></p><p><em>ckETH, cycles-ledger, ICRC-2 and ICRC-3.</em></p><p><strong>What are the primary components of this project?</strong></p><p><em>The Ledger.</em></p><p><strong>What are the primary benefits of this project?</strong></p><ul><li><p><em>Ck tokens for Ethereum tokens.</em></p></li><li><p><em>A Ledger for cycles allowing users to hold cycles.</em></p></li><li><p><em>ICRC-2 for a better flow with all Ledgers.</em></p></li><li><p><em>ICRC-3 to retrieve the blocks from a Ledger.</em></p></li></ul><p><strong>When can we expect the project to be completed?</strong></p><p><em>Sometime soon. The team is focusing on scalability, performance and developer experience at the moment.</em></p><p><strong>Where should developers look for the latest updates from the team?</strong></p><p><em>The <!-- -->[ICRC]<!-- --> working group and the forum.</em></p><p><strong>What makes the Financial Integration team unique compared to some of the other dev teams at DFINITY?</strong></p><p><em>Our focus <!-- -->[is]<!-- --> on off-chain, onchain and cross-chain integration.</em></p><p>Thanks so much for tuning into this week's team spotlight, and a huge thank you to the Financial Integration team for taking the time to sit down with us for this interview!</p><p>We'll see you all next time!</p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing `dfx deploy --playground`!]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/dfx-deploy-playground</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/dfx-deploy-playground"/>
        <updated>2023-10-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today we're excited to announce a new dfx subcommand — `dfx deploy --playground`!]]></summary>
        <content type="html"><![CDATA[<p>Today we're excited to announce a new <code>dfx</code> subcommand: <code>dfx deploy --playground</code>!</p><p><code>--playground</code> (or <code>--network playground</code>) is a new network flag for the <code>dfx deploy</code> command that deploys the project's canister(s) to the playground's canister pool instead of deploying them to the local replica (<code>--network local</code>) or the mainnet network (<code>--network ic</code>).</p><div class="admonition_WoCw admonitionInfo_zoGt"><p>Deploying to the playground is ICP's equivalent of deploying to a testnet network.</p><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="24" height="24" rx="12" fill="#29ABE2"></rect><g clip-path="url(#a)"><path d="M12 5.333A6.674 6.674 0 0 1 18.667 12 6.674 6.674 0 0 1 12 18.667 6.674 6.674 0 0 1 5.333 12 6.674 6.674 0 0 1 12 5.333ZM12 4a8 8 0 1 0 0 16 8 8 0 0 0 0-16Zm0 3.833a.834.834 0 1 1-.001 1.669.834.834 0 0 1 0-1.669ZM13.332 16h-2.666v-.667c.322-.119.666-.134.666-.49v-2.978c0-.356-.344-.412-.666-.531v-.667h2v4.177c0 .357.344.372.666.49V16Z" fill="#fff"></path></g><defs><clipPath id="a"><path fill="#fff" transform="translate(4 4)" d="M0 0h16v16H0z"></path></clipPath></defs></svg></div><p>When this flag is used, the canisters are deployed in a manner where they borrow resources from the playground's canister pool. The playground provides developers with an environment where canisters can be deployed and tested quickly without needing to manage cycles.</p><p><code>dfx deploy --playground</code> is available in <code>dfx</code> versions v0.15.1 and above.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-this-means-for-developers">What this means for developers<a href="#what-this-means-for-developers" class="hash-link" aria-label="Direct link to What this means for developers" title="Direct link to What this means for developers">​</a></h2><p>Since the <code>dfx deploy --playground</code> feature doesn't require additional configuration, developers can get up and running with very few prerequisites, making the on-boarding of new developers more seamless than before. For existing developers, this provides a new way for canisters to be tested, since canisters deployed to the playground are deployed on the mainnet, but do not cost cycles that the developer must pay. This means developers can run short tests using mainnet resources, without actually having to set up a well-funded and permanent identity. </p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="using-dfx-deploy---playground">Using <code>dfx deploy --playground</code><a href="#using-dfx-deploy---playground" class="hash-link" aria-label="Direct link to using-dfx-deploy---playground" title="Direct link to using-dfx-deploy---playground">​</a></h2><p>To deploy a canister to the playground, first create a new <code>dfx</code> project with the command, or navigate into an existing project's directory. For the sake of this example, we'll create a new project:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx new hello_world</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>This command will create a new default <code>dfx</code> project, which contains a simple 'Hello, world!' sample.</p><p>Then, to deploy this canister to the playground, run the command:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx deploy --playground</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Once deployed, the canister can be interacted with using a command such as:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx canister --network playground call hello_world_backend greet '("everyone")'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>This command calls the <code>hello_world_backend</code> canister that has been deployed to the playground using the <code>--network</code> flag, since the playground is classified as a deployment network. </p><p><em>Any commands that intend to target a canister deployed to the playground must use the <code>--playground</code> or <code>--network playground</code> flag in order to target the borrowed canister(s).</em></p><p>Since the canister has been deployed to the playground, it is important to know the limitations that canisters deployed with the <code>--playground</code> flag will be subject to. These restrictions are:</p><ul><li>Cycle transfer instructions are silently ignored by the playground.</li><li>Wasm files can't be gzipped.</li><li>Wasm files will be analyzed to remove any potentially expensive/malicious operations.</li><li>Canisters can use at most 1GB of memory.</li><li>Canisters can call the management canister to manage itself without being the controller.</li><li>Deployed canisters expire after 20 minutes.</li></ul><p>As always, we'd love to hear your thoughts and feedback on this new feature, so please feel free to let us know through our <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">community forum</a> or <a href="https://discord.internetcomputer.org" target="_blank" rel="noopener noreferrer">Discord</a> server. </p><p>-DFINITY</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update October 4, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/10/04/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/10/04/news-and-updates/update"/>
        <updated>2023-10-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have a wide variety of updates for you, including a proposal to deprecate the Service Worker, a new dfx release, and a new sample project that showcases ckBTC in a point of sale environment.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="October 4 2023" src="/assets/images/dev-update-blog-sept-20-21e77dfe1af07e3c4964439bb0831128.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome to this week's developer weekly update! This week, we have a wide variety of updates for you, including a proposal to deprecate the Service Worker, a new <code>dfx</code> release, and a new sample project that showcases ckBTC in a point of sale environment.</p><p>Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sns-office-hours">SNS office hours<a href="#sns-office-hours" class="hash-link" aria-label="Direct link to SNS office hours" title="Direct link to SNS office hours">​</a></h2><p>This week, we introduce a new office hour dedicated to SNSes! During this office hour, SNS teams and community members can join a call together to discuss technical questions regarding SNSes with the DFINITY team.</p><p>These office hour sessions will be every other Wednesday at 5PM GMT+2 / 8AM PST. Each session will be 30 minutes, and will begin on October 18th. The sessions will last through the end of November, for a total of 4 sessions.</p><p>You can find more information on the <a href="https://forum.dfinity.org/t/announcing-sns-office-hours/23506" target="_blank" rel="noopener noreferrer">forum post here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="proposal-to-deprecate-the-service-worker">Proposal to deprecate the Service Worker<a href="#proposal-to-deprecate-the-service-worker" class="hash-link" aria-label="Direct link to Proposal to deprecate the Service Worker" title="Direct link to Proposal to deprecate the Service Worker">​</a></h2><p>Last week, a <a href="/blog/features/deprecating-the-service-worker">new post here</a> on the Dev Blog announced a proposal to deprecate the Service Worker in favor of replacing it with the ICX Proxy hosted on the boundary nodes. The benefits of this proposal include:</p><ul><li>Enhanced user experience.</li><li>Faster initial page loading.</li><li>Consistent branding.</li><li>Availability.</li><li>Reduced cognitive load.</li><li>Providing features for progressive web apps.</li><li>Content encoding.</li><li>Lighthouse support.</li></ul><p>To migrate away from the Service Worker, the roadmap for this proposal includes milestones in creating alternative HTTP gateways, federated HTTP gateways, and decentralized HTTP gateways.</p><p>You can read the full proposal <a href="/blog/features/deprecating-the-service-worker">here</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0151"><code>dfx v0.15.1</code><a href="#dfx-v0151" class="hash-link" aria-label="Direct link to dfx-v0151" title="Direct link to dfx-v0151">​</a></h2><p>This week, <code>dfx v0.15.1</code> has been released, which includes a very anticipated feature: deploy to playground!</p><p>We've been hyping up this feature for several weeks now, since it creates an easy on-ramp to deploying canisters without needing cycles or setting up local identities, simply by using the <code>--network playground</code> flag.</p><p>In addition to the deploy to playground feature, other features in this release include:</p><ul><li><p>Support for <code>reserved_cycles</code> and <code>reserved_cycles_limit</code>: the output of <code>dfx canister status</code> now displays the reserved cycles balance and limit for a canister. Limits for a canister can be set using <code>dfx canister create --reserved-cycles-limit &lt;LIMIT&gt;</code> and <code>dfx canister update-settings --reserved-cycles-limit &lt;LIMIT&gt;</code>.</p></li><li><p>Emit management canister IDL when imported by Motoko canister, which will automatically produce the IDL in the <code>.dfx</code> folder.</p></li><li><p>Support for the <code>--version</code> tag for <code>dfx extension install</code>, allowing for a specific version of an extension to be installed.</p></li><li><p>Updated handling of missing values in state tree certificates.
The Unknown lookup of a path in a certificate results in an AgentError (ICP returns Absent for non-existing paths).</p></li><li><p>The flag <code>--ic</code> can now be used as shorthand for <code>--network ic</code>.</p></li></ul><p>The full release notes can be found <a href="https://github.com/dfinity/sdk/blob/50a0e25c58962e0b4a840798c0912c60dc107c57/CHANGELOG.md" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ic-pos">IC-POS<a href="#ic-pos" class="hash-link" aria-label="Direct link to IC-POS" title="Direct link to IC-POS">​</a></h2><p>This week, a new sample application has been added to the DFINITY <code>examples</code> repo! This example showcases a real-world use case for ckBTC that creates a point of sale application, allowing users to accept payments in ckBTC.</p><p>This app includes features such as:</p><ul><li><p>Creating a store that users can configure with products to sell. Users can log into their store with their Internet Identity.</p></li><li><p>Functionality to charge customers by entering an amount, then generating a QR code that the customer can scan to pay. The QR code follows the ICRC-22 standard.</p></li><li><p>Functionality to send tokens, where users can send ckBTC to other users.</p></li><li><p>Notifications that can be sent whenever a payment is received. These notifications use HTTPS outcalls to send emails or SNS notifications.</p></li><li><p>Functionality to display transaction history of all transactions made within the store.</p></li></ul><p>This example has a <a href="https://github.com/dfinity/examples/tree/master/motoko/ic-pos" target="_blank" rel="noopener noreferrer">full documentation tutorial</a> showcasing how to setup and deploy the project.. Additionally, the project's code can be found within the DFINITY examples repo <a href="https://github.com/dfinity/examples/tree/master/motoko/ic-pos" target="_blank" rel="noopener noreferrer">here</a>.</p><p>That'll wrap things up for this week! We'll see everyone again for the next issue of developer weekly!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Proposal to deprecate the Service Worker]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/deprecating-the-service-worker</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/deprecating-the-service-worker"/>
        <updated>2023-09-27T11:57:01.000Z</updated>
        <summary type="html"><![CDATA[The DFINITY Foundation would like to propose deprecating the Internet Computer Service Worker in favor of ICX Proxy on the DFINITY hosted Boundary Nodes. We believe that this change will have dramatic improvements to end user and developer experience while reducing complexity in the Internet Computer’s HTTP Gateway Protocol, without reducing security or changing trust assumptions.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2><p>The DFINITY Foundation would like to propose deprecating the Internet Computer Service Worker in favor of ICX Proxy on the DFINITY hosted <a href="https://learn.internetcomputer.org/hc/en-us/articles/34212818609684-ICP-Edge-Infrastructure" target="_blank" rel="noopener noreferrer">Boundary Nodes</a>. We believe that this change will have dramatic improvements to end user and developer experience while reducing complexity in the Internet Computer’s <a href="/references/ic-interface-spec#http-gateway">HTTP Gateway Protocol</a>, without reducing security or changing trust assumptions.</p><p>Keep reading to learn more about why we believe this is the right path forward and the roadmap that we are suggesting for this transition.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="background">Background<a href="#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2><p>In order to comprehend why DFINITY is proposing to deprecate the Service Worker in favor of other HTTP Gateway Protocol implementations, we must first grasp the intricacies of the HTTP Gateway Protocol. This includes recognizing how each implementation works, along with their respective advantages and disadvantages.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="the-http-gateway-protocol">The HTTP Gateway Protocol<a href="#the-http-gateway-protocol" class="hash-link" aria-label="Direct link to The HTTP Gateway Protocol" title="Direct link to The HTTP Gateway Protocol">​</a></h3><p>The Internet Computer Protocol, unlike many other modern blockchains, possesses the unique ability to host and serve traditional websites. This functionality is made possible through the use of the HTTP Gateway Protocol. This subprotocol defines how end users can access the Internet Computer network using a standard web browser.</p><p>The HTTP Gateway Protocol has three primary functions:</p><ul><li>It converts standard HTTP requests into a format recognized by the Internet Computer Protocol.</li><li>It validates the authenticity of responses originating from the Internet Computer network.</li><li>It transforms responses from Internet Computer Protocol into a universally recognized HTTP response format.</li></ul><p>Presently, there are three distinct implementations of this protocol: the Service Worker, ICX Proxy and the <a href="https://forum.dfinity.org/t/try-out-the-ic-http-proxy-a-leap-towards-decentralized-http/20357" target="_blank" rel="noopener noreferrer">HTTP Proxy</a>. We’ll now delve into further detail of how each of these respective implementations work - first up is the Service Worker.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="the-service-worker">The Service Worker<a href="#the-service-worker" class="hash-link" aria-label="Direct link to The Service Worker" title="Direct link to The Service Worker">​</a></h3><p>The Service Worker operates on <code>{canisterId}.ic0.app</code> and <code>{canisterId}.icp0.io</code> URLs as well as <a href="/building-apps/frontends/custom-domains/using-custom-domains">Boundary Node hosted custom domains</a>. For example, Internet Identity can be accessed via the Service Worker using the following URLs:</p><ul><li><a href="https://rdmx6-jaaaa-aaaaa-aaadq-cai.ic0.app/" target="_blank" rel="noopener noreferrer">rdmx6-jaaaa-aaaaa-aaadq-cai.ic0.app</a></li><li><a href="https://rdmx6-jaaaa-aaaaa-aaadq-cai.icp0.io/" target="_blank" rel="noopener noreferrer">rdmx6-jaaaa-aaaaa-aaadq-cai.icp0.io</a></li><li><a href="https://identity.internetcomputer.org/" target="_blank" rel="noopener noreferrer">identity.internetcomputer.org</a></li></ul><p>When an end user loads any of these URLs, their web browser sends a request to an Internet Computer Boundary Node. This node will then download the Service Worker into the end user’s browser for installation. Once installed, the Service Worker is able to intercept HTTP requests made by a dapp’s frontend code and carry out the necessary HTTP Gateway functions.</p><p>This approach to the HTTP Gateway Protocol has supported convenient and secure adoption of web applications built on the Internet Computer Protocol. However, it does come with many downsides that we’ll talk about more later on in this post. For now though, let’s talk more about ICX Proxy.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icx-proxy">ICX Proxy<a href="#icx-proxy" class="hash-link" aria-label="Direct link to ICX Proxy" title="Direct link to ICX Proxy">​</a></h3><p>ICX Proxy is a remote HTTP Gateway that serves canisters on <code>{canisterId}.raw.ic0.app</code> and <code>{canisterId}.raw.icp0.io</code>. For example, Internet Identity can be accessed through ICX Proxy with these URLs:</p><ul><li><a href="https://rdmx6-jaaaa-aaaaa-aaadq-cai.raw.ic0.app/" target="_blank" rel="noopener noreferrer">rdmx6-jaaaa-aaaaa-aaadq-cai.raw.ic0.app</a></li><li><a href="https://rdmx6-jaaaa-aaaaa-aaadq-cai.raw.icp0.io/" target="_blank" rel="noopener noreferrer">rdmx6-jaaaa-aaaaa-aaadq-cai.raw.icp0.io</a></li></ul><p>Similar to the Service Worker, a web request sent to these URLs will be received by an Internet Computer Boundary Node. The difference with ICX Proxy however is that the HTTP Gateway functions are performed entirely on the Boundary Node server.</p><p>This approach has many advantages over the Service Worker, which we will discuss further later in this post. Before that though, let’s talk a bit more about the HTTP Proxy.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="http-proxy">HTTP Proxy<a href="#http-proxy" class="hash-link" aria-label="Direct link to HTTP Proxy" title="Direct link to HTTP Proxy">​</a></h3><p>The HTTP Proxy is a desktop application that can be downloaded and installed by an end user. Once installed, it will run in the background and proxy traffic at a system level. It will intercept requests made to Internet Computer Boundary Nodes while bypassing all other requests. This allows the HTTP Proxy to implement the HTTP Gateway Protocol functions entirely locally, without relying on any remote servers.</p><p>In terms of security, this is far superior to both ICX Proxy and the Service Worker. To understand why, let’s talk more about the difference between local and remote HTTP Gateways.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="local-vs-remote-http-gateways">Local vs remote HTTP Gateways<a href="#local-vs-remote-http-gateways" class="hash-link" aria-label="Direct link to Local vs remote HTTP Gateways" title="Direct link to Local vs remote HTTP Gateways">​</a></h3><p>The Service Worker is known as a “local” HTTP Gateway because it performs translation and validation of requests and responses locally on the end user’s computer, whereas ICX Proxy is known as a “remote” HTTP Gateway because it performs those functions on a remote server hosted in a data center.</p><p>Generally a local HTTP Gateway is preferred over a remote HTTP Gateway because it removes an element of trust from an end user’s interaction with the Internet Computer, since remote HTTP Gateways are hosted and controlled by a centralized entity, as is currently the case with the DFINITY hosted ICX Proxy.</p><p>The Service Worker is automatically installed into an end user’s browser without the need for any interaction on their part and once installed, it will perform validation of Internet Computer network responses locally, creating a secure connection with the Internet Computer. This however, is only secure with the assumption that the Boundary Node distributing the Service Worker is trusted. In contrast to the HTTP Proxy, which runs fully locally and hence has much better security guarantees for end users.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="why-a-change-is-needed">Why a change is needed<a href="#why-a-change-is-needed" class="hash-link" aria-label="Direct link to Why a change is needed" title="Direct link to Why a change is needed">​</a></h2><p>With a clearer understanding of how the different HTTP Gateway Protocol implementations work, it should now be apparent that although the Service Worker runs locally, it has the same trust and security assumptions as a remote HTTP Gateway, such as ICX Proxy. Since Genesis, DFINITY has spent a lot of time researching ways to distribute the Service Worker in a trustless manner. We have investigated browser plugins/extensions, threshold TLS, native browser integrations, <a href="https://github.com/WICG/isolated-web-apps/blob/main/README.md" target="_blank" rel="noopener noreferrer">isolated web apps</a> and <a href="https://web.dev/signed-exchanges/" target="_blank" rel="noopener noreferrer">signed exchanges</a>. Unfortunately these endeavors, in spite of their undoubted innovativeness, have been unfruitful so far.</p><p>If a solution was found to load the Service Worker in a trustless manner then this would provide end users with a trustless connection to the Internet Computer without any additional installation on their behalf. Without this solution however, we are left with a Service Worker that has the same trust assumptions as a remote HTTP Gateway and many, many downsides, as we will discuss later in this post.</p><p>As the Internet Computer network matures, along with the dapps that have been developed to run on it, priorities change, lessons are learned and perspectives shift. As a result, we have a stronger focus within the foundation and the community on providing a superior end user experience. This focus has exposed the Service Worker as a major pain point in this regard. Many community complaints, bug reports and feature requests are related to the Service Worker and so we feel the day has finally come to retire it.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="the-solution">The solution<a href="#the-solution" class="hash-link" aria-label="Direct link to The solution" title="Direct link to The solution">​</a></h2><p>Our proposed solution is to make ICX Proxy the primary HTTP Gateway operated by DFINITY, replacing the Service Worker. ICX Proxy would become the default HTTP Gateway used by canisters on ic0.app, icp0.io and custom domains that are hosted on the DFINITY-managed Boundary Nodes. The Service Worker would still be available for community members to host their own HTTP Gateways if they wish to do so, but it would no longer be supported by the DFINITY foundation.</p><p>ICX Proxy, as a remote HTTP Gateway controlled by DFINITY, can provide a seamless onboarding experience for new users with superior performance and end user experience. For more security and decentralization conscious users however, we propose to continue working on a local HTTP Gateway that end users can run themselves.</p><p>A truly local HTTP Gateway should not have any points of centralization. The HTTP Proxy is one such example of this. It can be downloaded and validated by an end user without needing to trust a remote server controlled by a centralized entity.</p><p>An additional advantage of the HTTP Proxy is that it is not based in the browser. The Service Worker, along with some other browser based solutions that we’ve investigated are limited in some way or another. These limitations, which do not apply to ICX Proxy or the HTTP Proxy, are described throughout the rest of this post.</p><p>The downside of a local HTTP Gateway is of course that end users must install this software themselves, which is not ideal for onboarding or convenience. For now we believe this solution to be a great step forward in improving the experience of end users and developers alike, but it should not be the long term vision of the Internet Computer. An ideal solution will provide full security to all users without them needing to install anything outside of their browser of choice. So we believe that the long term goal for the Internet Computer Protocol should be a native browser integration. This is unfortunately not feasible right now, but we believe it will become so as the protocol matures, achieves greater levels of adoption and moves closer to becoming a true world computer.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="benefits-of-removing-the-service-worker">Benefits of removing the Service Worker<a href="#benefits-of-removing-the-service-worker" class="hash-link" aria-label="Direct link to Benefits of removing the Service Worker" title="Direct link to Benefits of removing the Service Worker">​</a></h2><p>In the following, we try to show the advantages of deprecating the Service Worker by listing many of its shortcomings and drawbacks, which we have gathered from discussions with many community members or have experienced ourselves in our day-to-day work.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="user-experience">User experience<a href="#user-experience" class="hash-link" aria-label="Direct link to User experience" title="Direct link to User experience">​</a></h3><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="faster-initial-page-load">Faster initial page load<a href="#faster-initial-page-load" class="hash-link" aria-label="Direct link to Faster initial page load" title="Direct link to Faster initial page load">​</a></h4><p>The Service Worker has a noticeable impact on initial page load times compared to ICX Proxy. Removing it will improve the first page load of every dapp on the Internet Computer.</p><p>For more information on how important initial page load times are, you can check out resources provided by <a href="https://www.thinkwithgoogle.com/marketing-strategies/app-and-mobile/page-load-time-statistics/" target="_blank" rel="noopener noreferrer">thinkwithgoogle.com</a>.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="consistent-branding">Consistent branding<a href="#consistent-branding" class="hash-link" aria-label="Direct link to Consistent branding" title="Direct link to Consistent branding">​</a></h4><p>The Service Worker is DFINITY branded which, in spite of being a very nice design, is providing an incoherent experience to end users, especially those who are not familiar with DFINITY and its brand. Removing The Service Worker will allow developers to fully control the branding of their applications from end to end and provide a more consistent experience for their end users.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="availability">Availability<a href="#availability" class="hash-link" aria-label="Direct link to Availability" title="Direct link to Availability">​</a></h4><p>Service workers are not supported in all clients that are used to access Internet Computer dapps.</p><p>For example, Google Translate frames (see <a href="https://nns-internetcomputer-org.translate.goog/?_x_tr_sl=en&amp;_x_tr_tl=de&amp;_x_tr_hl=en&amp;_x_tr_pto=wapp" target="_blank" rel="noopener noreferrer">NNS</a> &amp; <a href="https://identity-internetcomputer-org.translate.goog/?_x_tr_sl=en&amp;_x_tr_tl=de&amp;_x_tr_hl=en&amp;_x_tr_pto=wapp" target="_blank" rel="noopener noreferrer">Internet Identity</a>), or more commonly, in-app webviews. End users will encounter in-app webviews when opening a dapp through a social media app, such as Twitter or LinkedIn.</p><p>Certain standalone browsers will disable service workers completely, or when there are certain options enabled by the user:</p><ul><li><a href="https://www.mozilla.org/en-US/firefox/browsers/mobile/focus/" target="_blank" rel="noopener noreferrer">Firefox Focus</a> disables service workers completely.</li><li>Firefox disables service workers in the following scenarios:<ul><li>In incognito.</li><li>When history is disabled.</li><li>When the “Clear cookies when Firefox is closed” option is enabled.</li></ul></li><li>Chrome disables service workers when the “Block all cookies” option is enabled.</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="web2-developer-experience">Web2 developer experience<a href="#web2-developer-experience" class="hash-link" aria-label="Direct link to Web2 developer experience" title="Direct link to Web2 developer experience">​</a></h3><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="reduced-cognitive-load">Reduced cognitive load<a href="#reduced-cognitive-load" class="hash-link" aria-label="Direct link to Reduced cognitive load" title="Direct link to Reduced cognitive load">​</a></h4><p>There are a number of situations where the Service Worker cannot support Internet Computer developers and they must manually instead use ICX Proxy:</p><ul><li><a href="https://developers.google.com/search/docs/fundamentals/seo-starter-guide" target="_blank" rel="noopener noreferrer">SEO</a> crawlers.</li><li>Social media rich previews.</li><li>Service workers &amp; web workers.</li><li>Home screen icons on iOS.</li><li>Rich previews.</li><li>Loading static assets from the Internet Computer into a web2 application.</li></ul><p>The majority of these cases are necessary because they occur in an environment where service workers are not supported. The one exception to this is additional service workers and web workers. The HTTP requests for these workers are performed in a sandboxed environment within the browser that is not accessible from other service workers, so the Internet Computer service worker is unable to validate the responses to these requests and ensure that a replica has not responded with a malicious worker.</p><p>Developers must be aware of each of these scenarios when developing a frontend dapp for the Internet Computer. This increases the amount of Internet Computer specific knowledge that developers need and by extension, the barrier of entry for developers into the ecosystem along with the likelihood of introducing unexpected bugs in dapps.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="progressive-web-apps">Progressive web apps<a href="#progressive-web-apps" class="hash-link" aria-label="Direct link to Progressive web apps" title="Direct link to Progressive web apps">​</a></h4><p>Service workers are scoped. Only one service worker may exist at a time on the same scope and a service worker may only intercept requests within its own scope. The Internet Computer Service Worker sits on the <em>root</em> scope, so that it’s able to intercept all requests that are made by a dapp’s frontend. This means that dapps cannot have their own service worker on the root scope, so they are unable to provide features typical for <a href="https://web.dev/progressive-web-apps/" target="_blank" rel="noopener noreferrer">progressive web apps</a>, such as offline support, more aggressive caching strategies or background synchronization.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="caching">Caching<a href="#caching" class="hash-link" aria-label="Direct link to Caching" title="Direct link to Caching">​</a></h4><p>Browser caching is implemented based on response headers that are read by the browser before the request is intercepted by the service worker. Since these headers are not visible to the browser, browsers cannot effectively cache static assets as they would with normal web2 apps. Moving HTTP request translation to a remote server would mean that the requests are translated before reaching the browser, enabling browsers to implement caching as they normally would.</p><p>With HTTP request translation being performed remotely on a server (as is the case with ICX Proxy), it will also be possible to provide proxy and CDN style caching. Bringing Internet Computer dapps even closer to realizing true web speed.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="content-encoding">Content encoding<a href="#content-encoding" class="hash-link" aria-label="Direct link to Content encoding" title="Direct link to Content encoding">​</a></h4><p><a href="https://en.wikipedia.org/wiki/Brotli#Applications" target="_blank" rel="noopener noreferrer">Brotli</a> content encoding is superior to GZIP but is not currently supported by the service worker. This is because the browser would need to have visibility into the Content-Encoding header and the Brotli encoded response body before it reaches the service worker in order to decode it correctly. Since the canister response body is hidden, along with the response headers, this is not possible, so the Service Worker needs to manually decode the response body.</p><p>Handling the translation of responses outside of the browser, either via a remote HTTP Gateway such as ICX Proxy, or through a local HTTP Gateway such as the HTTP Proxy would give the browser full visibility into the canister’s response, allowing the browser to handle decoding of Brotli encoded assets normally.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="lighthouse-support">Lighthouse support<a href="#lighthouse-support" class="hash-link" aria-label="Direct link to Lighthouse support" title="Direct link to Lighthouse support">​</a></h4><p><a href="https://developer.chrome.com/docs/lighthouse/overview/" target="_blank" rel="noopener noreferrer">Lighthouse</a> is a tool that is commonly used by developers to measure the performance of various aspects of their frontend dapps such as SEO, page load, accessibility and other best practices. When used with the Service Worker, many metrics are thrown off because the tool measures the Service Worker’s loading page, rather than the dapp itself.</p><p>Additionally, the best practices category is completely broken. This is because the browser is searching for a response header that is hidden from it, namely the Content-Type header. This header is present in the canister’s response, but is not visible to the browser until the response has been decoded and transformed by the Service Worker.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="reduced-complexity">Reduced complexity<a href="#reduced-complexity" class="hash-link" aria-label="Direct link to Reduced complexity" title="Direct link to Reduced complexity">​</a></h3><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="simpler-routing">Simpler routing<a href="#simpler-routing" class="hash-link" aria-label="Direct link to Simpler routing" title="Direct link to Simpler routing">​</a></h4><p>In a previous section, the number of ways that The Service Worker is bypassed was discussed. This is cumbersome for developers, but also for maintainers of HTTP Gateways and Boundary Nodes. Removing The Service Worker will mean that there is a single HTTP Gateway implementation on the Boundary Nodes, reducing complexity, maintenance costs and risk.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="no-technology-misuse">No technology misuse<a href="#no-technology-misuse" class="hash-link" aria-label="Direct link to No technology misuse" title="Direct link to No technology misuse">​</a></h4><p>Service workers are not intended to be a critical path technology, but as a <a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement" target="_blank" rel="noopener noreferrer">progressive enhancement</a> that can add functionality for users with browsers that support it, while <a href="https://developer.mozilla.org/en-US/docs/Glossary/Graceful_degradation" target="_blank" rel="noopener noreferrer">gracefully degrading</a> for users that do not have browsers with support. Using a technology for a purpose that it’s not intended for often leads to unintuitive behavior and unintended consequences, as we have seen recently with incidents related to The Service Worker.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="no-functionality-duplication">No functionality duplication<a href="#no-functionality-duplication" class="hash-link" aria-label="Direct link to No functionality duplication" title="Direct link to No functionality duplication">​</a></h4><p>Technologies that are already provided by the browser need to be reimplemented in The Service Worker, for example content decoding and client side caching. This is because the browser normally implements those functions on responses <em>before</em> they reach The Service Worker. Canister provided headers and response bodies are not visible to the browser until <em>after</em> they leave The Service Worker.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="api-boundary-node-routingdiscovery">API Boundary Node routing/discovery<a href="#api-boundary-node-routingdiscovery" class="hash-link" aria-label="Direct link to API Boundary Node routing/discovery" title="Direct link to API Boundary Node routing/discovery">​</a></h4><p>With the upcoming <a href="https://forum.dfinity.org/t/boundary-node-roadmap/15562" target="_blank" rel="noopener noreferrer">decentralization of the boundary nodes</a>, there will be a need for HTTP Gateway Protocol implementations (including the Service Worker) to perform API Boundary Node discovery. This will be a complex and expensive operation to do in the browser, but could be done much more efficiently in a desktop application (such as the HTTP Proxy) or a remote gateway (such as ICX Proxy).</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="roadmap">Roadmap<a href="#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap">​</a></h2><p>So hopefully by now you’ve been convinced that removing the Service Worker in favor of other forms of HTTP Gateways is the way forward. So let’s talk about our short and long term roadmap for handling this transition.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="short-term">Short term<a href="#short-term" class="hash-link" aria-label="Direct link to Short term" title="Direct link to Short term">​</a></h3><p>The goal of the short term roadmap is to make a relatively quick transition to ICX Proxy from the Service Worker so that we can reap the benefits as soon as possible. This is something that we believe can be completed within a month or two.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="research-and-investigation">Research and investigation<a href="#research-and-investigation" class="hash-link" aria-label="Direct link to Research and investigation" title="Direct link to Research and investigation">​</a></h4><p><strong>Timeline:</strong> From present day up to 2-3 weeks.</p><p>This is the current phase that we are in now. We are currently working on gathering metrics for the size of <a href="/references/http-gateway-protocol-spec#response-body-streaming">streamed response bodies</a>. This is important because these responses are currently not verified by ICX Proxy. We would suggest gathering these metrics for the next couple of weeks in order to make an educated decision about the next step of the transition.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="limited-certified-response-body-streaming">Limited certified response body streaming<a href="#limited-certified-response-body-streaming" class="hash-link" aria-label="Direct link to Limited certified response body streaming" title="Direct link to Limited certified response body streaming">​</a></h4><p><strong>Timeline:</strong> 1 week.</p><p>Based on metrics of typical streamed response body sizes, we will implement verification for streamed response bodies up to a safe limit. This limit should be high enough that it will cover JS, HTML, CSS files and average sized images, but low enough that it would not allow a malicious canister to perform a DOS attack on ICX Proxy.</p><p>This limit will initially apply to both response verification v1 and v2, but in the future we plan to develop a streaming protocol exclusively for response verification v2 that will allow for a much higher limit of streaming without exposing ICX Proxy to DOS attacks from malicious canisters.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="blocking-of-dangerous-features">Blocking of dangerous features<a href="#blocking-of-dangerous-features" class="hash-link" aria-label="Direct link to Blocking of dangerous features" title="Direct link to Blocking of dangerous features">​</a></h4><p><strong>Timeline:</strong> 1 week.</p><p>Cache headers and redirect (3xx) status codes control browser behavior. The status code and response headers are not certified for response verification v1 so these should be filtered (headers) or blocked (status code) if a canister tries to use them. A canister should use the “upgrade to update” call feature if it wishes to leverage these features.</p><p>For response verification v2, the same should apply for cache headers only if they are excluded from certification, if they are included in certification (and the verification succeeds) then they can be passed along as normal. The status code is always certified so there’s no need for any blocking there.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="canary-release">Canary release<a href="#canary-release" class="hash-link" aria-label="Direct link to Canary release" title="Direct link to Canary release">​</a></h4><p><strong>Timeline:</strong> 1 - 2 weeks, depending on the success of the canary release.</p><p>A canary release of the boundary nodes will direct all dapps to ICX Proxy instead of the Service Worker, which allows community members and dapp developers to test out their dapp through ICX Proxy and make sure that everything is working as intended. This will be a much more important canary release than usual and community support with this release will be vital for a smooth transition.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="full-release">Full release<a href="#full-release" class="hash-link" aria-label="Direct link to Full release" title="Direct link to Full release">​</a></h4><p><strong>Timeline:</strong> Immediately following the successful canary release.</p><p>After a testing period with the canary release, assuming everything goes to plan, then this canary release will be rolled out to all boundary nodes, region by region and the Service Worker will be officially deprecated. This rollout will be different from standard Boundary Node rollouts. Usually the Boundary Nodes are enabled for a small percentage of traffic within a region and this percentage is increased gradually. Due to the nature of this change though, the usual approach will create a bad user experience if they are toggling back and forth between a service worker enabled boundary node and an ICX proxy enabled boundary node.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="mid-term">Mid term<a href="#mid-term" class="hash-link" aria-label="Direct link to Mid term" title="Direct link to Mid term">​</a></h3><p>The purpose of the mid term roadmap is to continue iterating upon our migration away from the Service Worker, making improvements in both end user experience and performance. This is a roadmap that will continue for several months and into the next year. We do not have immediate priority or plans for these features yet, so it’s difficult to put more concrete timelines on them, but they are features that we definitely want to prioritize very soon.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="alternative-http-gateways">Alternative HTTP Gateways<a href="#alternative-http-gateways" class="hash-link" aria-label="Direct link to Alternative HTTP Gateways" title="Direct link to Alternative HTTP Gateways">​</a></h4><p>The <a href="https://forum.dfinity.org/t/try-out-the-ic-http-proxy-a-leap-towards-decentralized-http/20357" target="_blank" rel="noopener noreferrer">HTTP Proxy</a> is already in a proof-of-concept phase. We intend to continue developing this and make it a production ready application. We will also continue searching for and developing alternatives, such as a mobile counterpart, webview wrappers, native browser integrations etc..</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="federated-http-gateways">Federated HTTP Gateways<a href="#federated-http-gateways" class="hash-link" aria-label="Direct link to Federated HTTP Gateways" title="Direct link to Federated HTTP Gateways">​</a></h4><p>With the decentralization of the Boundary Nodes, DFINITY will no longer be the only contributor to host Boundary Nodes. A step further on this path will be to open up the possibility for other community members to host their own HTTP Gateways. While the API Boundary Node component will be fully decentralized, HTTP Gateways will be federated when hosted by different community members.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="local-http-gateway-revalidation">Local HTTP Gateway revalidation<a href="#local-http-gateway-revalidation" class="hash-link" aria-label="Direct link to Local HTTP Gateway revalidation" title="Direct link to Local HTTP Gateway revalidation">​</a></h4><p>Federated HTTP Gateways will still have some element of centralization, but they will have many advantages depending on their implementation, especially HTTP Gateways that are optimized for specific use cases. Some dapps may benefit from having many edge locations optimized for static files serving across the globe, others may benefit from video streaming / decoding infrastructure hosted in specific locations, others may need support for web sockets or peer to peer protocols such as WebRTC. These benefits will be lost with a pure, local HTTP Gateway, so we plan to provide support for local HTTP Gateway revalidation. This will allow local HTTP Gateways (such as the HTTP Proxy) to gain the benefit of using remote HTTP Gateways, while removing the point of trust in a remote HTTP Gateway by revalidating responses locally.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="long-term---continued-research">Long term - continued research<a href="#long-term---continued-research" class="hash-link" aria-label="Direct link to Long term - continued research" title="Direct link to Long term - continued research">​</a></h3><p>Our continued research roadmap is something that will develop over the coming years and not something that will impact the protocol in a meaningful way in the near future.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="decentralized-http-gateways">Decentralized HTTP Gateways<a href="#decentralized-http-gateways" class="hash-link" aria-label="Direct link to Decentralized HTTP Gateways" title="Direct link to Decentralized HTTP Gateways">​</a></h4><p>While there is no concrete proposal to fully decentralize the HTTP Gateways right now, there are some ideas that we intend to continue pursuing to see what merit these approaches may hold. We will update the community on any progress made in this direction as it becomes clearer.</p><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="native-browser-integration">Native browser integration<a href="#native-browser-integration" class="hash-link" aria-label="Direct link to Native browser integration" title="Direct link to Native browser integration">​</a></h4><p>A native browser integration is, in our opinion, the ultimate HTTP Gateway implementation. This type of integration would have all the same advantages of the HTTP Proxy without end users needing to install any additional software. The primary challenge here is that we must rely on external browser developers' willingness to build and maintain this integration. This challenge will be much easier to overcome in the long term as the network grows and sees greater levels of adoption.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2><p>In this post, we have presented DFINITY’s case against the Service Worker, an HTTP Gateway Protocol implementation that enables web browsers to access the Internet Computer network. We have argued that the Service Worker has many drawbacks in terms of user experience, developer experience, and complexity, and that it does not provide any additional security to the network over ICX Proxy while it is being distributed by the Boundary Nodes. We have proposed to replace the Service Worker with ICX Proxy, a remote HTTP Gateway that offers better performance, consistency and compatibility. We have also outlined a suggested roadmap for the transition, which includes research, testing, and releasing of ICX Proxy, as well as further developing alternative HTTP Gateways such as the HTTP Proxy and native browser integration.</p>]]></content>
        <author>
            <name>Nathan Mc Grath</name>
        </author>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 27, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/27/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/27/news-and-updates/update"/>
        <updated>2023-09-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're going to talk all things new documentation, including level 2 of the Developer Liftoff series, plus the new workflow for requesting a cycles coupon.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 27 2023" src="/assets/images/dev-update-blog-sept-27-ac09dd8df345a544abc433f41a4c7550.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello ICP developers and welcome to this edition of developer weekly! This week, we're going to talk all things new documentation, including level 2 of the Developer Liftoff series, plus the new workflow for requesting a cycles coupon. Let's get into it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-level-2">Developer Liftoff level 2<a href="#developer-liftoff-level-2" class="hash-link" aria-label="Direct link to Developer Liftoff level 2" title="Direct link to Developer Liftoff level 2">​</a></h2><p>This week, level 2 of the Developer Liftoff series was published. To recap, the Developer Liftoff is a new tutorial series that acts as the map for a developer to start or grow their journey as an ICP developer. In level 2, developers learn about canister upgrades, storage, data persistence, advanced canister calls, Candid, unit testing, and using third-party canisters. The full breakdown can be found below:</p><ul><li><p><a href="/tutorials/developer-liftoff/level-2/2.1-storage-persistence">2.1: Canister upgrades, storage, and persistence.</a>: When a canister's code needs to have changes made, the canister must be upgraded. This module covers:</p><ul><li>Memory types and terms.</li><li>Upgrading canisters.<ul><li>Motoko stable memory workflow.</li><li>Rust stable memory workflow.</li></ul></li><li>Stable storage and stable variables.</li><li>Interactive example.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Defining a stable variable.</li><li>Deploying your counter app.</li><li>Stable variables in action.</li></ul></li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-2/2.2-advanced-canister-calls">2.2: Advanced canister calls.</a>: Now that we've covered the core functionalities of canisters and using them, let's take a look at advanced canister calls. This module covers:</p><ul><li>The ICP execution model.</li><li>Canister query calls.<ul><li>Example query call.</li></ul></li><li>Canister update calls.<ul><li>Example update call.</li></ul></li><li>Certified variables.</li><li>Composite queries.</li><li>Inter-canister calls.</li><li>Using inter-canister calls.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Writing a <code>publisher</code> canister.</li><li>Writing a <code>subscriber</code> canister.</li></ul></li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-2/2.3-third-party-canisters">2.3: Using third-party canisters.</a>: For certain workflows, using third-party canisters and integrating them with a dapp is important to provide functionalities such as authentication. This module covers:</p><ul><li>Pulling third-party canister dependencies.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Using <code>dfx deps</code>.</li></ul></li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-2/2.4-intro-candid">2.4: Introduction to Candid.</a>: Candid is an interface description language that has unique support for ICP features. This module covers:</p><ul><li>Candid types and values.<ul><li>Candid textual values.</li></ul></li><li>Candid service descriptions.<ul><li>The <code>.did</code> file.</li><li>Example candid service descriptions.</li><li>Generating service descriptions.</li></ul></li><li>Service upgrades.</li><li>Using Candid.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Interacting with a service using the command-line terminal.</li><li>Interacting with a service using a web browser.</li></ul></li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-2/2.5-unit-testing">2.5: Unit, integration, and end-to-end testing</a>: Testing code prior to setting it live in production is an important step in the development process. This module covers:</p><ul><li>Motoko unit testing.<ul><li>Canister unit testing.</li></ul></li><li>Rust unit testing.<ul><li>Tests using Light Replica.</li></ul></li><li>End-to-end (e2e) testing.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Setting up the project.</li><li>Creating an agent.</li><li>Creating a test file.</li><li>Running a basic test.</li><li>Running a complex test.</li></ul></li><li>Integration testing.</li></ul></li><li><p><a href="/tutorials/developer-liftoff/level-2/2.6-motoko-lvl2">2.6: Motoko: level 2.</a>: This module covers:</p><ul><li>Actor types.<ul><li>Actor type definition.</li></ul></li><li>Shared functions.</li><li>Actors and async data.</li><li>Actor classes.<ul><li>Defining an actor class.</li><li>Defining an actor within the class.</li></ul></li><li>Using multiple actors.<ul><li>Prerequisites.</li><li>Creating a new project.</li><li>Configuring canisters in <code>dfx.json</code>.</li><li>Creating canister directories and Motoko files.</li><li>Creating the <code>characterCount</code> actor.</li><li>Creating the <code>Daemon</code> actor.</li><li>Deploying the actors locally.</li><li>Interacting with multiple actors.</li></ul></li></ul></li></ul><p>Want to start at the beginning? You can get started with the Developer Liftoff <a href="/tutorials/developer-liftoff/">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-cycles-coupon-workflow">New cycles coupon workflow<a href="#new-cycles-coupon-workflow" class="hash-link" aria-label="Direct link to New cycles coupon workflow" title="Direct link to New cycles coupon workflow">​</a></h2><p>The workflow for requesting a cycles coupon has been changed. Previously, when developers requested a cycles coupon in the Discord server, they had to wait for a member of the DFINITY team to send them a survey, confirm it had been filled out, then send the developer a cycles coupon code.</p><p>Now, developers can use a Discord bot to request a cycles coupon. The bot will automatically send them the link to the survey, cutting out the previous delay that developers faced when awaiting a team member. Once the survey has been filled out, the DFINITY team will review it, then mark it as complete. Once marked complete, the bot will send the developer the coupon.</p><p>Want to check out the updated instructions? Read the documentation <a href="/building-apps/getting-started/tokens-and-cycles">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-developer-documentation">New developer documentation<a href="#new-developer-documentation" class="hash-link" aria-label="Direct link to New developer documentation" title="Direct link to New developer documentation">​</a></h2><p>Over the past few weeks, we've had some great new additions to the documentation. Several of these new docs pages are the result of direct feedback from developers on the forum or ICP Discord server. These new pages include:</p><ul><li><p><a href="/building-apps/authentication/independently-verifying-ic-signatures">Independently verifying Internet Computer signatures</a>.</p></li><li><p><a href="/defi/token-ledgers/setup/icrc1_ledger_setup">ICRC-1 ledger setup</a>.</p></li><li><p><a href="/defi/token-indexes/">ICRC-1 index local setup</a>.</p></li><li><p><a href="/building-apps/developer-tools/cdks/rust/generating-candid">Generating Candid files for Rust canisters</a>.</p></li></ul><p>Have a request for some documentation? Let us know on the developer <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">forum</a> or on <a href="https://discord.internetcomputer.org" target="_blank" rel="noopener noreferrer">Discord</a>.</p><p>That'll wrap things up for this week! We'll see everyone back here next week for another developer weekly update!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Execution]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-execution</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-execution"/>
        <updated>2023-09-22T14:58:44.000Z</updated>
        <summary type="html"><![CDATA[For this issue, we met with members from the Execution team to get insight into how the ICP's execution environment works and how it fits within the ICP technology stack.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Execution Team spotlight" src="/assets/images/dev-update-blog-exe-1-82d5da14134b2ba7dc49aaf869078c45.jpg" width="1400" height="675" class="img_ev3q"></p><p><strong>Welcome to edition of the developer blog's team spotlight series! For this issue, we met with members from the Execution team to get insight into how the ICP's execution environment works and how it fits within the ICP technology stack. Let's start with our usual introduction, what is the purpose of the Execution team?</strong></p><p><em>The team’s mission can be summarized as “managing the lifecycle and providing efficient execution of canisters”. We contribute to the system APIs that canisters can use to run on ICP and interact with other canisters as well as scheduling of messages and cycles accounting.</em></p><p><strong>What is the composition of the Execution team?</strong></p><p><em>The team consists of 5 engineers: Alexandra, Dimitris, Dragoljub, Islam, Maksym and 1 researcher: Bogdan. All team members are based in Switzerland.</em></p><p><strong>Let's dive a bit into how execution on ICP works. On a fundamental level, what is ICP’s execution environment? What happens in it?</strong></p><p><em>The execution environment is responsible for processing messages (either from users or canisters), keeping track of cycles for canisters and updating their state after message execution completes.</em></p><p><strong>Could you explain how the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34208985618836-Execution-Layer" target="_blank" rel="noopener noreferrer">execution layer</a> fits into the ICP stack?</strong></p><p><em>The execution layer is the top layer of the core ICP stack. It’s part of what we call the “replicated state machine” which additionally includes <a href="https://learn.internetcomputer.org/hc/en-us/articles/34208241927316-Message-Routing" target="_blank" rel="noopener noreferrer">message routing</a>. Messages are delivered in batches through <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus</a> to message routing and the execution environment is responsible for processing them.</em></p><p><strong>What is the process of an execution round on ICP?</strong></p><p><em>An execution round proceeds in several phases.</em></p><p><em>During the preparation phase, some cleanup/bookkeeping tasks are performed, including figuring out which canisters are long-running (i.e. require DTS execution) and purging expired ingress messages from canister queues.</em></p><p><em>In the next phase messages to the management canister are processed. Following that the main execution phase begins where the scheduling algorithm will assign canisters to different cores to execute and will start processing as many messages as possible within the round.</em></p><p><em>The finalization phase includes some cleanup/bookkeeping tasks, including charging canisters for resources, pruning messages from ingress history, processing stopping canisters, updating some metrics and checking various invariants about the state of the system.</em></p><p><strong>Thank you for that description! I think that is very insightful for developers to understand what's happening behind the scenes. How do developers interact with the execution layer through canisters?</strong></p><p><em>Developers interact with the execution environment through two sets of APIs: the first is a synchronous one, often called the system API. This is analogous to system calls on a regular operating system. The second class is the API provided by the management canister which is asynchronous and is very similar to interacting with any other canister on ICP – this API allows canisters to manage other canisters as well as get access to some of the special features of ICP, including t-ECDSA and HTTPS outcalls.</em></p><p><strong>How does the Execution team work with other teams?</strong></p><p><em>The Execution team works with several other teams within DFINITY. We work pretty closely with the Runtime team who contribute to the lower level Wasm execution engine of ICP, the Message Routing team who are responsible for routing of messages to the appropriate subnet for execution and state management as well as the SDK and Languages teams to expose the APIs provided by the execution environment to the developers.</em></p><p><strong>How does the ICP execution environment differ from other forms of execution environments?</strong></p><p><em>Two major differences of ICP’s execution environment are:</em></p><p><em>1. Orthogonal persistence which allows canisters to transparently persist data that lives on their heap.</em></p><p><em>2. Reverse gas model which makes canisters pay for the actions they take and resource usage, freeing end users from the need of dealing with cycles themselves.</em></p><p><strong>What’s the biggest challenge the team has faced?</strong></p><p><em>One of the biggest challenges for the team is the constant struggle to prioritize all the features and requests we receive to add or improve things on ICP. It’s a good problem to have and we’re glad that through some of the discussions with developers on the forum or ICP.Lab sessions we have managed to identify some of the most important things to tackle and adjusted our priorities to match this feedback.</em></p><p><strong>Have there been any improvements made as a direct result of node provider or developer feedback?</strong></p><p><em>Many of the features the team has worked on or is currently working on have come from direct feedback from developers. Latest examples include canister timers as a more efficient solution compared to heartbeats, the work on large Wasm installations which is ongoing as well as improvements to the stable structures library that allows canisters to use stable memory efficiently.</em></p><p><strong>What is the primary project that the Execution team is working on or focused on currently?</strong></p><p><em>The team is focusing on <a href="https://learn.internetcomputer.org/hc/en-us/articles/34576974172692-Evolution-Scaling" target="_blank" rel="noopener noreferrer">scalability</a>/performance and developer experience at the moment. As part of that effort we are contributing to the following projects:</em></p><ul><li><p><em>Supporting 100k+ canisters on a subnet. This will help use cases like OpenChat and HotOrNot scale to the number of canisters they need without sacrificing on the benefits of staying in a single subnet.</em></p></li><li><p><em>Improvements to stable structures, the main one being the removal of bounds on keys/values of a StableBTreeMap.</em></p></li><li><p><em>Allowing to install large Wasm modules which will unblock new CDKs in Python and Azle.</em></p></li></ul><p><strong>Those projects sound extremely exciting and beneficial to the ICP dev community, especially unblocking new CDKs for Python and Azle! Where should developers look for the latest Execution updates?</strong></p><p><em>We typically post updates of our work on the developer forum and give presentations about features/recent work in Global R&amp;D meetings.</em></p><p><strong>What is one feature or aspect of the ICP execution environment that the team is the most proud of?</strong></p><p><em>We believe that Orthogonal Persistence is one of the coolest features of ICP and a key differentiator from other Web3 platforms or blockchains. It allows developers to truly focus on their business logic when writing canisters and avoid thinking about state management for the most part.</em></p><p><strong>To wrap things up, what makes the Execution team unique compared to some of the other dev teams at DFINITY?</strong></p><p><em>Compared to other teams, the execution team is interfacing a lot with developers given our work on the APIs that canisters have access to. In a sense, we act as a bridge between the core protocol and the user facing aspects of ICP.</em></p><p><strong>A huge thank you to the Execution team for chatting with us today and providing a great look into what the Execution team is up to! Be sure to check in next time another team spotlight!</strong></p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 20, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/20/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/20/news-and-updates/update"/>
        <updated>2023-09-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this issue, we'll dive into the new releases of dfx v0.15.0 and the Rust CDK v0.11.0.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 20 2023" src="/assets/images/dev-update-blog-sept-20-21e77dfe1af07e3c4964439bb0831128.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello everyone and welcome back to this week's issue of the Internet Computer developer weekly! In this issue, we'll dive into the new releases of <code>dfx v0.15.0</code> and the Rust CDK <code>v0.11.0</code>. Both of these releases have some incredible new features for developers, so let's dive into it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-v0150"><code>dfx v0.15.0</code><a href="#dfx-v0150" class="hash-link" aria-label="Direct link to dfx-v0150" title="Direct link to dfx-v0150">​</a></h2><p><code>dfx v0.15.0</code> has been shipped with several new features and adjustments to enhance the developer experience and enable new workflows. Some of these new features include:</p><ul><li><p><code>dfx nns</code> and <code>dfx sns</code> have been removed as commands and turned into subcommands of the <code>dfx extension</code>, such as <code>dfx extension install nns</code> and <code>dfx extension install sns</code>. </p></li><li><p>The <code>dfx replica</code> and <code>dfx bootstrap</code> commands have been removed. <code>dfx start</code> should be used instead. </p></li><li><p>Warnings about using an unencrypted identity can be now be suppressed. </p></li><li><p><code>https://icp-api.io</code> has been added to the default Content-Security-Policy header. Existing projects will need to update this value in their <code>.ic-assets.json</code> or <code>.ic-assets.json5</code> file, then redeploy their project. </p></li><li><p>The default value of <code>allow_raw_access</code> has been changed to <code>true</code>, meaning that raw assets are now available by default. The frontend canister will not restrict access of traffic to the <code>&lt;canister-id&gt;.raw.icp0.io</code> URL, nor will it redirect requests to the certified domain <code>&lt;canister-id&gt;.icp0.io</code> unless configured.</p></li><li><p>New identities are restricted to using the characters <code>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-_@0123456789</code>.</p></li><li><p><code>dfx</code> now waits for the new module hash when installing a wallet to eliminate wallet installation errors.</p></li><li><p>Response verification v2 has been re-enabled in the asset canister.</p></li></ul><p>You can read the full release notes with additional details <a href="https://github.com/dfinity/sdk/releases/tag/0.15.0" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ic-rust-cdk-v0110">IC Rust CDK <code>v0.11.0</code><a href="#ic-rust-cdk-v0110" class="hash-link" aria-label="Direct link to ic-rust-cdk-v0110" title="Direct link to ic-rust-cdk-v0110">​</a></h2><p>In the latest version of the Rust CDK, the Candid export workflow has changed. In this update, there is no need to compile for WASI separately.
Instead, canisters should still use the <code>ic_cdk::export_candid!()</code> function to export the canister's Candid file, then the <a href="https://github.com/dfinity/cdk-rs/tree/main/src/candid-extractor" target="_blank" rel="noopener noreferrer">candid_extractor</a> can be used to extract the Candid from the canister's Wasm. The candid_extractor is a CLI tool that can be used to extract the Candid definition from the canister's Wasm. </p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="preparation">Preparation<a href="#preparation" class="hash-link" aria-label="Direct link to Preparation" title="Direct link to Preparation">​</a></h3><ul><li><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="step-1-upgrade-ic-cdk-dependency-to-v0110-or-higher">Step 1: Upgrade <code>ic-cdk</code> dependency to v0.11.0 or higher:<a href="#step-1-upgrade-ic-cdk-dependency-to-v0110-or-higher" class="hash-link" aria-label="Direct link to step-1-upgrade-ic-cdk-dependency-to-v0110-or-higher" title="Direct link to step-1-upgrade-ic-cdk-dependency-to-v0110-or-higher">​</a></h4></li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Cargo.toml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">[dependencies]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ic-cdk = "0.11.0"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="step-2-install-candid-extractor">Step 2: Install <a href="https://github.com/dfinity/cdk-rs/tree/main/src/candid-extractor" target="_blank" rel="noopener noreferrer">candid-extractor</a>:<a href="#step-2-install-candid-extractor" class="hash-link" aria-label="Direct link to step-2-install-candid-extractor" title="Direct link to step-2-install-candid-extractor">​</a></h4></li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">cargo install candid-extractor</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>With <code>cargo-binstall</code> you can install the prebuilt binary without waiting for compilation:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">cargo binstall candid-extractor</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="workflow">Workflow<a href="#workflow" class="hash-link" aria-label="Direct link to Workflow" title="Direct link to Workflow">​</a></h3><ul><li><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="step-1-call-the-export_candid-macro-at-the-end-of-your-librs-file">Step 1: Call the <code>export_candid</code> macro at the end of your <code>lib.rs</code> file:<a href="#step-1-call-the-export_candid-macro-at-the-end-of-your-librs-file" class="hash-link" aria-label="Direct link to step-1-call-the-export_candid-macro-at-the-end-of-your-librs-file" title="Direct link to step-1-call-the-export_candid-macro-at-the-end-of-your-librs-file">​</a></h4></li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token attribute attr-name" style="color:#F8F8F2">#[query]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">hello</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property">format!</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"Hello, {}!"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token attribute attr-name" style="color:#F8F8F2">#[update]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">world</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property">format!</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"World, {}!"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:#707070">// Enable Candid export</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token namespace" style="color:#26D76D">ic_cdk</span><span class="token namespace punctuation" style="color:#F1EEF5">::</span><span class="token macro property">export_candid!</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="step-2-compile-the-canister-wasm-module">Step 2: Compile the Canister Wasm module<a href="#step-2-compile-the-canister-wasm-module" class="hash-link" aria-label="Direct link to Step 2: Compile the Canister Wasm module" title="Direct link to Step 2: Compile the Canister Wasm module">​</a></h4></li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">cargo build --release --target wasm32-unknown-unknown --package &lt;CANISTER&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The Wasm module will be at:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">target/wasm32-unknown-unknown/release/&lt;CANISTER&gt;.wasm</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="step-3-extract-candid-from-the-wasm-module-and-save-to-a-file">Step 3: Extract candid from the Wasm module and save to a file:<a href="#step-3-extract-candid-from-the-wasm-module-and-save-to-a-file" class="hash-link" aria-label="Direct link to Step 3: Extract candid from the Wasm module and save to a file:" title="Direct link to Step 3: Extract candid from the Wasm module and save to a file:">​</a></h4></li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">candid-extractor target/wasm32-unknown-unknown/release/&lt;CANISTER&gt;.wasm &gt; &lt;CANISTER&gt;.did</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>That'll wrap things up for this week! See everyone in the next issue of developer weekly!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 13, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/13/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/13/news-and-updates/update"/>
        <updated>2023-09-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's dev weekly update, we talk about the new 0.10.0 Motoko release, plus some new resources for developers on our dev docs.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 13 2023" src="/assets/images/dev-update-blog-sept-13-8e76f37f9aec69858f436d62947197e7.jpg" width="1400" height="675" class="img_ev3q"></p><p>This week, we have a new <code>moc</code> release, version <code>0.10.0</code>, which introduces the new stable regions feature, plus we'll talk about some new resources for developers on our dev docs. Let's talk about it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="moc-0100---motoko-stable-regions"><code>moc 0.10.0</code> - Motoko stable regions<a href="#moc-0100---motoko-stable-regions" class="hash-link" aria-label="Direct link to moc-0100---motoko-stable-regions" title="Direct link to moc-0100---motoko-stable-regions">​</a></h2><p>This past week, a new version of the Motoko compiler has been released - <code>0.10.0</code>. This release includes a new, highly anticipated feature: Motoko stable regions! This feature has been a long-running project that encompasses effort from several team members to continue developing Motoko to be a powerful, yet safe language, targeted toward ambitious developers and their projects.</p><p>Stable regions are a type of dynamically allocated, isolated, and independently growable regions of stable memory. Let's take a closer look at what this new stable regions feature is and how developers can use it.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-is-a-region">What is a "region"?<a href="#what-is-a-region" class="hash-link" aria-label="Direct link to What is a &quot;region&quot;?" title="Direct link to What is a &quot;region&quot;?">​</a></h3><p>A <code>Region</code> is a new Motoko abstract data type that uses an API which exposes low-level canister stable memory. <code>Region</code>s are unique since they use distinct portions of stable memory that never interfere with one another. New <code>Region</code>s can be created dynamically, and any old regions that are marked for garbage collection will be removed and reused for new <code>Region</code>s afterwards.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-to-use-motoko-stable-regions">How to use Motoko stable regions<a href="#how-to-use-motoko-stable-regions" class="hash-link" aria-label="Direct link to How to use Motoko stable regions" title="Direct link to How to use Motoko stable regions">​</a></h3><p><code>moc 0.10.0</code> will be added to the next release of <code>dfx</code>, but for developers who want to test the feature now, you can try it now <a href="https://github.com/dfinity/motoko/releases" target="_blank" rel="noopener noreferrer">here</a>.</p><div class="admonition_WoCw admonitionWarning_tRva"><p>It is important to note that this new stable regions feature may re-organize the stable memory layout of existing canisters. For this reason, developers will not be able to downgrade <code>moc</code> to older releases. Thorough testing is advised.</p><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="24" height="24" rx="12" fill="#F68E5F"></rect><path d="m5.396 17.258 6.166-11a.502.502 0 0 1 .875 0l6.165 11a.5.5 0 0 1-.437.744H5.835a.5.5 0 0 1-.439-.744Zm6.605-4.588a.5.5 0 0 0-.5.5v2.334a.5.5 0 0 0 1 0V13.17a.5.5 0 0 0-.5-.5Zm-.001-2a.667.667 0 1 0 0 1.334.667.667 0 0 0 0-1.334Z" fill="#fff"></path></svg></div><p>Be sure to check out the documentation for the feature <a href="https://github.com/dfinity/motoko/blob/master/doc/md/stable-regions.md" target="_blank" rel="noopener noreferrer">here</a>. If you have any questions, the forum post for this feature can be found <a href="https://forum.dfinity.org/t/motoko-stable-regions/19182" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-interactive-course">Motoko interactive course<a href="#motoko-interactive-course" class="hash-link" aria-label="Direct link to Motoko interactive course" title="Direct link to Motoko interactive course">​</a></h2><p><a href="https://agorapp.dev/" target="_blank" rel="noopener noreferrer">Agorapp</a> has designed a web-based IDE and corresponding Motoko introduction tutorial. We've embedded this tutorial into our developer docs, meaning you can write and run Motoko code in-browser without even having to leave our documentation! This is a great way to get started using Motoko with an interactive, hands-on tutorial.</p><p>Want to get started? The interactive tutorial can be found in our Motoko documentation <a href="https://internetcomputer.org/docs/motoko/tutorial" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-documentation">New documentation<a href="#new-documentation" class="hash-link" aria-label="Direct link to New documentation" title="Direct link to New documentation">​</a></h2><p>Over the past few weeks, we've had some great new pages added to our developer documentation. Let's take a look at some of the new additions!</p><ul><li><p><a href="/tutorials/developer-liftoff/level-0/">Developer Liftoff level 0</a>: Start the Developer Liftoff at the very beginning by following the level 0 module. In level 0, we cover the fundamentals of what the Internet Computer is, what terms you should be familiar with, and what tools we'll be using throughout our journey.</p></li><li><p><a href="/tutorials/developer-liftoff/level-1/">Developer Liftoff level 1</a>: In the next stage of the Developer Liftoff, become a space cadet by getting comfortable creating your first dapp, managing your canisters, and acquiring and using cycles.</p></li><li><p><a href="/building-apps/advanced/using-third-party-canisters">Pulling canister dependencies</a>: Learn how to use the new <code>dfx deps</code> feature to pull third-party canister dependencies.</p></li><li><p><a href="https://learn.internetcomputer.org/hc/en-us/articles/34084394684564-SNS-Service-Nervous-System" target="_blank" rel="noopener noreferrer">Service Nervous System (SNS) documentation</a>: Over the past few months, our documentation on SNSes has been greatly expanded. New docs include a pre-flight checklist, guidelines on integrating with the ledger and index canisters, and guides for testing your SNS before deploying it.</p></li></ul><p>That'll wrap things up for this week, see you all next week!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 6, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/06/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/06/news-and-updates/update"/>
        <updated>2023-09-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're excited to talk about the next installment of the new documentation series Developer Liftoff, plus talk about upcoming features and integrations such as the Ethereum integration and the cycles ledger.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="September 6 2023" src="/assets/images/dev-update-blog-sept-6-824bba002d5364058f3af766781841a7.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello devs and welcome to this week's issue of developer weekly! This week, we're excited to talk about the next installment of the new documentation series Developer Liftoff, plus talk about upcoming features and integrations such as the Ethereum integration and the cycles ledger.</p><p>Let's get into it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-liftoff-level-1">Developer liftoff level 1<a href="#developer-liftoff-level-1" class="hash-link" aria-label="Direct link to Developer liftoff level 1" title="Direct link to Developer liftoff level 1">​</a></h2><p>The second level of the Developer Liftoff tutorial series is now live on the developer docs! In this level, level 1, we begin to dive into the building blocks of developing on ICP, such as learning about Motoko fundamentals, developing a simple poll dapp, and learning about canister deployment and management. Modules in this level include:</p><ul><li><a href="/tutorials/developer-liftoff/level-1/1.1-motoko-lvl1">1.1: Exploring a live demo</a>:</li></ul><p>In this module, you can learn about:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">- An overview of the playground.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- An overview of the `dfx deploy --playground` command.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Deploying a canister to playground using `dfx`.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Interacting with the canister via the CLI.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Interacting with the canister via the Candid interface.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><a href="/tutorials/developer-liftoff/level-1/1.2-dev-env">1.2: Motoko level 1</a>:</li></ul><p>In this module, you can learn about:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Basic concepts and terms.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Motoko syntax.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Using the base library.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Declarations and expressions.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Defining an actor.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Values and evaluation:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Primitive values.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Non-primitive values.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Printing values.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Passing text arguments.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><a href="/tutorials/developer-liftoff/level-1/1.3-intro-dfx">1.3: Developing your first dapp</a>:</li></ul><p>In this module, you can learn about:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Creating a new project.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Reviewing the project's file structure.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Writing the backend canister code.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Creating an actor.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Defining the `getQuestion` method.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Query calls vs. update calls.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Creating a data structure to store the data.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Importing additional dependencies.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Declaring the `votes` variable.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Declaring the `getVotes` method.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Declaring the `votes` method.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Declaring the `resetVotes`  method.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    - Final code.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Deploying the dapp locally.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Adding pre-developed frontend code.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Re-deploying the dapp.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><a href="/tutorials/developer-liftoff/level-1/1.4-using-cycles">1.4: Acquiring and using cycles</a>:</li></ul><p>In this module, you can learn about:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">- An overview of cycles.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Creating a developer identity.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Acquiring cycles using a cycles coupon.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Converting ICP tokens to cycles.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><a href="/tutorials/developer-liftoff/level-1/1.5-deploying-canisters">1.5: Deploying canisters</a>:</li></ul><p>In this module, you can learn about deploying to the mainnet.</p><ul><li><a href="/tutorials/developer-liftoff/level-1/1.6-managing-canisters">1.6: Managing canisters</a>:</li></ul><p>In this module, you can learn about:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Obtaining a canister's ID.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Obtaining canister information.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Adding an identity as a controller of a canister.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Managing the running state of a canister.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Checking the cycles balance of a canister.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Topping up a canister.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Getting cycles back from a canister.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Setting the canister's freezing threshold.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- Deleting a canister.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can learn more about the Developer Liftoff and get started with level 0 in the <a href="/tutorials/developer-liftoff/">tutorials section of our developer documentation</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ethereum-starter-project">Ethereum starter project<a href="#ethereum-starter-project" class="hash-link" aria-label="Direct link to Ethereum starter project" title="Direct link to Ethereum starter project">​</a></h2><p>One of the most exciting roadmap items for ICP currently is our upcoming ICP + ETH integration, enabling devs to build on ICP and interact with Ethereum! As a sample project, our team has developed an ICP + ETH starter project, which showcases the simple use case of using an ICP canister to verify NFT ownership for NFTs minted on the Ethereum network. This sample dapp has support for the Ethereum mainnet, plus the Sepolia and Goerli testnets. You can connect your Internet Identity or NFID to the dapp!</p><p>You can play with a running version of the dapp <a href="https://xm3ir-rqaaa-aaaap-abhqq-cai.icp0.io/" target="_blank" rel="noopener noreferrer">here</a>.</p><p>If you want to use this sample project as a boilerplate to build your own, or learn more about the technology stack used in the project, check out the open source repo <a href="https://github.com/dfinity/ic-eth-starter" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="upcoming-feature-cycles-ledger">Upcoming feature: cycles ledger<a href="#upcoming-feature-cycles-ledger" class="hash-link" aria-label="Direct link to Upcoming feature: cycles ledger" title="Direct link to Upcoming feature: cycles ledger">​</a></h2><p>Another exciting upcoming feature is the new cycles ledger feature. The cycles ledger, which is expected to launch in October 2023, will simplify cycle management by providing the ability for principal IDs to hold cycles.</p><p>Currently, cycles wallets are a complex solution that is used to associate cycles with principals, since cycles wallets must be deployed locally, consume cycles themselves, and are easily lost if the cycles wallet canister ID is lost.</p><p>The cycles ledger is an alternative to the cycles wallet, and will be deployed as a single global ledger canister, rather than a local deployment. The cycles ledger will comply with the ICRC-2 standard and will also interact with the NNS canisters and user canisters to provide ledger-specific functions, such as creating new canisters using cycles, sending cycles to canisters, and accepting incoming cycles.</p><p>Be sure to check back in October for a more detailed blog post when the feature is live!</p><p>That'll wrap things up for now, see you next time!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Consensus]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-consensus</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-consensus"/>
        <updated>2023-09-05T17:24:58.000Z</updated>
        <summary type="html"><![CDATA[For this issue, we're going to be taking a deep dive into the team behind one of the most important, fundamental components of any blockchain platform - the consensus protocol.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Consensus team spotlight" src="/assets/images/dev-update-blog-consensus-1-c5b5a7b515a69bea4c20ee23248001ad.jpg" width="1400" height="675" class="img_ev3q">
Hello everyone and welcome to another installment of the DFINITY team spotlight! For this issue, we're going to be taking a deep dive into the team behind one of the most important, fundamental components of any blockchain platform: the consensus protocol. What is a consensus protocol, and how does consensus on the Internet Computer happen? Let's find out!</p><p><strong>To get started, on a fundamental level, what is consensus?</strong></p><p><em>[The ICP uses replication]<!-- --> to enable a secure and trustless computation on independently owned and controlled hardware resources (they are called "replicas"). The consensus layer of ICP is responsible for coordination of these replicas by making them agree on inputs to be processed, their order, and on the obtained computational results. By assuming that strictly less than ⅓ of these replicas are malicious or faulty, we can achieve the Byzantine Fault Tolerance on ICP meaning that the system is able operate even if some of its replicas fail or act maliciously.</em></p><p><strong>Does the consensus team only focus on the consensus layer, or are there other responsibilities of the consensus team?</strong></p><p><em>We own the consensus layer of the ICP stack, develop the node/topology orchestration software and are responsible for DKG (distributed key generation) and t-ECDSAA orchestration.</em></p><p><strong>What is the composition of the Consensus team?</strong></p><p><em>We have 5 engineers based in Zurich, 1 engineer in Singapore, 1 research lead in the US and 1 team lead in Zurich.</em></p><p><strong>Let's dive a bit further into the ICP consensus protocol. Could you explain how the ICP consensus protocol works?</strong></p><p><em>[The]<!-- --> ICP consists of multiple subnets which in turn consist of replicas mentioned above. Moreover, each subnet is hosting canisters (user deployed software). When these canisters receive messages, the subnet hosting them needs to achieve consensus among its replicas on a subset and <!-- -->[the]<!-- --> order of messages to be passed to the canisters. The ICP consensus protocol works in rounds. In each round replicas agree on a block containing a set of messages to be processed next. This block extends a chain of blocks with previous messages. Blocks are proposed by replicas elected as block makers. Then, every replica tries to validate the proposed block and if the super majority (⅔ of nodes) agrees on one single valid block in a round, the messages from this block get executed. However, if multiple valid blocks are valid (this could happen during sub-optimal network conditions between replicas), the subnet keeps building new blocks until a round is reached where only one block is valid.</em></p><p><strong>Developers may be familiar with the consensus mechanisms of other blockchains, such as Ethereum or Bitcoin. How is consensus on ICP different from other blockchains?</strong></p><p><em>[The]<!-- --> ICP consensus is very different from both Bitcoin and Ethereum. For example, it cannot be classified as proof of work or proof of stake. We call it "proof of useful work" meaning that nodes need to constantly contribute to subnets computation to not get slashed. Moreover, nodes are not anonymous and are appointed by the NNS DAO. Having a high finality time and multiple subnets running their own consensus we need to maintain a realistic scalability approach and hence all subnets regularly trim their blockchains and delete old blocks. In order to allow new nodes to join a subnet, we came up with the catch-up package mechanism. Moreover, the protocol can be upgraded with a granularity of a subnet level. Subnets get upgraded via NNS proposals.</em></p><p><strong>Consensus is a core piece of ICP, but it's one aspect that developers may not be aware of how it is directly benefiting them. How do developers benefit from consensus on ICP?</strong></p><p><em>Consensus is what enables the replication of computation on ICP, giving the security and fault tolerance. That security means that the life is much simpler for developers: they just deploy their code and don't need to worry about anything else like infrastructure for security, e.g. firewalls or reverse proxies and so on. The only aspect of the consensus visible to the end users of ICP (developers and dapp users) is the latency of write requests. Most of our application subnets have a high finality rate, so that the end to end latency for write requests can be as low as ~2.8 seconds. While it might be impractical for some applications requiring real-time data processing, it has proven itself to be sufficiently fast for a whole set of applications like messengers, social networks and many other CRUD like applications. Such low latency can be easily hidden behind UI patterns like optimistic updates, especially because the same patterns are applied today on most internet-scale Web2 applications where the transaction settlement often has a latency of the same order of magnitude.</em></p><p><strong>It sounds like consensus definitely contributes to the developer experience! In contrast to developers and end users who don't interact directly with the consensus layer, nodes and node providers directly interact with consensus. Could you give us a bit more insight into how nodes participate in consensus?</strong></p><p><em>Once a node registers itself with ICP and gets assigned to a subnet, it pulls a catch-up package we mentioned above. This catch-up package is signed by the subnet and can be verified against the subnet's public key. It also contains a reference to a state which has to be pulled from node's peers. Once the node has the state available locally and all new finalized blocks, it can start participating in the consensus by creating and validating new blocks.</em></p><p><strong>If a node doesn’t act honestly during consensus, what happens to it?</strong></p><p><em>The NNS can remove nodes if they misbehave. Currently, this decision would be based on observations and metrics. But we're currently working on collecting deterministic metrics from a subnet allowing us to verify node's contributions to the subnets computation. The next step would be to use these metrics for penalizing those nodes which are not behaving according to the protocol rules.</em></p><p><strong>Let's talk about the Consensus team's roadmap. What is the primary project that the Consensus team is working on or focused on currently?</strong></p><p><em>We're currently focused on improving the ECDSA throughput and latency performance which is needed for the upcoming Ethereum integration.</em></p><p><strong>What are the primary benefits of this project?</strong></p><p><em>After the Ethereum integration is completed, we hopefully will have a lot of "twin tokens" of many popular ERC20 tokens on ICP. To "bridge" this token between ICP and Ethereum, a lot of ECDSA signatures will be required, so it would be very beneficial for the user experience if the waiting times for bridging an asset are as low as possible.</em></p><p><strong>When can we expect the project to be completed?</strong></p><p><em>By the end of 2023.</em></p><p><strong>The Ethereum integration is extremely exciting, and I'm eager to see what it unlocks for developers! Where should developers look for the latest Consensus updates? (Forum, Discord, etc).</strong></p><p><em>The definite source of truth would be the change logs that can be found in the upgrade proposals.</em></p><p><strong>To wrap things up, what is one feature or aspect of the ICP consensus protocol that the team is the most proud of?</strong></p><p><em>The current consensus protocol powers a lot of dapps on ICP already and many of them are working as fast as their centralized counterparts.</em></p><p>A big thank you to the Consensus team for sitting down with us and chatting all things consensus protocol! That'll wrap things up for this issue of team spotlight, thanks for checking in!</p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update September 1, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/01/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/09/01/news-and-updates/update"/>
        <updated>2023-09-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're going to recap some of the recent enhancements to the Motoko VS Code extension that have been implemented over the past few months, plus we'll take a look at some major road map items that are in development for dfx.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 9 2023" src="/assets/images/dev-update-blog-sept-1-aa2447d77d34d49eb2a93362fc2e0960.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello devs and welcome back to another installment of developer weekly! This week, we're going to recap some of the recent enhancements to the Motoko VS Code extension that have been implemented over the past few months, plus we'll take a look at some major road map items that are in development for dfx.</p><p>Let's talk about it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-vs-code-extension-enhancements">Motoko VS Code extension enhancements<a href="#motoko-vs-code-extension-enhancements" class="hash-link" aria-label="Direct link to Motoko VS Code extension enhancements" title="Direct link to Motoko VS Code extension enhancements">​</a></h2><p>Over the past few months, several improvements and enhancements have been made to the Motoko VS Code extension. Some of these changes are:</p><ul><li>Error code explanations from <code>moc --explain</code> are now shown as tooltips within the extension. An example can be seen here:</li></ul><p><img loading="lazy" alt="Motoko VS Code 1" src="/assets/images/motoko-vs-code-1-d1154918cf5985cc0dc86e7d0e718394.png" width="1368" height="1000" class="img_ev3q"></p><ul><li>A Motoko unit test runner has been integrated directly into the VS Code extension, providing functionality for testing libraries such as Motoko Matchers or testing files via the moc interpreter. This unit test runner works out of the box with Wasmer and moc.js, and does not require you to install wasmtime or dfx to locally run base library unit tests.</li></ul><p><img loading="lazy" alt="Motoko VS Code2 " src="/assets/images/motoko-vs-code-2-388cade12dcda47161faf22e248777a2.png" width="2537" height="1327" class="img_ev3q"></p><ul><li><p>Error messages for common issues with dfx.json, Mops, Vessel, and other workflows have been added for more efficient debugging.</p></li><li><p>The go-to-definition for object pattern field aliases has been improved. Previously, go-to-definition on <code>B</code> with <code>import { A = B } "path/to/A"</code> would have resolved to the location of <code>B</code> within the import. With this improvement, the language server automatically follows the import and then places the cursor on the definition of <code>A</code>. Additionally, this change provides the ability for tooltip doc comments to be shown in more situations.</p></li></ul><p>You can learn more about the Motoko VS Code extension <a href="/building-apps/developer-tools/icp-ninja">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="upcoming-dfx-road-map-items">Upcoming <code>dfx</code> road map items<a href="#upcoming-dfx-road-map-items" class="hash-link" aria-label="Direct link to upcoming-dfx-road-map-items" title="Direct link to upcoming-dfx-road-map-items">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-new"><code>dfx new</code><a href="#dfx-new" class="hash-link" aria-label="Direct link to dfx-new" title="Direct link to dfx-new">​</a></h3><p>The <code>dfx new</code> command has some exciting updates and improvements that will be coming out in <code>dfx release 0.15.1</code>. One of the biggest changes is that there will be an interactive prompt that will allow you to choose what language template you'd like to create a new project using. Previously, this decision was made using the flag <code>--type=motoko</code> or <code>--type=rust</code>. Additionally, there will be additional options through this new interactive prompt, such as Azle and Kybra.</p><p>In this interactive prompt, there are also options to enable add-ons, such as adding a frontend canister using different frontend templates like React or Vue, enabling unit tests, or adding integrations like Internet Identity and Bitcoin.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-extensions"><code>dfx extensions</code><a href="#dfx-extensions" class="hash-link" aria-label="Direct link to dfx-extensions" title="Direct link to dfx-extensions">​</a></h3><p><code>dfx extensions</code> is a highly anticipated feature that will replace the way certain management canisters are installed, such as the NNS and SNS canisters. Instead of having to manually install and deploy these canisters locally to use them, <code>dfx extensions</code> can be used to install them, such as:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx extension install nns</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx extension install sns</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Then, you can use them as you did before, using commands like <code>dfx nns</code> and <code>dfx sns</code>. <code>dfx extensions</code> will be available in <code>dfx release 0.15.0</code>.</p><p>For more information on <code>dfx nns</code> and <code>dfx sns</code>, please see the reference documentation <a href="/building-apps/developer-tools/dfx/dfx-nns">here</a></p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-deploy---playground"><code>dfx deploy --playground</code><a href="#dfx-deploy---playground" class="hash-link" aria-label="Direct link to dfx-deploy---playground" title="Direct link to dfx-deploy---playground">​</a></h3><p>As we've mentioned a couple of times already in previous developer weekly updates, the <code>dfx deploy --playground</code> feature is also coming in <code>dfx release 0.15.0</code>. This feature allows you to quickly deploy canisters directly to the playground without needing to setup a developer environment or cycles wallet to deploy them.</p><p>You can read more in our previous update from <a href="/blog/2023/07/26/news-and-updates/update">July 26</a>.</p><p>That'll wrap things up for this week's update! Be sure to check in next week for another issue of developer weekly!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Internet Computer - A blockchain that offers stateful decentralized serverless computing]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/serverless</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/serverless"/>
        <updated>2023-08-24T18:29:11.000Z</updated>
        <summary type="html"><![CDATA[Is serverless computation even possible on a blockchain platform? Our recent peer-reviewed article shows that the Internet Computer provides serverless computation comparable to existing cloud providers, but with the added benefits of decentralization and statefulness.]]></summary>
        <content type="html"><![CDATA[<p>Serverless has taken the cloud computing world by storm, seeing large growth in the past few years with really positive projections for the future. As per a recent forecast, the market is expected to grow at a compound annual growth rate of over 20% by 2028. Essentially, serverless architectures push cloud-based tech to its full potential through IT automation software, enabling enterprises to propel growth rather than spending time and resources on IT infrastructure management.</p><p>While this sounds highly promising, serverless cloud platforms are still stateless and centralized. Applications therefore need to work around this shortcoming for storing state, and to avoid being subject to vendor lock-in. The Internet Computer offers another layer of security, control, and trust — all through decentralization, whereby no one single party controls the hardware or the software. Moreover, the Internet Computer operates by design in a stateful manner.</p><p>In this post we describe how the Internet Computer blockchain offers serverless computing functionality with two important additional benefits: decentralization and statefulness.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-is-serverless">What is serverless?<a href="#what-is-serverless" class="hash-link" aria-label="Direct link to What is serverless?" title="Direct link to What is serverless?">​</a></h2><p>Serverless is a novel cloud computing paradigm that enables quick and agile development cycles without minding the underlying infrastructure — provisioning and scaling the right virtual machines, installing and maintaining software and frameworks — reducing overall operational costs. There are several incarnations of severless and the most relevant in our case is function-as-a-service (FaaS), where (large codebases are split into) small functions (that) run for very short periods of time (milliseconds to minutes). Functions are charged for per use (i.e., based on how long they run) plus a fixed fee per invocation. The last important feature to mention is the excellent scaling capability, where up to thousands of instances of the same function can be started in a short span of time.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="the-internet-computer-as-a-serverless-platform">The Internet Computer as a serverless platform<a href="#the-internet-computer-as-a-serverless-platform" class="hash-link" aria-label="Direct link to The Internet Computer as a serverless platform" title="Direct link to The Internet Computer as a serverless platform">​</a></h2><p>Taking a brief glimpse at the architecture of the Internet Computer, you will easily notice that it offers serverless features with even extra benefits. Nowadays FaaS functions are packaged as containers or simply as code (in Python, Javascript, Java, Rust etc.), and offer a single endpoint that can either be called directly by external users or other functions. Canister smart contracts on the Internet Computer can also be programmed in several languages, including Rust, Motoko, JavaScript or Python, and can expose multiple endpoints that can offer different functionality per canister. The tables below summarize the main serverless features and their Internet Computer correspondents, as well as the advantages the blockchain has over cloud-based serverless.</p><p><img loading="lazy" alt="Table 1" src="/assets/images/serverless-table1-e12fde34e40db6730dd150534f90d35c.webp" width="720" height="415" class="img_ev3q"></p><p><em>Table 1. Main serverless features contrasted with the Internet Computer capabilities. Decentralization, statefulness and trust are added benefits of the Internet Computer</em></p><p>As can be seen from the tables, the Internet Computer ticks all the boxes of a serverless environment. Developers may not know it, but they are already executing serverless code and as our research shows — at nearly the same efficiency as traditional cloud vendors offer. And on select dimensions (e.g. memory) the Internet Computer even exceeds the power offered by traditional cloud vendors. However, the most important developer-facing features we’d like to highlight are: statefulness and decentralization, neither of which are offered by traditional serverless clouds.</p><p>In Tables 2–3, we invite the tech-savvy reader to dive deeper into the technical aspects that enable the Internet Computer to be a competitive serverless platform. It is important to note here that the Internet Computer has two types of executing smart contracts — an update mode and a query mode. The former represents a stateful invocation, while the latter is stateless, just like generic serverless computing.</p><p><img loading="lazy" alt="Table 2" src="/assets/images/serverless-table2-992f0f1c99a1adb8266510b4b6e36ae3.webp" width="720" height="488" class="img_ev3q"></p><p><em>Table 2. Important features for building large-scale serverless applications. Statefulness is an added benefit of the Internet Computer.</em></p><p><img loading="lazy" alt="Table 3" src="/assets/images/serverless-table3-37c5a2278e84a4862efeec0963c26ea9.webp" width="720" height="448" class="img_ev3q"></p><p><em>Table 3. In-depth platform analysis regarding runtime-related features.</em></p><p>Keeping state after function execution is a long sought-after feature in the serverless/FaaS world. It is highly difficult to implement as it generally conflicts with the seamless fan-out type of <a href="https://learn.internetcomputer.org/hc/en-us/articles/34576974172692-Evolution-Scaling" target="_blank" rel="noopener noreferrer">scalability</a> offered in current clouds. Fortunately, the Internet Computer is designed with statefulness in mind from the ground up and offers developers this feature without any kind of manual intervention, like saving data to an outside storage layer or database. Therefore, all variables or data are automatically persisted after a smart contract invocation on the Internet Computer.</p><p>Decentralization is yet another important feature that is often overlooked. Modern serverless offerings are currently offered by several large centralized clouds, which leads to vendor lock-in. In this case, developer code and data are as secure as their provider is and are liable to geographical outages or simply vendor policy change. The Internet Computer is fully decentralized, with node machines operating in different geographies and running under strong <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus</a> guarantees, tolerating even byzantine (malicious) faults.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="the-internet-computer-vs-traditional-serverless-platforms">The Internet Computer vs. traditional serverless platforms<a href="#the-internet-computer-vs-traditional-serverless-platforms" class="hash-link" aria-label="Direct link to The Internet Computer vs. traditional serverless platforms" title="Direct link to The Internet Computer vs. traditional serverless platforms">​</a></h2><p>To assess how the Internet Computer blockchain fares against serverless clouds, we ran a CPU intensive benchmark computing prime numbers on the Internet Computer and on one of the top-3 serverless platforms. For small inputs, the Internet Computer is faster than traditional serverless whereas for larger inputs, it is half as fast (see results in the figure below). This is extremely encouraging. This shows that while there’s still a long way to go, the Internet Computer is gaining traction in terms of performance when compared to traditional, centralized clouds. For more detailed information we encourage you to check out our recent peer-reviewed article presented at the prestigious USENIX ATC conference.</p><p><img loading="lazy" alt="Figure 1" src="data:image/webp;base64,UklGRuoZAABXRUJQVlA4WAoAAAAIAAAAzwIA3wEAVlA4IAoZAAAwwACdASrQAuABPm02mUkkIqgkINGo4QANiWduzzPR8NKBBieT9Q74jZw10tvKoLr0Q49MzfPzzI7sjzAfxn+3fth70nos6LL1jvQA86v1ef7p/1fS51dXsB1iekv8b+3Wgb/KPrp+S4f+4B8BHq3fV8q/Wn1CPVz5t/rfBP/qvQX6nf4j3AP4z/S/7l+cPNlUAP5f/Y/+36gf+1/m/P189/+L/N/AP/MP69/2vXJ9g/7o+z0GTNqvv+lb48t0NK1+AtSiJAsdOP/j08terIrmoQM4WseZ/mDXf6UNsPLWLDKWPF1KIkc4q0xxV4b5pfB8pGqEDOOdQMUt00BZ99UID4lEWK0Nfy9OmDJHxYiesHf6GoUVHY+LqUPbqbykZxz8aBnHOXWZIn8njFkuyxwyrFhmNEFiAyUSsTHCtBal8XUoiRzqHN8KTZjSNf0OtT5yqV3UWxh8IHBppxGN1nverCVpz7NzfqhAzjnUOb4UmzLLcUP4GqqLP9Yyvicqw/DBVK4Wr5QBh09JBap1NoT2qfu1vDyN9ZsJuGExBWFA5+n0b6zYTcMJiCsKB1uy6DxapOn7AEGf+yj0v//yK+NoUpv/Mn4gcfvIBoLs1pDJQLscNAU5EUnuefQjrtlObevxmaBXSWrgdeAKDUf3SsYK4yqh9N//5tbp7jIVP+9fcgO1QgfiJzz76oQIEYCEoQri8HuavX/b//4Hh40fOqjafsI3J/xwhbNparwY/ckSOdX9v+DvLsSRxudlHvAa2dcxhoLPFYJvMphPyFqN3mJz3mKntPELvW///69KB5fBWQShJ63/ovRV2s6BTbJ1Xu+LLCm7iPt/KOT1pDKndM8WN7UKh9NjeU0ZJQF+Ow5w71CB3DhSbMs++p360Q4Ia37+5tcI0kloD///2YC9sqfimSbn////9udkbeFm0Yg/C6hRrAwoHnA/C6hRrAwoHklYsWAkVJ2Yv0dy86Vtjg//+Z/KJFvvRf/+0JfkjyP4u3iRI51Dm7tZ7zAM/VXwusWQBrNNjg//+Z/KIIZQp7PkCf5X8bv4w6v8gxRAVXNfFRyabu3Zp4jGpc6MsuTvulzis6Tf//kAJRIt9////8ck26HuIh1UK3E8aoQM45aJbbTp6CF1JuRsj//IS7rr4S8D5//+mtJtkRyCWedNi3DOO7hc06pKM42S9LczU6FQhDRrSY4//9UWAzkv08EP8efAf//MYGpvhodzB5nmFINcCcluLoO2fAV+RMa0iHOplbWp8iJbnwWUAXzlfGGBryJpL8xCXmXT9qfN1JTV+7qTFCWAxmRi/+sdR2XmqlAN1/yX59TKYpN///9y2vgepRVkFC9/pwsbn/YTNea/ILZgvGi//7xP/6aJ9WR///9qdMhuf///jG6PvdqefEDOZNO1u7ruqIX/1pST6tAc//+l1LOY0T6sj///7UzktN////A8SnqY5MFrENUH2U2tzuukqTQ+ipU/38HQFn4OpBir3W2ZsZyBz//5n4QhIpw5vJqof38odTJv3gszyqA6i+XUkkljav+7/lgP/TFMUn5nIfR/QGNrGkx9seX2Jf3MiLbsqn+Mcib/5TAHNxf/8ShYcBprd3Ng/m+tV4Glf+wc5VPO25On+DiYLrRdmC72lPPLyJF8mZhdB8YAOQmnpJS5JKKuWFug4ZrshMecRySrKGHhc/JA3zN/r2uIIIYOQfwYNJE9SRGVYWCrqxnV0do7M/OoojJUeR11AbDKnOR286fkBKqid9JzT8NHqfZ+yw8jm/Fbc5Tf+/M/dzIjLsDmqskzYJCwFWyX+QBgd9G35KcAXRtaY6cwGhn0zYL1DjsQpfI9wfQAW83NrtWRk1qQ3QMKpSbMDuFlmbVInwOt++kH7PTDU6hsZxQ1i3fMvyZ2ZJQ9WwXISSIPFc+zlhZhJcTO9TWn4A2pCsD++MC+NCBAxzqsFMvwju6r57i81uVhC8npFjdu9+gni2YIkYZ1gf8oahn58X/Aehe/ptwo0FvTZioQM4ZioQM4wz9uM451Dm+JUgO8i5NopCor6N4ZijMCyCR1p2gAAP76Tp8JAHmgAsUADynmBvWKh1Eh7vwMgABsIZiJVwYAEG/QAAAABeg1+1QlQOmdDF03xAUzjkaubxcACF8wpUiO8nv+OqWw1vx3CoeTc6e/FQRiXrkRWtawF32vtPO0rL38/ETQ/NuhVro5lkP4PsfLYXog2fIvMwqcWxCIknFzFiss/uotEHSqOrw3PHJi5AAQOBcec1/5SmGd4JlhXhbXCwlXPHrLhhSES43UpeZQjFAURqCs9WKNCY0s4ova7D9GKEmJR4ACDQAAEIEZjTOAAADKg5YLj9kQC28JBJmt/dmhMn1X0LxfDwJCpp3qTMaysQ+e+RIj/w5sdO3lck1sHVhBbeI6RRZc41nMfcDGAI7ploph3U8/xg3fUcAdXcipy0M1frQs/S213JabrwYzbXhgpT4mtTecgjtSOMAbCEy+P3Gp1DTUfWQlmLBqX1K/1fu/2r9eW92lM4J8v7bRW79Tn7knKByfS4I2s6SooHDO1acAAAAClAAk/dkEa5+2TH0jf0oSaXf+e8UpkWPV+e79DV7sQcRwmVxoa/80DRtkjUDOiZ1zkrYeU6SQxw3mRo9PwdsWL+WoL2zfgbyUALgvN0y/reDs32R/3UrV5ojidxB5Xy0bU16DPxVd9u0HCpt8tXKXXAviLC0J2lult/mtQIvW4J+oRtwJwLKL7K3c0tkyeTxeAAAApnUWEhqeUr8MwTR6kDEpi/kK7qUGE3Y3FoOO8GSyfV6SFdYrv6a7KdaPrgfv7wpQ7BhgNCtYZwAAcS2s2aerjPenw/3jDYUrpFOtv9e1+AmNgwIszmJW/9UZBraawvP1gZJHOsPiL8fD4sCBNFfPUYfwu7DMJBJHnCjeVozF6EeRqixgC9rHP2YNfZkqec6vFBmmjvv4aMBIjx5T0oNkuNAo6FPELY4ksEQ6y+7ka11EWdf/yHVsatq6tn4dBlUFQxzATgSUJoSEnZVy+yvkKS5Po/GQdlPOcvHer7PCx6wUSF0ut81IEnqn7M6A8sqBRe/GjqggGaguVCDb4tmYjTvIWmR3TsjoAHMFvVzDqIOxqNY0FxSUf9TRzNhzD6U1IqMV8T/MZPWQGO8K8eKigQUk9Arve//CsJsX7JqFvwBllYZRvAWX5+LPShyzjpAKrXAWuUNxW6vUHxU1Y6ybY5aKPhdy2jGwqGWaMwBPF2ebizwugKXWa4X6hkSMHm1FSBx1ST46gpEY5UW2XkFZlK0y7WmtebABZiyxtodPpE7L98tCsJmF5bueXcuxEBQBTVVLaCS5GJgdhzR4DGYNJMY2+8wzTcizGJai7KVEt3yJbfcvAKONajNkGv3DAtzEFafs39wzly+lLbHBq3fDxDh7OunjvWjaSXOZBvJLvBcvHxdKiaHs6zAekvaX+mCM7WwLvIrvLNzou08FsKOWYXbZ/F6spxVADR5VpfZEGi5JA8MDjR70ADAjQo3jOIDw4nH01D85sgCArznteAZMKRuQGghh14wmfXaArmWdvh5l0G0ZRDXWkYJr69nE0SuOf/j+s02K2+/krk0HA5aNMNvq2ThyjY1YsAn1VqXGecoZtWAf/ZH4z17U5EsQT350pYbx0Ewb3vIPL8NQO+roojdXcW0LsI3JMvp2Zlzr3IHvHreqC31WEQVh/nyp9DmVHn5Js7lmynGHtctF3mgCycYhta0KN+wlEThcl+J5v4WHEZ0ykSuAAAoPMjHkoo3ajrWtPr0CYV3yJhp4IUmhpqKNtpOr+Q49UbcapY6Phq5BWxolxyltR1/pfWvLMUpouxaVaTx9rGPdnba3+UpVl8E99WFSE7AgvqvxNTrFxqhbzOK/H175A9xGhkcWQmIhHvpSDPQuURiH7OWBzvGx1tAskPyc6YY2yGBnFd6wg7kLVbjOiU6HXTGlvLB05+22x9OA1n3A0Mzn3vBURyCZu3XtnFwxBYimem3C3oNdKe1ZIEg+7C2IFAelvGIgRiju/gFWQvYzQkxDFEQc3O2+dX7R2fByr121nzeS6lnYmtBxGlDfXaytoLSX/G0yTfPTWJIpZ+zI/Rno50WAUdco9LuzB3bbVm3iv+jJ1a146xVKu3//5/41Km2E/55KJuVLt3nvhWvCD2VvRtulUVB955BCD+PFnfR3pyWBt26NM4s1h2K9pv7wzM3eFORyzYrXOdKu02A58kIClwqHlmIjE6YswvMykPzuYSDxQUaSmIgAAATnjsvN8QSsc/UmomEpMZ9jveUsNH8V0CuLXBPs289FgfVC+r4DAuytO9PsG5CCgg6DbuZPbEaOhZm9/9B5B9abQ7WXX/rrW8MggqtW7HDowNMmdvRCGsM/9P/Ug41DJPHW1+3L+pcqVIEODPZufqfkH5LE7LlNQbhqP/CMLMW70fwZGMNFahfScO8nkIBNnAEfoeNx7mj9dxpLt0fg8/WyAWR8FePC49q3RFX/mNwcIUFz7IsdTjFOXPu160Xpy0+F1cXSiiWMoFM4XWHRmfGi3BRqwNXJEFuaQBHnpI5DKqDqYux9Apn67mCxw0mG7R+5OLJVLek2kVtAuOWzth8eQ4k/CwflQMTSuuQNeE0cHkgQhtfZtEddDAQltd6XI0wWKHOSxAGq+yfl+MMipiBow432Nu6woMZ10OE0aoX5eMbCW0PKpoIiGTCzqobTAox7ttx00HDPPQWML3ay+i5zQ6+ojr2FmIvdAXceggpYq1XHyoNEbyxX3XJ9VM5MCjNvWtzY6/SoH7b1UIvYyHHQ4w17IMbcgq45fN86MoA2Gw4KXoSULUVITK/tcCQYf3CcY6dO5e1C+fZHn7RM7Q+CExReN1PltliJaLs2sH+apNu9p2Pn/3xbgBli/Dab999bcHc8sOzu9fVc6c3CfNt56RiSRI1OE4G/6UNZCai6KAwg9UxosFaG3hzmQ27VhqfLnV81QYvqlht6P7uv8GYRO4q1SG+2OWmpEXb6KGGahDbde3pG10xtvDNF2UqJnwmIdiL+wxkhV3wjoWke+9/hZuwnfi+5Ef+eRG8cKBmLqP0j6p48LmwWZc07b/CuxgAf7QrcNgUIDqrnPaTZXH4SX3OLPUifZNRcmbIwkKOAyoVfDTbAGP1krliWAndIVoKhU1wYrDdOyeJQma/YXYk2BCOg0COKIwPyrV3F+41h8vKI03sCOpUxNg+nFWMECWfkrTRgz6bkbbJzbUh4KEc5A03WIbBtEE7L1t07oKL1pbSL6flMzuyFDNru4Oa7i9bkpmb7ynvFq2bWt/BmKERlTHeJI2BzEIjjWkWVDh5k+Y4VIZQkAIX5x3J0B9gcsC8o8SyTECJaKPMoesYcqTQuw5ziBFjkxrbYATo82Z5JQnqwb4JiyrmenF2KukrQo9y6sUPsRCRjz1EHOf3ltFCfeiMubbIo6kA+zSPEHqDI5JnlgQoPQLAJFIaii2xlxi/mWx42K1JtzHXXXxHycaxkNSx2smpW7JIioFVDEgoBA+AKVKZIMviz83CxzxfcIjfQGgjVGp2lHSiW37/GFRQ8IUgj8xyFfq3+PxlFUtfqEf2HZjEcrADYKV1DZL2yXjVwxPsObssJUEb/mz/UNkhRjZR6mEQELE3mN9Lj+4f5/vWsGOUPlU86Il0q08GtG7Sygvx4COIB8DfYTisvtRlOL0RvL1mWkVWO+vfNhcbMbrAfjsmvoKtQD5kRm6/XY72fGCjxf8i1frsUAzsfh8v6zwqbleXqlJpmMsGABhf4zrLP3O0SQmxz0EIl/24shsIRZDPLPt63Kk5ZxhhN6eOYhA/oS7byWYgBwXWW/EVcdVvBkjphxuMhsE6p9uS5pxY8Y5P6niWjQ+kVh63IEhxMn9a0tUGBhv5tV/CjArsOzXh20b/m/EpAs7Gpibl7s1KuOk2Q584l8m4Rc8gxvJ/WFaodq9sEd5cQ8vH3F/JpEYwCWEUX9b1HuCVebCp6zJd/UQRTmpvUZUaAGpH9deF7b/1SQMYTIFQ+lUGb7V0hKXP85uzIVMwQbV/Xq2nJz2gr3KMm+/YjUbcdxamcsqDxP1DdEK+B6uMr5nev9Vn9prl1LivqwkJqLFIAcGtVbuSSiIVscoiwBp7vUzHCHOkBIQcLgNwVdnhV/nEkNpiEqiQ+3UEWUn6u6glSt9GKr4YqGl4ePeCy+DYadGAoIJrdb9tOr5XyD/lHx41iCouiLaLuUgOaFHiYvDdjhUsVjD4LcOfZ1gf3TPsYwrfbGqRfyyvNetesSbWZ9nfIEW6sPGLS6K9yIR/1e6wiQJIXL2Mi6MztvjG9KtNYIg1k7SLKd4YDm/Ig7nbdAyU+xr/5I2CXBVuBfdoplEjklJo8RoSlU315JoNgpABjYp+xRiYJIEs55nd5+FVaY5hl17LJnup46Qffrzt7WQAu8X8Hy1NttcNITKFTJPuduFPZzFm2Q3q/URvqDGHqA+mdDPZ4zXVtYYdy2OmhHUmpkBYLFaJ6g3swUgzj0R3VTkqy5aL9AnnCoosMp1ZNwYRwfCMYqLALihK5b+43gFKtixT6TVGyeEr5RsjXcJSSzTwZiXXtYZGkVAoPMt0FlFTBi+OyBEXJ3rNiXwiXNLFcFTRK40vHAjQPOl2WSwXomBevZ/km1mA7x+h8MCl65aEmldQOXEvArVn+m/ZYOuTNVNOOB3HOo5Wafbniw3Gt3A6Gri0QFlk8kZJbpzWaTC+HnZEUCL18uEwdT6dYPdYv1FrOaAINbofShRYyJc/1qSy9a7IY2fPv/zrWcwAbvcy1F0e/9syLrJldFeWhJfIxbenzpqBCrpbgCJmj+6vVq/Qual78tshy/nPZhN0j14y0TtUOQWmZ2YU8TNKI3Fo1FHN05RzT+dIwmF5w1+5QAzi76uRJwotcseqMsaZIdVvcmJlBmXy5u3H4U00mLnWaWZ2u85tZgO90wiYPRdgAal6ikhXis+Ihs5oL2N7d0R9d/1S0orxVraCt/URAUEl3CsN7hwOl/JuHPrgdsM3XyXaJDcZAiPBcdeZaGdm/0/u1oWE1D6315nexDrf/5FklPrFNqVEopqiwC4UUSHwFd4bDR6PED7qx36h6J45p0Vaqc4Bz9xiGIwdkB1DynHPGN2Lwc/PUcXKhwd6B0bHeXOL2x1IDpuyUQkA5njvng1+W2OlMkpCtPVkXGgoK9Qj/nnmYMiFmtIyVmPgQKpUDJF/pBAn/px+mpPKitV92DyFRXVgId5sjEv5fRitsxZJZvBJ1pTJUoXShxcFFIj22DkKol15p262AE88BJYvrbn1XfrhSwgysWMUI/0zQohiO6NoBJqtmoHsM/Nhsq+D/eoKIZ/CFjd0d4aktGAb9rMBo28Q6eiLsDBc075egv6hOUv0fOT+dD6gsJ0wpoauxPrL7YMB+C0ShepOfvaKOVSkOh2dMkUvpcWpEN7Ph2nIU+IysEOoXoicMzCPC21hFbvhXCj2TLBU3PA4NBlecLRe7FNTOEML1BVySzQXXxQg1p8cbr24+V1n30yiBTHrGtzvUwhS/6YbhDGrvv53jPeCyf8EeSSugaiSHhXl9/Jtryh4P1NQ2Lk+qwuEg8Wma44GBulpfyozuoRxgYA/k8ywkMZkwAfws/ObfNbmZfs7UkjkAhQCWIo/0mK+WOGaVUKxYaEF4WhNThWiC1puDKfWA15TzXx0DhzE3q4Osh4cqCk3LW38rkj5+4rPAS7T73fY28P4nMMCs+CEeGH8N5OfvOvE6/NrAzy7Zx+awCzt0fwbw5Fe7PShSLfNe9G9Kg6K1LKmbaqNDqUVuMKDGj0rfBxgl6QkZcXR/aJdcfn9B1VzgDWfDlzluE16wpx4Af7MV1PpFMq81ItgD/WQYrQtyADBwSXFoQePfzMfJioMhDh/MI9W5bp1zhNPMYh086rjw2UXgTEO63QI6Dur/xEXmx3MXUQqB2+TShwea0RrpKns2DinSqhr0vg/uzMywofsj8ZaXaH6ByVoTuHLDg5Oj0Fb7ksf7Enzzzf9/6tPh2PTRX57nc2+IiVJo1t7Kl32l4hYZ7rwTHtOVVIlpuiU4j6k/xhyW2k+TnLPFAVtNKEW2dGJD7lbvcx8kQN/jnABKjebJ/g53L/CAU5uqvnn+CWxShiQADn8us4HZLyNX6eXI7XNpESKVddrrpCYVFdj2KtzNmHf8enDUuGy+9D7vuYUYD0hBIsm98h3DfY/E2yYZ9RKUN8/yfo+CG+ymA/Eucvbs4z1dxhdwOjPdICkYJA/jtSqi/Ue5Isjx4dnOoB/52CwwM3jXVA01uShq/xzmzkER9r1ycT6IjjCxPPP+jwbkUU2jZy5+BWUxaLhGFJi2tmqaHu0YP3uYDdXz0oYPgg4QJ8WTJjTmDz7ZFwA5I+XsRolM8Ba8phfPcoY8NbSo9Vs8PL+qNwLXfLUdtIVy87Xn6AvhMODaCQ8DMHaic/qtjcbzpw1PqqmmjIHop5kG3eNM34eDgMIhQ0xQEZewswyONvphMibyB7cm69dffoAAAEVYSUa6AAAARXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP//AAACoAQAAQAAANACAAADoAQAAQAAAOABAAAAAAAA" width="720" height="480" class="img_ev3q"></p><p><em>Fig 1. Speedup vs. top-3 serverless platform.</em></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="increasing-performance">Increasing performance<a href="#increasing-performance" class="hash-link" aria-label="Direct link to Increasing performance" title="Direct link to Increasing performance">​</a></h2><p>Extra built-in features such as decentralization and statefulness are what make the Internet Computer performance for large workloads lower (see Figure 2). While these features are extremely powerful and important, they also eat away at raw performance.</p><p><img loading="lazy" alt="Figure 2" src="/assets/images/serverless-figure2-4cb4774a08d4ab31c57296e34dff1126.webp" width="720" height="333" class="img_ev3q"></p><p><em>Fig 2. The decentralization and statefulness overheads of the Internet Computer.</em></p><p>DFINITY engineers and researchers will continue to search and explore ways to enhance and improve the performance of the Internet Computer. Some areas of improvement could be increasing parallelism or replacing the current storage layer with a log-structured merge tree approach to improve checkpointing time.</p><p>Unleashing the full power of composite queries to enable more complex applications will also have a positive impact on performance. Work on composite queries has already begun to enable horizontal dapp scaling and to simplify client-side code. Further engineering to allow cross-subnet query calls and replicated execution is underway.</p><p>Build serverless applications on the Internet Computer <a href="https://internetcomputer.org/docs" target="_blank" rel="noopener noreferrer">here</a>.</p><p>Run an enterprise pilot the Internet Computer <a href="https://internetcomputer.org/enterprise" target="_blank" rel="noopener noreferrer">here</a>.</p>]]></content>
        <author>
            <name>Alexandru Uta</name>
        </author>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Internet Computer - Weed Out the Bugs with TLA+ Models]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/tla-models</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/tla-models"/>
        <updated>2023-08-24T18:13:23.000Z</updated>
        <summary type="html"><![CDATA[Today, DFINITY is open-sourcing all of its TLA+ models. To top it off, the Foundation is also publishing a comprehensive technical tutorial to help devs apply TLA+ to canister smart contracts.]]></summary>
        <content type="html"><![CDATA[<p>Earlier this year, we highlighted the benefits of applying TLA+ to canister smart contracts on the Internet Computer. The TLDR: (1) the potential for immediate monetary loss makes security and correctness critical for smart contracts, (2) formal methods such as TLA+ increase the protocol’s correctness and security in general, and (3) TLA+ is in particular good at weeding out a very frequent class of bugs, called reentrancy bugs, from canisters.</p><p>After some cleanup work, we’re excited to announce that we’ve just open sourced all of our TLA+ models. You’ll find models of the following canisters on GitHub:</p><ul><li><p>NNS and SNS governance (focusing on interactions with the ledger canister)</p></li><li><p>ICP ledger (focusing on block archival)</p></li><li><p>ckBTC minter</p></li><li><p>SNS swap canister</p></li></ul><p>We hope that these models provide you with real-life examples to draw from and help you create your own canister models. Additionally we’re sharing a companion in-depth technical tutorial to guide you through this process. The tutorial provides a general strategy of how to model the idiosyncrasies of canisters in TLA+.</p><p>Since TLA+ is a general modeling language and isn’t specific to canisters, we have also applied it to parts of the underlying Internet Computer stack. For example, TLA+ helped ensure that the Internet Computer could smoothly migrate the Internet Identity canister. TLA+ first detected corner cases in an early version of the migration design, which could have rendered Internet Identity client canisters unable to cleanly upgrade, and later helped verify the fixes. The repository also includes models of:</p><ul><li><p>Connection establishment subprotocol for the people parties dapp.</p></li><li><p>The Internet Computer consensus algorithm’s safety properties.</p></li><li><p>The Internet Identity migration procedure.</p></li><li><p>The subnet splitting procedure.</p></li></ul><p>That’s it! We hope you find these resources useful. We look forward to seeing new TLA+ models for community-created canisters and dapps. If you create some, be sure to let the wider ICP community know in the developer forum. Next up, we will soon start working on some tooling to link the TLA+ models to actual Rust code, to address the problem of models and the code diverging as code is modified over time. Of course, these tools will also be open sourced as soon as they are production-ready, so stay tuned!</p><p>Get the open-source code for TLA+ models <a href="https://github.com/dfinity/tla-models" target="_blank" rel="noopener noreferrer">here</a>.</p><p>Check out the technical tutorial <a href="https://mynosefroze.com/blog/2023-08-09-tla_for_canisters" target="_blank" rel="noopener noreferrer">here</a>.</p><p>Learn more about the Internet Computer: internetcomputer.org
Follow the tech on Twitter: @DFINITYDev</p><p>Start building on the Internet Computer: <a href="/">Developer Docs</a>.</p>]]></content>
        <author>
            <name>Ognjen Maric</name>
        </author>
        <category label="Technology" term="Technology"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update August 23, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/08/23/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/08/23/news-and-updates/update"/>
        <updated>2023-08-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this issue, we're excited to announce a new developer video series, along with providing some information about the upcoming proposal that would enable the 1-proposal SNS feature, plus how to enter the Internet Computer Devpost hackathon.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 23 2023" src="/assets/images/dev-update-blog-aug-23-bbf0f7114ce8c9f1e6e0f7113c67ea32.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome to this week's developer weekly update! In this issue, we're excited to announce a new developer video series, along with providing some information about the upcoming proposal that would enable the 1-proposal SNS feature, plus how to enter the Internet Computer Devpost hackathon. Let's dive in!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="internet-computer-developer-workshop-series">Internet Computer developer workshop series<a href="#internet-computer-developer-workshop-series" class="hash-link" aria-label="Direct link to Internet Computer developer workshop series" title="Direct link to Internet Computer developer workshop series">​</a></h2><p>Today we're excited to introduce a new, on-going video series: 'Building on the Future // Workshop Series'. In the latest video of this series, David Dal Busco who is a software engineer at DFINITY, showcases how to build an Internet Computer dapp using Juno. This workshop video teaches developers how to implement authentication into their dapp, save images and other data onchain, and then launch their first smart contract onto ICP without needing to write a single line of backend code!</p><p>Want to get started? You can find the video tutorial <a href="https://www.youtube.com/watch?v=mr_9XArcG9Y" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="1-proposal-sns-initialization-feature-proposal">1-proposal SNS initialization feature proposal<a href="#1-proposal-sns-initialization-feature-proposal" class="hash-link" aria-label="Direct link to 1-proposal SNS initialization feature proposal" title="Direct link to 1-proposal SNS initialization feature proposal">​</a></h2><p>On Friday August 25, the NNS team will submit an upgrade proposal that, if adopted, will introduce the 1-proposal SNS initialization feature. This new feature for SNSes has been developed based on feedback collected during the launch of previous SNSes, such as OpenChat, where it was requested that the launch process for an SNS be simplified. Particularly, the feedback received suggested that some steps of the launch process should be combined into a single process, that would then be triggered by the SNS proposal submission.</p><p>This new 1-proposal initialization feature combines all of the SNS preparation steps into one process, making it easier to launch and verify an SNS. You can read the full details of the 1-proposal SNS initialization in this <a href="https://forum.dfinity.org/t/enhancement-of-the-sns-launch-process-one-proposal/19548" target="_blank" rel="noopener noreferrer">forum post</a>, and find additional information regarding the NNS proposal for this feature <a href="https://forum.dfinity.org/t/nns-sns-update-august-25-2023/22303" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="devpost-hackathon">Devpost hackathon<a href="#devpost-hackathon" class="hash-link" aria-label="Direct link to Devpost hackathon" title="Direct link to Devpost hackathon">​</a></h2><p>Calling all devs! The Devpost 'Fully Onchain with ICP' hackathon is happening now! Until September 25, you can enter to develop a project on ICP and win a number of prizes.</p><p>There are three possible tracks to follow for this hackathon:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="track-1-the-awesome-icp-track">Track 1: The awesome ICP track<a href="#track-1-the-awesome-icp-track" class="hash-link" aria-label="Direct link to Track 1: The awesome ICP track" title="Direct link to Track 1: The awesome ICP track">​</a></h3><p>In this track, you can build any dapp that showcases and leverages the unique features of the ICP. Some examples of awesome dapps might include SocialFi dapps, where social media interactions are reflected onchain so users own all of their data, decentralized AI dapps, DAO tooling, or multichain infrastructures dapps.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="track-2-the-buidl-bitcoin-track">Track 2: The buidl Bitcoin track<a href="#track-2-the-buidl-bitcoin-track" class="hash-link" aria-label="Direct link to Track 2: The buidl Bitcoin track" title="Direct link to Track 2: The buidl Bitcoin track">​</a></h3><p>In this track, showcase how you can take Bitcoin to the next level using ICP's native Bitcoin integration. Develop a project that unlocks the full potential of Bitcoin using ckBTC, a native ICP token that is 1:1 Bitcoin backed. Example dapps could include functionality such as secure login, direct API calls, community-governed canisters, or leverage enormous computational power.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="track-3-gamefi">Track 3: GameFi<a href="#track-3-gamefi" class="hash-link" aria-label="Direct link to Track 3: GameFi" title="Direct link to Track 3: GameFi">​</a></h3><p>In the third and final track, you can develop a dapp that provides next-gen web3 gaming to help demonstrate what the future of decentralized gaming looks like. Dapps that include wallet integrations with popular game engines, popular game formats like tower defense or battle royale, or in-game economy functionality are all things we'll be looking for in the submissions!</p><p>You can learn more or enter your project by heading over to the Devpost website <a href="https://awesomeicp.devpost.com/?utm_source=devpost&amp;utm_medium=twitter&amp;utm_campaign=onchainwicp" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="icp-javascript-agent-v0190-release">ICP JavaScript agent v0.19.0 release<a href="#icp-javascript-agent-v0190-release" class="hash-link" aria-label="Direct link to ICP JavaScript agent v0.19.0 release" title="Direct link to ICP JavaScript agent v0.19.0 release">​</a></h2><p>This week, we released a new version of the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a>, <code>v0.19.0</code>.</p><p>In this release, features and enhancements include:</p><ul><li>HttpAgent now uses <code>https://icp-api.io</code> as the default host.</li><li><code>@noble/hash</code> has replaced <code>js-sha256</code>. This change has resulted in reduced package sizes.</li><li>New crypto nonce randomness.</li><li>Nonce generation no longer uses date.</li></ul><p>For the full release notes, check out the changelog <a href="https://github.com/dfinity/agent-js/releases/tag/v0.19.0" target="_blank" rel="noopener noreferrer">here</a>.</p><p>That'll wrap things up for this week! We'll see you all next week!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Node]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-node</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-node"/>
        <updated>2023-08-16T19:37:27.000Z</updated>
        <summary type="html"><![CDATA[For this edition, we interviewed the Node team to learn more about the core technology of the Internet Computer.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Node Team spotlight" src="/assets/images/dev-update-blog-node-d0c5cac7625df44fb953af02e34b35b4.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello everyone! It's time for another issue of team spotlight.
For this edition, we interviewed the Node team to learn more about the core technology of the Internet Computer.
The Node team is an extremely vital contributor to the Internet Computer, since they are responsible for the very foundation of ICP: nodes. I hope you're as excited as we are to learn more! </p><p><strong>To kick things off, let's start with our usual introduction. What is the mission of the Node team?</strong></p><p><em>Our mission is to enable the Internet Computer protocol to run on distributed, private infrastructure, all over the world.
We define the hardware standards for the hundreds of nodes that make up the Internet Computer network.
We build and maintain the software used in the decentralized onboarding process, enabling node providers from all over the world to onboard nodes after gaining approval via the NNS DAO. We build and maintain the software running environment for the many ICP services that run on node machines. We oversee the node lifecycle, from onboarding to self-upgrading to security.</em></p><p><strong>It sounds like the Node team has an enormous amount of responsibilities, essentially being the foundation of ICP. What is the composition of the Node team?</strong></p><p><em>The team consists of 4 engineers, 2 researchers, and 1 engineering manager, spread across the United States, Canada, Switzerland and Germany!</em></p><p><strong>Could you give us a brief overview of what the IC-OS is?</strong></p><p><em>IC-OS is an umbrella term for all <!-- -->[of]<!-- --> the operating systems within ICP, including:</em></p><ul><li><p><em>SetupOS (AKA the IC-OS installer), which deploys a new replica node (by installing HostOS and GuestOS).</em></p></li><li><p><em>HostOS, which runs on the bare metal of a replica node machine. HostOS runs GuestOS in a virtual machine.</em></p></li><li><p><em>GuestOS, which runs inside a virtual machine. The replica is executed within the GuestOS.</em></p></li><li><p><em>BoundaryOSes, which includes Boundary-GuestOS, Boundary-Api-GuestOS.</em></p></li></ul><p><em>Readers should view the IC-OS folder in the IC repo where our operating systems reside: <a href="https://github.com/dfinity/ic/tree/master/ic-os" target="_blank" rel="noopener noreferrer">https://github.com/dfinity/ic/tree/master/ic-os</a></em></p><p><em>Here is a high-level overview of all the services running on a replica node:</em></p><p><img loading="lazy" alt="Node diagram" src="/assets/images/node-diagram-924e57b7991920dcfaa99dde0988589c.png" width="1600" height="935" class="img_ev3q"></p><p><strong>Within DFINITY, there is the Node team, and there is a Boundary Node team. How does the Node team differ from the Boundary Node team?</strong></p><p><em>The node team maintains the replicaOSes (SetupOS, HostOS, GuestOS). These OSes run on replica nodes. The Boundary Node team maintains the BoundaryOSes (Boundary-GuestOS, Boundary-Api-GuestOS). These OSes run on boundary nodes.</em></p><p><strong>Node providers are an extremely important component of ICP. How does the Node team support node providers?</strong></p><p><em>The node team supports node providers during the onboarding procedure (IC-OS installation), but one of our team priorities is to make the Node Provider onboarding procedure as simple and decentralized as possible so that the Node Team and DFINITY are not a necessary part of the onboarding process.</em></p><p><strong>With so many responsibilities, and such an important team initiative, I can imagine that there are several challenges that the team faces. What would you say is the biggest challenge the team has faced so far?</strong></p><p><em>Keeping up with dozens of new features that require our assistance while managing our normal workload. There’s always more work to be done!</em></p><p><strong>With consistent upgrades and changes to the IC-OS software, how does the Node team contribute to the lifecycle of nodes?</strong></p><p><em>GuestOS and HostOS are both self-upgrading. Each OS has a mechanism to write to a passive partition set and reboot into its passive partition set, thereby upgrading itself (and making the passive partition set its active partition set). “Replica upgrades” are really GuestOS upgrades, as not only the replica is upgraded, but also the entire GuestOS and GuestOS binaries (including the replica).</em></p><p><em>Since launch, over 100 GuestOS upgrades we completed, and we are planning to submit a proposal for the first ever HostOS upgrade very soon.</em></p><p><em>To learn more about the upgrade procedure, see here: <a href="https://github.com/dfinity/ic/blob/master/ic-os/docs/Upgrades.adoc" target="_blank" rel="noopener noreferrer">https://github.com/dfinity/ic/blob/master/ic-os/docs/Upgrades.adoc</a></em></p><p><strong>Does the Node team interact with or make decisions regarding node hardware?</strong></p><p><em>Yes, the Node Team is responsible for defining and validating the node machine hardware specifications. When validating hardware, the node team has three main criteria:</em></p><p><em>1. Performance. Node machines must be fast enough to support the high-performance apps that run on ICP.</em></p><p><em>2. Storage. Node machines must be sufficiently large enough to provide low-cost storage.</em></p><p><em>3. SEV-SNP. The latest hardware generation (gen2 hardware) requires SEV-SNP support via one of the latest AMD CPUs. To learn about the full hardware specs, see: <a href="https://wiki.internetcomputer.org/wiki/Node_Provider_Machine_Hardware_Guide" target="_blank" rel="noopener noreferrer">https://wiki.internetcomputer.org/wiki/Node_Provider_Machine_Hardware_Guide</a></em></p><p><strong>Have there been any improvements made as a direct result of node provider feedback?</strong></p><p><em>Absolutely. The Node team is constantly receiving feedback from node providers about the onboarding procedure, and we use this feedback to improve our processes and documentation. All Node Providers are encouraged to join the Node Provider matrix channel to share any feedback or suggestions with DFINITY and the community: <a href="https://wiki.internetcomputer.org/wiki/Node_Provider_Matrix_channel" target="_blank" rel="noopener noreferrer">https://wiki.internetcomputer.org/wiki/Node_Provider_Matrix_channel</a></em></p><p><strong>That's incredible to hear that node providers frequently help provide meaningful feedback.</strong></p><p><strong>Switching focus, what is the primary project that the Node team is working on or focused on currently?</strong></p><p><em>SEV-SNP protected replica nodes.</em></p><p><strong>What are the primary components required for completion of SEV-SNP protected replica nodes?</strong></p><p><em>SEV-SNP is a hardware-based security feature built into new AMD processors. Enabling SEV-SNP protected virtual machines requires designing and implementing a great deal of new software infrastructure.</em></p><p><strong>What are the benefits of SEV-SNP replica nodes?</strong></p><p><em>SEV-SNP protected replica nodes will provide a much greater level of security for the entire ICP by making sure that only NNS-blessed GuestOS images are running and encrypting the memory with a tamper-proof hardware-based security feature.</em></p><p><strong>It sounds like an extremely rewarding project! When can developers and users expect it to be completed?</strong></p><p><em>SEV-SNP enabled replica nodes are planned to be rolled out by early 2024.</em></p><p><strong>Where should developers look for the latest Node updates? (Forum, Discord, etc).</strong></p><p><em>Updates will be posted to the developer forum!</em></p><p><strong>What is one feature or aspect of IC-OS that the team is the most proud of?</strong></p><p><em>In the 100+ upgrades in the history of ICP, not a single one has caused an ICP outage.</em></p><p><strong>That is definitely something to be proud of! That really showcases the efficiency and reliability of the node team.</strong></p><p><strong>To wrap things up, what makes the Node team unique compared to some of the other dev teams at DFINITY? </strong></p><p><em>We have to concern ourselves with the entire ICP stack: the canister smart contracts, the Internet Computer protocol and its running environment, the networking infrastructure, and the node machines themselves!</em></p><p><img loading="lazy" alt="ICP Stack" src="/assets/images/ic-stack-aebb5b405ef50443c9a7e76da15240bc.png" width="1599" height="900" class="img_ev3q"></p><p>Thank you to the DFINITY Node team for sitting down with us today and providing such educational and insightful information! I hope everyone reading has enjoyed this interview as much as we have; it was great to learn so much!</p><p>Until next time!</p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update August 16, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/08/16/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/08/16/news-and-updates/update"/>
        <updated>2023-08-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this issue, we're excited to introduce the first portion of a new documentation series, Developer Liftoff, plus talk about the upcoming `dfx` release and new documentation on the Motoko feature `mo-doc`.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 16 2023" src="/assets/images/dev-update-blog-aug-16-7f1692cf102fbc32d23d478d589a41a3.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hey developers! Welcome to this week's developer weekly update. In this issue, we're excited to introduce the first portion of a new documentation series: Developer Liftoff, plus talk about the upcoming <code>dfx</code> release and new documentation on the Motoko feature <code>mo-doc</code>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="introducing-the-developer-liftoff">Introducing the Developer Liftoff<a href="#introducing-the-developer-liftoff" class="hash-link" aria-label="Direct link to Introducing the Developer Liftoff" title="Direct link to Introducing the Developer Liftoff">​</a></h2><p>Today we're excited to introduce the new Developer Liftoff tutorial series! This series is designed to bring new developers on a detailed, diverse journey through development on the Internet Computer. The journey starts with 'pre-flight operations', which is an introductory level that provides context for the remainder of the journey, such as an overview of what ICP is, how it works, and how to set up your developer environment. Then, the journey will bring you through a series of modules to develop your skills and learn about additional ICP components in order to become an ICP astronaut!</p><p>Overall, the journey will contain the following modules and components:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="level-0-pre-flight-operations">Level 0: Pre-flight operations<a href="#level-0-pre-flight-operations" class="hash-link" aria-label="Direct link to Level 0: Pre-flight operations" title="Direct link to Level 0: Pre-flight operations">​</a></h3><ul><li><p>0.1: Overview of the Internet Computer.</p></li><li><p>0.2: Internet Computer terminology.</p></li><li><p>0.3: Developer environment setup.</p></li><li><p>0.4: Introduction to canisters.</p></li><li><p>0.5: Introduction to languages.</p></li><li><p>0.6: Introduction to dfx.</p></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="level-1-space-cadet">Level 1: Space cadet<a href="#level-1-space-cadet" class="hash-link" aria-label="Direct link to Level 1: Space cadet" title="Direct link to Level 1: Space cadet">​</a></h3><ul><li><p>1.1: Exploring a live demo.</p></li><li><p>1.2: Developing your first dapp.</p></li><li><p>1.3: Acquiring and using cycles.</p></li><li><p>1.4: Deploying canisters.</p></li><li><p>1.5: Managing canisters.</p></li><li><p>1.6: Motoko: level 1.</p></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="level-2-space-explorer">Level 2: Space explorer<a href="#level-2-space-explorer" class="hash-link" aria-label="Direct link to Level 2: Space explorer" title="Direct link to Level 2: Space explorer">​</a></h3><ul><li><p>2.1: Upgrading canisters.</p></li><li><p>2.2: Using third-party canisters.</p></li><li><p>2.3: Canister query and update methods.</p></li><li><p>2.4: Inter-canister calls.</p></li><li><p>2.5: Introduction to agents.</p></li><li><p>2.6: Motoko: level 2.</p></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="level-3-space-engineer">Level 3: Space engineer<a href="#level-3-space-engineer" class="hash-link" aria-label="Direct link to Level 3: Space engineer" title="Direct link to Level 3: Space engineer">​</a></h3><ul><li><p>3.1: Identities and authentication.</p></li><li><p>3.2: Using the ICP ledger.</p></li><li><p>3.3: ICRC-1 tokens.</p></li><li><p>3.4: Using the XRC canister.</p></li><li><p>3.5: Using Quill.</p></li><li><p>3.6: Motoko: level 3.</p></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="level-4-space-pilot">Level 4: Space pilot<a href="#level-4-space-pilot" class="hash-link" aria-label="Direct link to Level 4: Space pilot" title="Direct link to Level 4: Space pilot">​</a></h3><ul><li><p>4.1: Using HTTPS outcalls.</p></li><li><p>4.2: NFTs on the Internet Computer.</p></li><li><p>4.3: Deterministic time slicing.</p></li><li><p>4.4: Creating a Bitcoin dapp.</p></li><li><p>4.5: Using libraries with Mops.</p></li><li><p>4.6: Motoko: level 4.</p></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="level-5-internet-computer-astronaut">Level 5: Internet Computer astronaut<a href="#level-5-internet-computer-astronaut" class="hash-link" aria-label="Direct link to Level 5: Internet Computer astronaut" title="Direct link to Level 5: Internet Computer astronaut">​</a></h3><ul><li><p>5.1: Encrypted notes dapp with vetKD.</p></li><li><p>5.2: Creating your own ICRC-1 token with Rosetta.</p></li><li><p>5.3: Creating an SNS.</p></li><li><p>5.4: Creating a web game with upgradable NFT assets.</p></li><li><p>5.5: Creating a media streaming platform with II authentication for user accounts.</p></li><li><p>5.6: Next steps.</p></li></ul><p>The first portion of this series, Level 0: Pre-flight operations, is out now and ready for you to follow along with! You can get started with the Developer Liftoff <a href="/tutorials/developer-liftoff/level-0/">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="upcoming-dfx-015-release">Upcoming <code>dfx 0.15</code> release<a href="#upcoming-dfx-015-release" class="hash-link" aria-label="Direct link to upcoming-dfx-015-release" title="Direct link to upcoming-dfx-015-release">​</a></h2><p><code>dfx</code> version <code>0.15.0</code> will be released in the upcoming weeks. This new version of <code>dfx</code> ships some important new features and fixes that developers should be excited for! Some of these features include:</p><ul><li><p>The new <code>dfx deploy --playground</code> feature, which can be used to deploy canisters directly to the playground. A blog post diving into this feature specifically will be released soon.</p></li><li><p>Fixes for the asset canister's response verification v2. We dove into this fix a bit further in last week's developer weekly update <a href="/blog/2023/08/09/news-and-updates/update">here</a>.</p></li><li><p>Removal of the <code>dfx nns</code> and <code>dfx sns</code> commands, which will be part of the new upcoming subcommand, <code>dfx extensions</code>.</p></li></ul><p>A detailed breakdown of the full release notes will be available in an upcoming blog post. Stay tuned!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="mo-doc"><code>mo-doc</code><a href="#mo-doc" class="hash-link" aria-label="Direct link to mo-doc" title="Direct link to mo-doc">​</a></h2><p><code>mo-doc</code> is a command-line tool that can be used to generate documentation for Motoko code. It can generate various formats of documentation based on Motoko source code.</p><p>To use <code>mo-doc</code>, you can download it directly from the Motoko Github releases page, or use the binary that is included in <code>dfx</code>.</p><p>Then, you can use the following command to generate documentation:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">(dfx cache show)/mo-doc [options]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The options for the tool are:</p><ul><li><p><code>--source &lt;path&gt;</code>: This option specifies the directory to search for Motoko source files; the default is <code>src</code>.</p></li><li><p><code>--output &lt;path&gt;</code>: This option specifies the directory where the documentation will be generated; the default is <code>docs</code>.</p></li><li><p><code>--format &lt;format&gt;</code>: This option specifies the generated format, which can be HTML, ADOC, or Markdown; the default is HTML.</p></li><li><p><code>--help</code>: This option shows usage information.</p></li></ul><p>You can find the full documentation with examples <!-- -->[here]<!-- -->(/motoko/motoko-tooling/mo-doc/.</p><p>That'll wrap things up for this week's update. Be sure to also check out this week's issue of team spotlight, where we interview the node team!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Wasm-native stable memory]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/wasm-native-stable-memory</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/wasm-native-stable-memory"/>
        <updated>2023-08-10T14:32:23.000Z</updated>
        <summary type="html"><![CDATA[Introducing Wasm-native stable memory]]></summary>
        <content type="html"><![CDATA[<p>Wasm-native stable memory is a performance improvement to the Internet Computer’s stable memory interface, which was recently rolled out to all subnets. It provides a 1.5-2x performance improvement to most stable memory workloads and does so in a completely transparent way.</p><p>If you’re already developing canisters that use stable memory, then those canisters will automatically benefit from this performance improvement. If you’re not using stable memory, maybe now’s the time to try it out!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-is-stable-memory">What is stable memory?<a href="#what-is-stable-memory" class="hash-link" aria-label="Direct link to What is stable memory?" title="Direct link to What is stable memory?">​</a></h2><p>Stable memory is a data store separate from regular Wasm memory. It is accessed using the <a href="/references/ic-interface-spec#system-api-stable-memory">stable memory API</a> which allows reading/writing arbitrary bytes. Libraries like <a href="https://crates.io/crates/ic-stable-memory" target="_blank" rel="noopener noreferrer"><code>ic-stable-memory</code></a> and <a href="https://crates.io/crates/ic-stable-structures" target="_blank" rel="noopener noreferrer"><code>ic-stable-structures</code></a> also make stable memory ergonomic to use.</p><p>The main reasons to use stable memory are that:</p><ol><li>It persists across canister upgrades.</li><li>It has a capacity over 10x larger than regular Wasm memory.</li></ol><p>This means that using stable memory is really the only option when it comes to vertically scaling a dapp (i.e. having a single canister that grows with your dapp).</p><p>But the downsides of stable memory are that:</p><ol><li>It is slower to access than Wasm memory.</li><li>Data must be serialized when storing in stable memory and deserialized when loaded.</li></ol><p>Wasm native stable memory is a significant step in improving the first downside.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="why-is-stable-memory-slower">Why is stable memory slower?<a href="#why-is-stable-memory-slower" class="hash-link" aria-label="Direct link to Why is stable memory slower?" title="Direct link to Why is stable memory slower?">​</a></h2><p>Each read from or write to stable memory goes through a system API call, and this call has a significant overhead. It first calls into the Wasmtime runtime, which then invokes code in the replica to copy over data from or to the stable memory. This indirection is needed because the running canister Wasm has no way to directly access the backing store of the stable memory.</p><p>The following diagram shows the difference between accessing the main Wasm memory versus stable memory:</p><p><img loading="lazy" alt="Original stable memory diagram" src="/assets/images/wasm-native-stable-memory-diagram-old-fcd2f99483f9aa25f38e1b906a0b6c14.png" width="1024" height="768" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-wasm-native-stable-memory-works">How Wasm-native stable memory works<a href="#how-wasm-native-stable-memory-works" class="hash-link" aria-label="Direct link to How Wasm-native stable memory works" title="Direct link to How Wasm-native stable memory works">​</a></h2><p>Fortunately, the new <a href="https://github.com/WebAssembly/multi-memory/blob/master/proposals/multi-memory/Overview.md" target="_blank" rel="noopener noreferrer">multiple memories</a> Wasm feature allows a Wasm module to directly address multiple byte arrays, called “memories” in the Wasm spec. We can use this feature to modify calls to the stable memory APIs to directly read or write from a secondary Wasm memory.</p><p>The following diagram shows how stable memory accesses will work under Wasm-native stable memory:</p><p><img loading="lazy" alt="Wasm-native stable memory diagram" src="/assets/images/wasm-native-stable-memory-diagram-new-0dcd2a9ae653b54f06930b1135b76752.png" width="1024" height="768" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="performance-gains-on-sample-dapp">Performance gains on sample dapp<a href="#performance-gains-on-sample-dapp" class="hash-link" aria-label="Direct link to Performance gains on sample dapp" title="Direct link to Performance gains on sample dapp">​</a></h2><p>Here we take an example dapp using the <code>ic-stable-structures</code> library and show how its performance improves after the Wasm-native stable change. Let’s start with the <a href="https://github.com/dfinity/stable-structures/tree/main/examples/src/basic_example" target="_blank" rel="noopener noreferrer">basic example</a> from <code>ic-stable-structures</code> repo which implements a key-value store. The dapp starts by setting up a <code>StableBTreeMap</code> to store data:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">type</span><span class="token plain"> </span><span class="token type-definition class-name">Memory</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">VirtualMemory</span><span class="token operator">&lt;</span><span class="token class-name">DefaultMemoryImpl</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property">thread_local!</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// The memory manager is used for simulating multiple memories. Given a `MemoryId` it can</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// return a memory that can be used by stable structures.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">static</span><span class="token plain"> </span><span class="token constant" style="color:#29ABE2">MEMORY_MANAGER</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">RefCell</span><span class="token operator">&lt;</span><span class="token class-name">MemoryManager</span><span class="token operator">&lt;</span><span class="token class-name">DefaultMemoryImpl</span><span class="token operator">&gt;&gt;</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token class-name">RefCell</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">new</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">MemoryManager</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">init</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">DefaultMemoryImpl</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">default</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:#707070">// Initialize a `StableBTreeMap` with `MemoryId(0)`.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">static</span><span class="token plain"> </span><span class="token constant" style="color:#29ABE2">MAP</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">RefCell</span><span class="token operator">&lt;</span><span class="token class-name">StableBTreeMap</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token class-name">Memory</span><span class="token operator">&gt;&gt;</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">RefCell</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">new</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token class-name">StableBTreeMap</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">init</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token constant" style="color:#29ABE2">MEMORY_MANAGER</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token closure-params">m</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token plain"> m</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">borrow</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">get</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">MemoryId</span><span class="token punctuation" style="color:#F1EEF5">::</span><span class="token function" style="color:#26D76D">new</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token number">0</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>We then enhance the basic example by adding an API to bulk insert many key-value pairs:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token attribute attr-name" style="color:#F8F8F2">#[ic_cdk_macros::update]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">insert_many</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">entries</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator">&lt;</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token constant" style="color:#29ABE2">MAP</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token closure-params">p</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">mut</span><span class="token plain"> map </span><span class="token operator">=</span><span class="token plain"> p</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">borrow_mut</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:#EB318A">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">k</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> v</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">in</span><span class="token plain"> entries</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">into_iter</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            map</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">insert</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">k</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> v</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>After deploying this dapp to ICP, we then execute multiple messages that bulk insert many key-value pairs (close to maxing out the ingress message size limit). The following graphs show the execution time for each of these messages.</p><p>First, without Wasm-native stable memory:</p><p><img loading="lazy" alt="Metrics without Wasm-native stable memory" src="/assets/images/wasm-native-stable-memory-execution-metrics-no-wnsm-c2dbb42625265d151c76a17e8e04f600.png" width="1000" height="500" class="img_ev3q"></p><p>Then, with Wasm-native stable memory:</p><p><img loading="lazy" alt="Metrics with Wasm-native stable memory" src="/assets/images/wasm-native-stable-memory-execution-metrics-wnsm-012257c5fb073b92590ef051c3834871.png" width="1000" height="500" class="img_ev3q"></p><p>We can see that this dapp gets a 1.5x speedup from the Wasm-native stable memory change.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="production-examples">Production examples<a href="#production-examples" class="hash-link" aria-label="Direct link to Production examples" title="Direct link to Production examples">​</a></h2><p>If you’re interested in seeing some architecture of more complicated dapps that are using stable memory, the <a href="https://github.com/dfinity/bitcoin-canister" target="_blank" rel="noopener noreferrer">Bitcoin canister</a> and the <a href="https://github.com/dfinity/internet-identity/tree/main/src/internet_identity" target="_blank" rel="noopener noreferrer">Internet Identity canister</a> are good examples.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2><p>Dapps which use stable memory should see 1.5-2x performance improvements for stable memory reads and writes without developers needing to make any changes. So you should consider using stable memory today!</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update August 9, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/08/09/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/08/09/news-and-updates/update"/>
        <updated>2023-08-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we have a wide variety of updates, including details on a new NNS proposal, updates regarding v2 response verification for asset canisters, and dive a bit into a newly publish paper on threshold Schnorr signature protocol.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 9 2023" src="/assets/images/dev-update-blog-aug-9-d4ec797f7dfabde4f05304907bf782e4.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hey developers! Welcome to this week's developer weekly update. This week, we have a wide variety of updates, including details on a new NNS proposal, updates regarding v2 response verification for asset canisters, and diving a bit into a newly published paper on threshold Schnorr signature protocols. </p><p>Let's get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-nns-proposal---voting-begins-august-10-2023">New NNS proposal - voting begins August 10 2023<a href="#new-nns-proposal---voting-begins-august-10-2023" class="hash-link" aria-label="Direct link to New NNS proposal - voting begins August 10 2023" title="Direct link to New NNS proposal - voting begins August 10 2023">​</a></h2><p>A new NNS proposal has been submitted, and voting will begin on August 10, 2023. This proposal disables OpenSnsTokenSwap proposals within the NNS governance as a temporary measure to prevent multiple proposals of this type from being simultaneously opened in an SNS. The OpenSnsTokenSwap proposal feature will be re-enabled in the future via a separate proposal once a fix has been introduced.</p><p>This proposal is important for developers to be aware of, especially developers that interact with and contribute to an SNS, as the approval of this proposal may interfere with an SNS's road map or development plans if they currently include an SNS decentralization swap. </p><p>You can read the full release notes of this proposal on the <a href="https://forum.dfinity.org/t/nns-update-august-7-2023/21992" target="_blank" rel="noopener noreferrer">DFINITY forum</a>, and you can view the proposal on the NNS dapp <a href="https://dashboard.internetcomputer.org/proposal/123943" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-update-on-v2-response-verification"><code>dfx</code> update on v2 response verification<a href="#dfx-update-on-v2-response-verification" class="hash-link" aria-label="Direct link to dfx-update-on-v2-response-verification" title="Direct link to dfx-update-on-v2-response-verification">​</a></h2><p>The release of dfx <code>0.15.0-beta.1</code> re-enables response verification v2 for asset canisters. Response verification v2 was originally introduced in dfx <code>0.14.0</code> and <code>0.14.1</code>, but this implementation should not be used in production due to some implementation errors. </p><p>To temporarily resolve this, dfx versions <code>0.14.2</code> and <code>0.14.3</code> use response verification v1, which is safe for production use. </p><p>However, the latest beta version of dfx, <code>0.15.0-beta.1</code> includes a service working that re-introduces response verification v2 for asset canisters, and will be compatible with the v1 response verification service worker that is included in versions <code>0.14.2</code> and <code>0.14.3</code>. </p><p>We encourage developers to upgrade any canisters currently running <code>0.14.0</code> or <code>0.14.1</code> to <code>0.14.3</code> to benefit from the currently working implementation of response verification. We also recommend that developers test their canisters with <code>0.15.0-beta.1</code> to assure that they continue to work properly. </p><p>You can read the full forum post on this update <a href="https://forum.dfinity.org/t/upcoming-service-worker-rollout-with-v2-response-verification-upgrade-asset-canisters-with-dfx-0-14-3/21738" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-crypto-eprint-paper-publication">New Crypto ePrint paper publication<a href="#new-crypto-eprint-paper-publication" class="hash-link" aria-label="Direct link to New Crypto ePrint paper publication" title="Direct link to New Crypto ePrint paper publication">​</a></h2><p>DFINITY team members Jens Groth and Victor Shoup recently published a paper that presents new protocols for threshold Schnorr signatures. In this paper, the authors describe how these new protocols communicate in an asynchronous manner, providing optimal resilience and robust performance. The paper discusses two parts; a secret sharing protocol used to securely distribute shares of a large batch of secret keys, and a new algorithm used to efficiently combine ephemeral public keys that have been contributed by different parties into a smaller number of secure public keys. </p><p>These new protocols will play a major role in threshold cryptography and multi-party computation, allowing for new, innovative developer applications. </p><p>You can read the full paper <a href="https://eprint.iacr.org/2023/1175?mc_cid=1462bb863c&amp;mc_eid=a324a031ab" target="_blank" rel="noopener noreferrer">here</a>.</p><p>That'll wrap this up for this week, be sure to check in next week for the next round of developer updates!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Internet Identity]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-ii</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-ii"/>
        <updated>2023-08-03T19:42:56.000Z</updated>
        <summary type="html"><![CDATA[Welcome to this installment of team spotlight. This week, the have a very exciting team to dive into - the Internet Identity team!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Internet Identity Team spotlight" src="/assets/images/dev-update-blog-internet-id-ff9b121b2c518a4d1ce6b9b5520d7a0b.jpg" width="1400" height="675" class="img_ev3q"></p><p>Greetings developers! Welcome to this installment of team spotlight. This week, we have a very exciting team to dive into: the Internet Identity team! As the team behind developing one of the most cutting-edge tools for digital identities, their mission and focus is a personal favorite. Without further ado, let's get started!</p><p><strong>To get started, what is the mission of the Internet Identity team?</strong></p><p><em>The II team is responsible for the implementation, refinement and maintenance of the II protocol and UI. Additionally, we are also tasked with the continuous evolution of II and we work with all of the internal and external stakeholders in order to promote the use of II in the ICP ecosystem and beyond. As part of our mission, we constantly improve the core user experience by taking a standards-based approach to engage with the broader community and conduct outreach by talking to dapp teams that are heavy users of II, giving presentations, and organizing workshops.</em></p><p><strong>What is the composition of the Internet Identity team?</strong></p><p><em>The team consists of 4 engineers, Nicolas, Frederik and Bartosz and David, our product manager, Mary and our UI designer Artem.</em></p><p><strong>Other than Internet Identity, are there any other products or features that the team contributes to?</strong></p><p><em>The Internet Identity team leads the <a href="https://github.com/dfinity/wg-identity-authentication" target="_blank" rel="noopener noreferrer">Identity &amp; Wallet Standards Working Group</a>, which works towards the development and adoption of ICRC standards related to identity and wallets on the Internet Computer. We are currently collaborating with <a href="https://airgap.it/" target="_blank" rel="noopener noreferrer">AirGap</a> on <a href="https://forum.dfinity.org/t/assigned-rfp-7-wallet-standard-reference-implementation/20024" target="_blank" rel="noopener noreferrer">RFP-7</a>, a standardized consent message interface for wallets on ICP.</em></p><p><strong>Those collaborations sound very exciting, I'm eager to see the result of those! How does Internet Identity compare to cryptowallets and other forms of digital identity? What makes it unique?</strong></p><p><em>Internet Identity offers a convenient and secure way to sign into dapps, while being fully onchain. It is not a classical crypto wallet, as it does not offer a transaction signing flow (yet). It is more comparable to a classical Web 2.0 login, such as sing-in with Google, Facebook, etc. The main strengths of II are its ease of use and high security, while not burdening the user with key management and other Web 3.0 complexities.</em></p><p><strong>I think that is a great way to describe the difference between II and other forms of digital identities. What’s the biggest challenge the team has faced with developing Internet Identity?</strong></p><p><em>We are a small team, which enables us to release changes and respond to feedback frequently, but <!-- -->[that]<!-- --> also comes with limitations. It’s been really rewarding to be able to deliver so much with such a small team.</em></p><p><strong>How has the team handled or responded to developer onboarding friction or difficulties using Internet Identity?</strong></p><p><em>We have created a <a href="https://github.com/dfinity/internet-identity#flavors" target="_blank" rel="noopener noreferrer">special dev build</a> of Internet Identity that makes working with II in a local dev environment very easy. In addition, we have created a <a href="https://github.com/dfinity/examples/tree/master/motoko/internet_identity_integration" target="_blank" rel="noopener noreferrer">step-by-step example</a> showcasing how to use the dev build. In the future we also plan to support the <code>dfx deps</code> command.</em></p><p><strong>It's great to hear that improvements have been made to assist with onboarding friction. Are there any improvements have been made as a direct result of developer feedback?</strong></p><ul><li><p><em>Improved Developer Experience: After the Motoko bootcamps last year, Nicolas and Frederick gathered feedback from Seb Thuillier about the experience of setting up II locally. Using the feedback, Frederick and Nicolas updated the II developer docs so that developers could avoid rebuilding II from scratch.</em></p></li><li><p><em>Connecting users to dapps that integrate with Internet Identity via the dapps explorer: When you connect to Internet Identity, you’ll see a list of integrated dapps, which provides valuable exposure to ecosystem projects and meaningful CTAs for users. If a project wants to see its dapp on the dapp explorer, it can submit a <a href="https://github.com/dfinity/portal#showcase-submission-guidelines" target="_blank" rel="noopener noreferrer">PR here.</a></em></p></li><li><p><em>Onboarding to Internet Identity in three simple steps (was previously 10): dapps that rely on Internet Identity to onboard and authenticate new users requested that we simplify the process of creating an Internet Identity. We reduced the number of steps necessary to create an Internet Identity to three instead of 10, which should make onboarding users to dapps easier.</em></p></li></ul><p><strong>Those are some incredible improvements, and I'm sure our dev community has benefited greatly from them! What is the primary project that the Internet Identity team is working on or focused on currently?</strong></p><p><em>Right now we are focused on the following projects:</em></p><ul><li><p><em>Verifiable Credentials aka Attribute Sharing: this means that through the use of cryptographic protocols, different applications running on ICP will be able to share user attributes between each other in a manner that is both secure and privacy-preserving.</em></p></li><li><p><em>Non-passkey authentication: this means that for users where the use of passkeys is not an option (e.g., iPhone users without an iCloud account), we are offering an alternative authentication mechanism.</em></p></li><li><p><em>Generative-based II logos for each Principal: we have redesigned the II logo and each Internet Identity Principal will now have its own individualized and generative-based logo!</em></p></li></ul><p><strong>I personally love the idea of generative-based II logos, I think that'll be a great UI update! Where should developers look for the latest Internet Identity updates?</strong></p><p><em>Developers can look to the forum for the latest Internet Identity updates.</em></p><p><strong>What are some of the major roadmap items planned for the future of the Internet Identity?</strong></p><ul><li><em>Supporting the ICRC-21 standard: <a href="https://forum.dfinity.org/t/assigned-rfp-7-wallet-standard-reference-implementation/20024" target="_blank" rel="noopener noreferrer">forum post</a>.</em></li><li><em>Integrating WalletConnect v2 standard.</em></li></ul><p><strong>What is one feature or aspect of Internet Identity that the team is the most proud of?</strong></p><p><em>One of the coolest features of II is the fact that it is fully onchain while still offering secure and privacy preserving authentication that is actually easy and convenient to use. Having all these benefits combined in one single product is something we’re really proud of and that is unique to the Web 3.0 ecosystem.</em></p><p><strong>This has been incredibly educational and insightful into the II team! To wrap this up, what makes the Internet Identity team unique compared to some of the other dev teams at DFINITY?</strong></p><p><em>The Internet Identity team is one of the few teams at DFINITY that develops a user-facing product as well as APIs for ecosystem developers to use and build with.</em></p><p>That'll finish off this week's issue of team spotlight! We got some great information about the future of Internet Identity, and I hope everyone is as excited for the roadmap items as I am!</p><p>We'll see everyone next time!</p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update August 2, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/08/02/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/08/02/news-and-updates/update"/>
        <updated>2023-08-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this issue, we're going to talk about some of our upcoming developer events for the month of August. You can participate in these events to ask questions, gain insight into different features, and provide feedback directly to our team on things you'd like to see in the future.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="August 2 2023" src="/assets/images/dev-update-blog-aug-2-86d68ae38bc998d1fabbf417c0022fbb.jpeg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome to this week's issue of developer weekly! In this issue, we're going to talk about some of our upcoming developer events for the month of August. You can participate in these events to ask questions, gain insight into different features, and provide feedback directly to our team on things you'd like to see in the future.</p><p>Let's talk about it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-working-group">Motoko working group<a href="#motoko-working-group" class="hash-link" aria-label="Direct link to Motoko working group" title="Direct link to Motoko working group">​</a></h2><p><strong>Date and time:</strong> August 10, 2023 @ 3PM UTC</p><p><strong>Duration:</strong> 1 hour.</p><p><strong>Frequency:</strong> The second Thursday of every month.</p><p><strong>Description:</strong> The Motoko working group is a way for developers to discuss issues, concerns, or ideas relevant to Motoko with the DFINITY Languages team. Developers can occasionally give demos of their current projects and express any roadblocks or pain points that they're experiencing in their development process.</p><p>Want to learn more? Check out the <a href="https://forum.dfinity.org/t/motoko-developer-working-group/20488" target="_blank" rel="noopener noreferrer">forum post</a> that contains more information.</p><p>Interested in attending? <a href="https://dfinity.zoom.us/j/97118754835?pwd%3DWFZiUVcyQ0tqOHlrajFUa0dpRTc3Zz09" target="_blank" rel="noopener noreferrer">Here is the Zoom link</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="technical-working-group-btc-on-icp">Technical working group: BTC on ICP<a href="#technical-working-group-btc-on-icp" class="hash-link" aria-label="Direct link to Technical working group: BTC on ICP" title="Direct link to Technical working group: BTC on ICP">​</a></h2><p><strong>Date and time:</strong> August 3, 2023 @ 3PM UTC</p><p><strong>Duration:</strong> 1 hour.</p><p><strong>Frequency:</strong> The first Thursday of every month.</p><p><strong>Description:</strong> In the BTC on ICP working group, the goal is to work together as an ecosystem to improve the Bitcoin experience on the Internet Computer. To accomplish this, the group will work closely with the Ordinals and Bitcoin ecosystems, work on building decentralized Bitcoin solutions within the application layer of the ICP, and work with the protocol layer to support different Bitcoin use cases.</p><p>Want to learn more? Check out the <a href="https://forum.dfinity.org/t/technical-working-group-btc-on-icp/21225" target="_blank" rel="noopener noreferrer">forum post</a> that contains more information.</p><p>Interested in attending? <a href="https://dfinity.zoom.us/j/96908162000?pwd=UXc5bFowMXZqTXgwOW9zZFk4TkNNUT09" target="_blank" rel="noopener noreferrer">Here is the Zoom link</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-tooling-working-group">Developer tooling working group<a href="#developer-tooling-working-group" class="hash-link" aria-label="Direct link to Developer tooling working group" title="Direct link to Developer tooling working group">​</a></h2><p><strong>Date and time:</strong> August 3, 2023 @ 5PM UTC</p><p><strong>Duration:</strong> 1 hour.</p><p><strong>Frequency:</strong> The first Thursday of every month.</p><p><strong>Description:</strong> The developer tooling working group is a place for developers to discuss different developer tools on ICP, such as the SDK and pre-installed system canisters. It also provides an opportunity for the community to share demos of their dapps and discuss current bounty projects.</p><p>Want to learn more? Check out the <a href="https://forum.dfinity.org/t/technical-working-group-developer-tooling/11941" target="_blank" rel="noopener noreferrer">forum post</a> and <a href="https://docs.internetcomputer.org/" target="_blank" rel="noopener noreferrer">developer docs</a> that contain more information.</p><p>Interested in attending? <a href="https://dfinity.zoom.us/j/98865672859?pwd=UXorcDNQQzl3Tk5rVTVmRW5lYXdEQT09" target="_blank" rel="noopener noreferrer">Here is the Zoom link</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="identity-and-wallet-standards-working-group">Identity and wallet standards working group<a href="#identity-and-wallet-standards-working-group" class="hash-link" aria-label="Direct link to Identity and wallet standards working group" title="Direct link to Identity and wallet standards working group">​</a></h2><p><strong>Date and time:</strong> August 8, 2023 @ 3PM UTC</p><p><strong>Duration:</strong> 1 hour.</p><p><strong>Frequency:</strong> Bi-weekly on Tuesdays.</p><p><strong>Description:</strong>  The identity and wallet standards working group focuses on discussion pertaining to the adoption and development of the ICRC token standard and how it relates to identity and wallets on the Internet Computer. Some current topics for discussion and development include verifiable credentials, transaction approval with canister calls, and DID registries.</p><p>Want to learn more? Check out the <a href="https://github.com/dfinity/wg-identity-authentication" target="_blank" rel="noopener noreferrer">Github issues and PRs</a> that contain more information.</p><p>Interested in attending? <a href="https://dfinity.zoom.us/j/99119049293?pwd=ZUZ0eGZJN3FHK1RzWkpTZUJoNUd0dz09" target="_blank" rel="noopener noreferrer">Here is the Zoom link</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ledger-and-tokenization-working-group">Ledger and tokenization working group<a href="#ledger-and-tokenization-working-group" class="hash-link" aria-label="Direct link to Ledger and tokenization working group" title="Direct link to Ledger and tokenization working group">​</a></h2><p><strong>Date and time:</strong> August 22, 2023 @ 4PM UTC</p><p><strong>Duration:</strong> 1 hour.</p><p><strong>Frequency:</strong> Bi-weekly on Tuesdays.</p><p><strong>Description:</strong> The focus of the ledger and tokenization working group is to discuss and contribute to the core token standard supported by the Internet Computer, ICRC. This group currently focuses on discussing proposals for new versions of the standard, such as ICRC-3, and future developments or additions to the standard to support new or emerging use cases.</p><p>Want to learn more? Check out the <a href="https://forum.dfinity.org/t/announcing-token-standard-as-topic-of-the-first-meeting-of-the-ledger-tokenization-working-group/11925" target="_blank" rel="noopener noreferrer">forum post</a> that contains more information.</p><p>Interested in attending? <a href="https://dfinity.zoom.us/j/99093158767?pwd=NEhFdk9yemtmT2NoYW1Ta2VWM2VzZz09" target="_blank" rel="noopener noreferrer">Here is the Zoom link</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="weekly-community-call">Weekly community call<a href="#weekly-community-call" class="hash-link" aria-label="Direct link to Weekly community call" title="Direct link to Weekly community call">​</a></h2><p><strong>Date and time:</strong> August 4, 2023 @ 5PM UTC</p><p><strong>Duration:</strong> 1 hour.</p><p><strong>Frequency:</strong> Weekly on Friday.</p><p><strong>Description:</strong> The Discord weekly community call is a general catch-all conversation where members of the community can discuss any topic that they'd like pertaining to the Internet Computer. There is a short weekly update provided by a member of the DFINITY team at the start of the call, but the remainder of the meeting has no set agenda or topic.</p><p>Want to learn more? Check out this event in our <a href="https://discord.gg/9Ptz48GZ?event=1135913036465573908" target="_blank" rel="noopener noreferrer">community Discord server.</a></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="wrapping-up">Wrapping up<a href="#wrapping-up" class="hash-link" aria-label="Direct link to Wrapping up" title="Direct link to Wrapping up">​</a></h2><p>You can find the full Internet Computer community events calendar <a href="https://calendar.google.com/calendar/u/0/embed?src=c_cgoeq917rpeap7vse3is1hl310@group.calendar.google.com&amp;ctz=Europe/Zurich" target="_blank" rel="noopener noreferrer">here</a> for more details and links.</p><p>That's it for this week, be sure to tune in next week for the next issue of developer weekly!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Building a partitioned key-value store with composite queries on the Internet Computer]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/composite-query</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/composite-query"/>
        <updated>2023-07-28T08:08:28.000Z</updated>
        <summary type="html"><![CDATA[Today, we’ll dive into composite queries and walk through the process of building a sample app: a partitioned key-value store. Each partition is represented by a single canister. We'll leverage the power of the Internet Computer’s composite queries to efficiently retrieve data from those partition canisters.]]></summary>
        <content type="html"><![CDATA[<p>Welcome to another developer blog post! Today, we’ll dive into composite queries and walk through the process of building a sample dapp: a partitioned key-value store. Each partition is represented by a single canister. We'll leverage the power of the Internet Computer’s composite queries to efficiently retrieve data from those partition canisters.</p><p>In essence, the partitioned key-value store is structured as a single frontend with multiple backends. Each backend represents one partition of the key-value store.</p><p><img loading="lazy" alt="Partitioned key-value store" src="/assets/images/dev-update-blog-composite-query-fe72c7b2100c4650e0493ee4204e77bb.png" width="1024" height="768" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="frontend-code">Frontend code<a href="#frontend-code" class="hash-link" aria-label="Direct link to Frontend code" title="Direct link to Frontend code">​</a></h2><p>The frontend code does the following for a put and get call:</p><ul><li>Determines the ID of the canister that holds the partition with the given key.</li><li>Makes a call into the <code>get</code> or <code>put</code> function of that canister and parsing of the result.</li></ul><p>The following code shows a simplified version of the frontend code. Note the line <code>#[query(composite = true)]</code> which is used to leverage the new composite query feature:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token attribute attr-name" style="color:#F8F8F2">#[query(composite = true)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">async</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">frontend_get</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u128</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> canister_id </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#26D76D">get_partition_for_key</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">match</span><span class="token plain"> </span><span class="token function" style="color:#26D76D">call</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">canister_id</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"get"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token keyword" style="color:#EB318A">await</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">res</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u128</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            res</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token class-name">Err</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token class-name">None</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>For completeness, the <code>put</code> code cannot benefit from composite query calls, as adding values to the key value store modifies the canister’s state and therefore needs to be implemented as an <code>update</code> call.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token attribute attr-name" style="color:#F8F8F2">#[update]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">async</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">put</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> value</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u128</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> canister_id </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:#26D76D">get_partition_for_key</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:#EB318A">match</span><span class="token plain"> </span><span class="token function" style="color:#26D76D">call</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">canister_id</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"put"</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> value</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token keyword" style="color:#EB318A">await</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">res</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u128</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            res</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token class-name">Err</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">_</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token operator">=&gt;</span><span class="token plain"> </span><span class="token class-name">None</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="backend-code">Backend code<a href="#backend-code" class="hash-link" aria-label="Direct link to Backend code" title="Direct link to Backend code">​</a></h2><p>The backend simply stores the key value pairs in a <code>BTreeMap</code> in stable memory:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token attribute attr-name" style="color:#F8F8F2">#[update]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">put</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> value</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u128</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token constant" style="color:#29ABE2">STORE</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token closure-params">store</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token plain"> store</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">borrow_mut</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">insert</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">,</span><span class="token plain"> value</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token attribute attr-name" style="color:#F8F8F2">#[query]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#26D76D">get</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">:</span><span class="token plain"> </span><span class="token keyword" style="color:#EB318A">u128</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">-&gt;</span><span class="token plain"> </span><span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token keyword" style="color:#EB318A">u128</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token constant" style="color:#29ABE2">STORE</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">with</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token closure-params">store</span><span class="token closure-params closure-punctuation punctuation" style="color:#F1EEF5">|</span><span class="token plain"> store</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">borrow</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token function" style="color:#26D76D">get</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token operator">&amp;</span><span class="token plain">key</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>And that’s it!</p><p>The complete code can be found <a href="https://github.com/dfinity/examples/tree/master/rust/composite_query" target="_blank" rel="noopener noreferrer">here</a>.</p><p>An alternative implementation for Motoko can be found <a href="https://github.com/dfinity/examples/tree/master/motoko/composite_query" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="using-composite-queries">Using composite queries<a href="#using-composite-queries" class="hash-link" aria-label="Direct link to Using composite queries" title="Direct link to Using composite queries">​</a></h2><p>To start, let's set up our development environment. Make sure you have <a href="/building-apps/getting-started/install">dfx</a> installed on your computer. You will need at least version 0.15.0 of dfx for composite query support. Open your terminal and follow these commands:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token assign-left variable" style="color:#EB318A">DFX_VERSION</span><span class="token operator">=</span><span class="token number">0.15</span><span class="token plain">.0-beta.1 </span><span class="token function" style="color:#26D76D">sh</span><span class="token plain"> -ci </span><span class="token string" style="color:#F68E5F">"</span><span class="token string variable" style="color:#EB318A">$(</span><span class="token string variable function" style="color:#26D76D">curl</span><span class="token string variable" style="color:#EB318A"> -fsSL https://internetcomputer.org/install.sh</span><span class="token string variable" style="color:#EB318A">)</span><span class="token string" style="color:#F68E5F">"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Then clone the ICP sample apps as follows:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:#26D76D">git</span><span class="token plain"> clone https://github.com/dfinity/examples.git</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="deploy-the-example-canister">Deploy the example canister<a href="#deploy-the-example-canister" class="hash-link" aria-label="Direct link to Deploy the example canister" title="Direct link to Deploy the example canister">​</a></h2><p>We first need to start a local replica instance via dfx and then create and build our frontend canister:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:#29ABE2">cd</span><span class="token plain"> rust/composite_query/src</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx start</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx canister create kv_frontend</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx build kv_frontend</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>During compilation of the fronted canister, the backend canister's wasm code will be compiled and inlined in the frontend canister's wasm code.
Finally, let’s install the frontend canister:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx canister </span><span class="token function" style="color:#26D76D">install</span><span class="token plain"> kv_frontend</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Excellent! We have our partitioned key-value store set up and ready to go. Now, let's explore its capabilities.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="interacting-with-the-canister">Interacting with the canister<a href="#interacting-with-the-canister" class="hash-link" aria-label="Direct link to Interacting with the canister" title="Direct link to Interacting with the canister">​</a></h2><p>To add a key-value pair via the frontend canister, run the following command in your terminal:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ dfx canister call kv_frontend put </span><span class="token string" style="color:#F68E5F">'(1, 1337)'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">null</span><span class="token punctuation" style="color:#F1EEF5">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Keep in mind that the first call to put might be slow to respond because the data partition canisters have to be created first.
Now, let's retrieve the value associated with a key using the power of composite queries:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ dfx canister call kv_frontend get </span><span class="token string" style="color:#F68E5F">'(1)'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">opt </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token number">42</span><span class="token plain"> </span><span class="token builtin class-name" style="color:#29ABE2">:</span><span class="token plain"> nat</span><span class="token punctuation" style="color:#F1EEF5">))</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>As you can see, we can effortlessly fetch the value using composite queries with very low latency.
Let’s now compare the performance of composite query calls with those of an equivalent implementation that leverages calls from update functions: for that, we use the <code>get_update</code> method, which contains the exact same logic, but is implemented based on update calls:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ dfx canister call kv_frontend get_update </span><span class="token string" style="color:#F68E5F">'(1)'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">opt </span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">1_337 </span><span class="token builtin class-name" style="color:#29ABE2">:</span><span class="token plain"> nat</span><span class="token punctuation" style="color:#F1EEF5">))</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>We can observe that with update calls we receive the very same result, but the call is at least one order of magnitude slower compared to composite query calls.
Furthermore, we can orchestrate two query calls: first into the frontend canister and then into the data partition canister. This has similar latency as the composite query call, but requires extra logic on the client side.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ dfx canister call kv_frontend lookup </span><span class="token string" style="color:#F68E5F">'(1)'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token number">1</span><span class="token plain"> </span><span class="token builtin class-name" style="color:#29ABE2">:</span><span class="token plain"> nat, </span><span class="token string" style="color:#F68E5F">"dmalx-m4aaa-aaaaa-qaanq-cai"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ dfx canister call dmalx-m4aaa-aaaaa-qaanq-cai get </span><span class="token string" style="color:#F68E5F">'(1: nat)'</span><span class="token plain"> --query</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">1_337 </span><span class="token builtin class-name" style="color:#29ABE2">:</span><span class="token plain"> nat</span><span class="token punctuation" style="color:#F1EEF5">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>In summary, by using composite queries, we achieve low latency while keeping the client side simple. This is especially useful for dapps that are scaling vertically by partitioning data across multiple canisters.</p><p>Congratulations! You have successfully built a key-value store using Rust and leveraged the powerful composite query feature of the Internet Computer. This allows for efficient retrieval of data from your canisters.</p><p>We hope you found this blog post helpful. Happy coding with the composite query feature!
Many thanks to the DFINITY for contributing to the composite query feature: Adam Spofford, Claudio Russo, Martin Raszyk, Robin Künzler, Roel Storms, Stefan Kaestle, Ulan Degenbaev, Yan Chen</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update July 26, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/07/26/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/07/26/news-and-updates/update"/>
        <updated>2023-07-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this week's issue, we're going to take a brief look at the new `dfx deps` subcommand, plus explore a new QR code example project that showcases deterministic time slicing.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="July 26 2023" src="/assets/images/dev-update-blog-jul-26-9b90acb3ef8580ae523507aee3c1f81a.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello devs and welcome to this week’s issue of developer weekly! In this issue, we're going to take a brief look at the new <code>dfx deps</code> subcommand, plus explore a new QR code example project that showcases deterministic time slicing.</p><p>Ready to dive in?</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-deps"><code>dfx deps</code><a href="#dfx-deps" class="hash-link" aria-label="Direct link to dfx-deps" title="Direct link to dfx-deps">​</a></h2><p><code>dfx deps</code> is a new subcommand that allows developers to pull third-party canisters from the mainnet, then deploy them on a local replica to test integration functionality without worrying about paying cycles or using production environments.</p><p>To use <code>dfx deps</code>, there are two roles to the workflow. A service provider can configure a canister to be 'pullable', meaning it can be pulled by others using <code>dfx deps</code>, and a service consumer can pull a canister from the mainnet if that canister has been configured to be 'pullable'.</p><p>A separate blog post has been published on this subcommand and workflow that goes into much deeper detail. You can check out that blog post <a href="https://internetcomputer.org/blog/features/dfx-deps" target="_blank" rel="noopener noreferrer">here</a>, and the corresponding developer documentation for it <a href="/building-apps/advanced/using-third-party-canisters">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-sample-code-qr-code-generator">New sample code: QR code generator<a href="#new-sample-code-qr-code-generator" class="hash-link" aria-label="Direct link to New sample code: QR code generator" title="Direct link to New sample code: QR code generator">​</a></h2><p>Thanks to Ulan Degenbaev from the Runtime team, a new Rust example has been added to the <code>DFINITY/examples</code> repository. This example demonstrates how dapps on ICP can perform long-running computation tasks, such as image processing, in a single message execution. This functionality is possible to Deterministic Time Slicing (DTS), which is a unique feature on ICP that divides long computational tasks into smaller slices that are then executed across multiple blocks. Using this new feature, developers can write long-running computational code as they normally would, and don't need to perform any special tasks to take advantage of the DTS benefits.</p><p>This new sample code demonstrates the DTS functionality using a QR code generation application. A live version of this sample can be found <a href="https://khpe2-4qaaa-aaaao-a2fnq-cai.icp0.io/" target="_blank" rel="noopener noreferrer">here</a> for you to try out.</p><p>If you want to play with the sample locally, you can find the code in our examples repo <a href="https://github.com/dfinity/examples/tree/master/rust/qrcode" target="_blank" rel="noopener noreferrer">here</a>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-the-qr-code-generator-works">How the QR code generator works<a href="#how-the-qr-code-generator-works" class="hash-link" aria-label="Direct link to How the QR code generator works" title="Direct link to How the QR code generator works">​</a></h3><p>In this sample, the initial dapp code has been generated by dfx's standard template with the <code>dfx new</code> command.</p><p>The frontend canister contains an HTML webpage that includes a form for users to enter text fields to configure the QR code. Then, a 'Generate!' button uses a JavaScript handler to initiate a call to the backend canister, which automatically generates a JavaScript object from the Candid interface. The JavaScript object uses async functions for each of the backend canister's endpoints. There are two backend endpoints: one for updates and one for queries. This is intentionally done for educational purposes. The JavaScript button uses async functions to make the call from the frontend to the backend.</p><p>This sample is written in Rust and utilizes the <code>image</code> and <code>qrcode-generator</code> crates. There is some minor image processing that happens as well, in order to add the Internet Computer logo and color scheme to the final generated QR code image result.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-deploy---playground"><code>dfx deploy --playground</code><a href="#dfx-deploy---playground" class="hash-link" aria-label="Direct link to dfx-deploy---playground" title="Direct link to dfx-deploy---playground">​</a></h2><p>For our last topic today, we're going to briefly introduce a new upcoming feature: <code>dfx deploy --playground</code>!</p><p><code>dfx deploy --playground</code> is an upcoming feature that will soon be available in dfx. With this new <code>--playground</code> flag, canisters can be immediately deployed to the playground. When this flag is used, the canisters in the dfx project will be deployed to mainnet and a canister URL will be returned to the developer. This deployment method allows devs to quickly deploy canisters to the mainnet without having to first setup a cycles wallet or acquire cycles. This allows for developers to quickly get started using dfx to help aid in the developer onboarding process.</p><p>It is important to note that canisters deployed with the <code>--playground</code> flag will be subject to the same restrictions as other canisters deployed to the playground. These restrictions are:</p><ul><li>Cycle transfer instructions are silently ignored by the playground.</li><li>Canisters can use at most 1GB of stable memory.</li><li>Canisters can call the management canister to manage itself without being the controller.</li><li>Deployed canisters expire after 20 minutes.</li></ul><p>This feature is upcoming and will be elaborated on further in a future blog post with additional documentation. Be sure to stay tuned for that update!</p><p>That's it for this week! Be sure to tune back in next week for our weekly update, plus another installment of our team spotlight series!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing dfx deps!]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/dfx-deps</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/dfx-deps"/>
        <updated>2023-07-24T17:00:12.000Z</updated>
        <summary type="html"><![CDATA[Previously known as the `dfx pull` command, `dfx deps` is a new set of subcommands designed to provide a consistent developer workflow for integrating and testing third-party canisters within local developer environments.]]></summary>
        <content type="html"><![CDATA[<p><a target="_blank" href="/assets/files/infinity-symbol-3318311d2c698c3bbb892dde4d04387a.png">!dfx deps</a></p><p>Today we're excited to announce a new dfx feature: dfx deps!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-is-dfx-deps">What is <code>dfx deps</code>?<a href="#what-is-dfx-deps" class="hash-link" aria-label="Direct link to what-is-dfx-deps" title="Direct link to what-is-dfx-deps">​</a></h2><p><code>dfx deps</code> is a new set of subcommands designed to provide a consistent developer workflow for integrating and testing third-party canisters within local environments. Third-party canisters can be canisters created by DFINITY, such as the Internet Identity or NNS canisters, or they can be canisters created by members of the ICP community that provide a public service at a <em>static canister ID</em>.</p><p>Testing third-party canister integrations locally is important to verify the third-party canister's integration functionality without paying cycles or using production environments.</p><p>The <code>dfx deps</code> command includes the following subcommands:</p><ul><li><code>dfx deps pull</code>: Pulls the dependencies from the mainnet and generates <code>deps/pulled.json</code>. The Candid files of direct dependencies will also be put into <code>deps/candid/</code>.</li><li><code>dfx deps init</code>: Sets the <code>init</code> arguments for the pulled dependencies and saves the data in <code>deps/init.json</code>.</li><li><code>dfx deps deploy</code>: Deploys the pulled dependencies on the local replica with the <code>init</code> arguments recorded in <code>deps/init.json</code>.</li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="workflow-overview">Workflow overview<a href="#workflow-overview" class="hash-link" aria-label="Direct link to Workflow overview" title="Direct link to Workflow overview">​</a></h2><p>Let's take a look at how the <code>dfx deps</code> workflow operates. There are two roles: the <strong>service provider</strong> and the <strong>service consumer</strong>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="service-provider">Service provider<a href="#service-provider" class="hash-link" aria-label="Direct link to Service provider" title="Direct link to Service provider">​</a></h3><p>The <strong>service provider</strong> is responsible for configuring a canister to be <code>pullable</code>.</p><p>For a canister to be <code>pullable</code>, the following should be true:</p><ul><li>The canister provides a public service at a static canister ID.</li><li>The wasm module of a <code>pullable</code> canister must be hosted via a URL so that service consumers can download it when pulling the dependency.</li></ul><p>Canisters that do not use a static canister ID, or do not provide a public service that can be utilized by other developers, should not be configured to be <code>pullable</code>.</p><p>A canister is configured to be <code>pullable</code> by editing the <code>dfx.json</code> file to include the following information:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  "canisters": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    "service": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "type": "motoko",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "main": "src/pullable/main.mo",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "pullable": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        "dependencies": [],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        "wasm_url": "https://github.com/lwshang/pullable/releases/latest/download/service.wasm",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        "init_guide": "A natural number, e.g. 1"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li><code>wasm_url</code>: A URL used to download the canister wasm module which will be deployed locally.</li><li><code>wasm_hash</code>: A SHA256 hash of the wasm module located at <code>wasm_url</code>. This field is optional. In most cases, the wasm module at <code>wasm_url</code> will be the same as the onchain wasm module.</li><li><code>dependencies</code>: An array of Canister IDs (Principal) of direct dependencies.</li><li><code>init_guide</code>: A message to guide consumers how to initialize the canister.</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="service-consumer">Service consumer<a href="#service-consumer" class="hash-link" aria-label="Direct link to Service consumer" title="Direct link to Service consumer">​</a></h3><p>Once a canister is <code>pullable</code>, a <strong>service consumer</strong> can pull the canister as a dependency directly from the mainnet and then deploy the dependency on a local replica.</p><p>To pull the dependencies from the mainnet, the <code>dfx.json</code> file must include the dependencies configuration for the canister.</p><p>For example, the following <code>dfx.json</code> file configures two dependencies for the canister <code>dapp</code>. Both of these dependencies have static canister IDs of:</p><ul><li>"dep_b" has canister ID of yhgn4-myaaa-aaaaa-aabta-cai on the mainnet.</li><li>"dep_c" has canister ID of yahli-baaaa-aaaaa-aabtq-cai on the mainnet.</li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    "canisters": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        "dapp": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            "type": "motoko",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            "main": "src/main.mo",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            "dependencies": [</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                "dep_b", "dep_c"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            ]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        "dep_b": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            "type": "pull",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            "id": "yhgn4-myaaa-aaaaa-aabta-cai"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        "dep_c": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            "type": "pull",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            "id": "yahli-baaaa-aaaaa-aabtq-cai"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Then, these dependencies can be pulled using the <code>dfx deps pull</code> command. By default, the <code>dfx deps pull</code> connects to the mainnet. To deploy locally, the <code>--network local</code> flag can be used.</p><p>When this command is called, several things happen in the background, including:</p><ul><li>The dependency graph is resolved by fetching the dependencies field in the <code>dfx</code> metadata recursively.</li><li>The wasm of all direct and indirect dependencies is downloaded from the <code>wasm_url</code> into the shared cache.</li><li>The hash of the downloaded wasm is verified against <code>wasm_hash</code> metadata or the hash of the canister deployed on the mainnet.</li><li>The <code>candid:args</code>, <code>candid:service</code>, and <code>dfx metadata</code> will be extracted from the downloaded wasm.</li><li>The <code>deps/</code> folder is created in the project root.</li><li>The <code>candid:service</code> of direct dependencies is saved as <code>deps/candid/&lt;CANISTER_ID&gt;.did</code>.</li><li>The <code>deps/pulled.json</code> file is saved, which contains major info of all direct and indirect dependencies.</li></ul><p>Once the <code>dfx deps pull</code> command has been run, the init arguments can be set with the <code>dfx deps init</code> command. This command will iterate over all dependencies in the <code>pulled.json</code> file and set an empty argument for any that do not need an init argument. Then, it will print the list of dependencies that do require an init argument.</p><p>Running the command <code>dfx deps init &lt;CANISTER&gt; --argument &lt;ARGUMENT&gt;</code> will set the init argument for an individual dependency. The init arguments will be recorded in <code>deps/init.json</code>.</p><p>Below are examples of running the <code>dfx deps init</code> command with init arguments:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx deps init yofga-2qaaa-aaaaa-aabsq-cai --argument 10</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx deps init deps_c --argument 20</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>After this step, the pulled dependencies can be deployed on a local replica using the <code>dfx deps deploy</code> command. This command will create the dependencies on the local replica with the same mainnet canister ID. Then, it will install the downloaded wasm with the init arguments in the <code>init.json</code> file.</p><p><code>dfx deps deploy</code> always creates the canister with the anonymous identity so that dependencies and application canisters will have different controllers. It also will always install the canister in "reinstall" mode so that the canister status will be discarded.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2><p>The <code>dfx deps</code> feature is available in dfx versions <code>0.14.1</code> and newer. You can learn more from our <a href="/building-apps/advanced/using-third-party-canisters">developer documentation</a>, which includes an interactive example you can use to test the feature for yourself.</p><p>As always, please let us know if you have any feedback either through our <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">forum</a> or <a href="https://discord.com/invite/5PJMmmETQB" target="_blank" rel="noopener noreferrer">Discord server</a>.</p><p>-DFINITY</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update July 20, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/07/20/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/07/20/news-and-updates/update"/>
        <updated>2023-07-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we're going to take a look at some new Rust documentation that was published this week, plus we'll dive into the details of dfx 0.15.0 which is now out for beta testing!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="July 20 2023" src="/assets/images/dev-update-blog-jul-20-030c2a3bf3fe6bb8e44bf2acdb90ddfd.jpeg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome to this week's issue of developer weekly! This week, we're going to take a look at some new Rust documentation that was published this week, plus we'll dive into the details of dfx 0.15.0 which is now out for beta testing!</p><p>Let's get into it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-documentation-for-building-canisters-with-rust">New documentation for building canisters with Rust<a href="#new-documentation-for-building-canisters-with-rust" class="hash-link" aria-label="Direct link to New documentation for building canisters with Rust" title="Direct link to New documentation for building canisters with Rust">​</a></h2><p>This week, ICP developer documentation got a major update for Rust developers: a new and improved section on building backend canisters with Rust!</p><p>Previously, this section contained seven pages of documentation that were rather limited in the information and concepts that they contained. We received several bits of feedback from Rust developers that these pages simply weren't providing enough resources for them. As a result of this feedback, along with some internal insight, we've published an improved section of documentation that now contains fifteen pages of content, including concepts such as upgrading canisters, stable structures, and inter-canister calls.</p><p>To summarize, the new Rust documentation covers the following topics:</p><ul><li>Rust backend canister infrastructure.</li><li>Project organization.</li><li>Developer environment.</li><li>Rust quick start.</li><li>Writing and deploying canisters.</li><li>Inter-canister calls.</li><li>Upgrading a canister.</li><li>Optimizing rust canisters.</li><li>Incrementing a counter.</li><li>Using periodic timers.</li><li>Stable structures.</li><li>Adding and searching simple records.</li><li>Access control.</li><li>Using the Candid UI with a Rust canister.</li><li>Rust sample code and applications.</li></ul><p>You can check out the new documentation <a href="/building-apps/developer-tools/cdks/rust/intro-to-rust">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-0150-beta-release">dfx 0.15.0 beta release<a href="#dfx-0150-beta-release" class="hash-link" aria-label="Direct link to dfx 0.15.0 beta release" title="Direct link to dfx 0.15.0 beta release">​</a></h2><p>dfx 0.15.0 is now available for beta testing. This new release introduces several new features and workflows, such as:</p><ul><li><p>The <code>dfx nns</code> and <code>dfx sns</code> commands have been removed. Both commands have been reworked to be <strong>dfx extensions</strong>, and can be used with the commands <code>dfx extension install nns</code> and <code>dfx extension install sns</code> respectively. dfx extensions are still under development and will be elaborated on fully in a future blog post upon their official release.</p></li><li><p>The <code>dfx replica</code> and <code>dfx bootstrap</code> commands have been removed. The <code>dfx start</code> command should now be used instead.</p></li><li><p>Warnings regarding using an unencrypted identity on the mainnet can now be suppressed:</p></li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">WARN: The &lt;identity&gt; identity is not stored securely. Do not use it to control a lot of cycles/ICP. Create a new identity with `dfx identity new` and use it in mainnet-facing commands with the `--identity` flag</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">To do so, export the environment variable DFX_WARNING with the value -mainnet_plaintext_identity.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">export DFX_WARNING="-mainnet_plaintext_identity"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Note that this can be combined to also disable the dfx version check warning:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">export DFX_WARNING="-version_check,-mainnet_plaintext_identity"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><ul><li>New identities are now restricted to using 'safe characters', meaning characters such as <code>/</code> or whitespace are no longer supported. The supported characters are now:</li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-_@0123456789.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Existing identities are not affected by this change.</p><p>For the full release notes on dfx 0.15.0, please see the <a href="https://github.com/dfinity/sdk/releases/tag/0.15.0-beta.0" target="_blank" rel="noopener noreferrer">changelog here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="integration-of-rust-candid-with-dfx">Integration of Rust Candid with dfx<a href="#integration-of-rust-candid-with-dfx" class="hash-link" aria-label="Direct link to Integration of Rust Candid with dfx" title="Direct link to Integration of Rust Candid with dfx">​</a></h2><p>To further improve the experience for Rust developers, the Rust Candid library has been integrated with dfx. Through this integration, Rust code and interfaces can be generated from a Candid interface.</p><p>In the future, the Rust Candid library will also be integrated with the CDK to achieve similar functionality.</p><p>That'll wrap things up for this week's developer update. Be sure to tune in later this week for our next installment of our team spotlight blog series; this week's focus is on the runtime team!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Runtime]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-runtime</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-runtime"/>
        <updated>2023-07-14T16:58:12.000Z</updated>
        <summary type="html"><![CDATA[This week, we sat down with the Runtime team to dig deeper into the team's role on ICP, their current roadmap, plus some of the features and improvements they've developed in response of direct developer feedback.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Runtime Team spotlight" src="/assets/images/dev-update-blog-runtime-1-44a5b806d895c9b08cd9cb4fae93b723.jpg" width="1400" height="675" class="img_ev3q"></p><p>Hello developers and welcome to the second installment of the dev blog's new series team spotlight! This week, we sat down with the Runtime team to dig deeper into the team's role on ICP, their current roadmap, plus some of the features and improvements they've developed in response of direct developer feedback. </p><p><strong>Let's get started. To kick things off, could you describe the mission of the Runtime team?</strong></p><p><em>Our mission is “secure and efficient runtime for smart contracts”. In computer science, the word “runtime” refers to an environment in which programs run. The Internet Computer runs smart contracts using WebAssembly, which is one of the strengths of ICP as a blockchain because WebAssembly is an open standard that supports a wide range of programming languages. Our team strives to enhance the security and performance of WebAssembly execution and everything related to it.</em></p><p><strong>I think that's a great way to describe the team's mission! What an insightful explanation. What is the composition of the Runtime team?</strong></p><p><em>The team consists of four software engineers: Adam, Andriy, Maciej, Ulan and two researchers: Alex and Stefan.</em></p><p><strong>What product or feature on ICP is the primary focus of the Runtime team?</strong></p><p><em>The main focus is WebAssembly execution and everything around it. Most of our projects are about optimizing performance, memory usage and improving security. We also work on more developer-facing features like timers, performance counter, and composite queries.</em></p><p><strong>Could you give a brief overview of how the ICP runtime environment is structured and how it operates?</strong></p><p><em>The runtime environment is part of the more general execution environment of ICP. The execution environment receives messages from the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34208241927316-Message-Routing" target="_blank" rel="noopener noreferrer">message routing</a> layer of ICP. The scheduler in the execution environment decides which messages to run. Each message specifies the target WebAssembly method of the target canister that needs to be invoked in order to process the message. That information is passed to the runtime environment, whose job is to execute the requested WebAssembly method and return the result along with the state changes of the canister.</em></p><p><em>WebAssembly execution happens inside a canister sandbox process. This is an example of improving security, because it protects the system and other canisters against bugs in the WebAssembly runtime that may be exploited by a malicious canister.</em></p><p><em>There are a few interesting problems related to WebAssembly execution that the runtime environment solves:</em></p><p><em>- How to ensure that execution terminates?</em></p><p><em>- How much to charge for execution?</em></p><p><em>- How to keep track of changes in the canister state and memory?</em></p><p><strong>Thank you for such a detailed summary, and I really appreciate the inclusion of some of the problems regarding WebAssembly that the runtime environment solves. I think this insight into these specific problems is very educational and beneficial to be aware of!</strong></p><p><strong>What’s the biggest challenge the team has faced with developing the ICP runtime environment?</strong></p><p><em>One of the largest projects so far was deterministic time slicing. The idea is to suspend and resume WebAssembly execution such that canisters can do long-running computations without reducing the block rate of the blockchain.</em></p><p><strong>Switching focus a bit, let's talk about developers and their experience with the runtime environment. Have any improvements or features been made as a direct result of developer feedback?</strong></p><p><em>Yes, there are many such features:</em></p><p><em>- Canister timers allow canisters to schedule jobs.</em></p><p><em>- Composite queries allow canisters to call other queries while handling a query.</em></p><p><em>- Deterministic time slicing allows longer and more complex computations.</em></p><p><em>- Performance counter allows the developer to profile canister code.</em></p><p><em>- Wasm-native stable memory improves performance of the stable memory.</em></p><p><em>- Wasm compilation cache speeds up canister upgrades in dapps that have thousands of canisters such as Open Chat and Hot-or-Not.</em></p><p><strong>What is the primary project that the Runtime team is working on or focused on currently?</strong></p><p><em>Right now we are finishing three large projects:</em></p><p><em>- File-based page allocator enables doubling the number of query threads. This means that ICP canisters can handle more queries concurrently at peak loads.</em></p><p><em>- Wasm-native stable memory improves performance of the stable memory. This means that developers can move the data from small Wasm memory to a much larger and safer stable memory.</em></p><p><em>- Composite queries allow canisters to call other queries while handling a query. This simplifies development of multi-canister dapps.</em></p><p><strong>Those sound like some incredible projects that I'm sure developers are quite excited for the release of! Where should developers look for the latest updates on these Runtime projects?</strong></p><p><em>We announce new projects in the forum and also present at the Public Global R&amp;D events.</em></p><p><strong>In addition to these projects, are there any other major roadmap items planned?</strong></p><p><em>We have the following items in our roadmap:</em></p><p><em>- New WebAssembly instrumentation. We expect huge performance improvements from this project in some compute heavy workloads such as interpreters and databases. Stay tuned for the forum post.</em></p><p><em>- Supporting large WebAssembly binaries. This feature will allow users to install larger WebAssembly binaries. Stay tuned for the forum post.</em></p><p><em>- Query statistics aggregation: <a href="https://forum.dfinity.org/t/community-consideration-explore-query-charging/19247/24?u=ulan" target="_blank" rel="noopener noreferrer">forum post.</a></em></p><p><em>- Configurable WebAssembly heap limit: <a href="https://forum.dfinity.org/t/proposal-configurable-wasm-heap-limit/17794" target="_blank" rel="noopener noreferrer">forum post.</a></em></p><p><em>- Canister Lifecycle hooks: <a href="https://forum.dfinity.org/t/canister-lifecycle-hooks/17089" target="_blank" rel="noopener noreferrer">forum post.</a></em></p><p><strong>What is one feature or aspect of the runtime that the team is the most proud of?</strong></p><p><em>If we have to choose one, then it is probably WebAssembly itself. It is an amazing technology that’s gaining wide adoption. WebAssembly is an open standard that was designed to be secure, safe, and fast. Right now ICP supports only two programming languages at the production level: Motoko and Rust. Folks from Demergent Labs are working on bringing TypeScript and Python to ICP. There are many more languages that compile to WebAssembly. If the community or DFINITY would provide high-quality CDKs for the most popular languages, then we would reach the full potential of WebAssembly.</em></p><p><strong>This has been incredibly informative on the Runtime team and their developments on the runtime environment, thank you for such educational answers! To wrap things up, what would you say makes the Runtime team unique compared to some of the other dev teams at DFINITY?</strong></p><p><em>Compared to other teams we probably work closer to the hardware. Sometimes we read and debug WebAssembly and x64 assembly code.</em></p><p>Thank you to the Runtime team for sitting down with us and giving some great insight into the team! That'll wrap up this issue of team spotlight, be sure to check in again in two weeks for the next installment that'll dive into Internet Identity! </p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update July 12, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/07/12/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/07/12/news-and-updates/update"/>
        <updated>2023-07-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we’re going to talk about the new vetKeys feature that was showcased in a community conversation this week, plus a new dfx release and a new optimization feature packaged with dfx.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="July 12 2023" src="/assets/images/dev-update-blog-jul-12-2de2b204960cadc69397b0e1534551a6.jpeg" width="720" height="347" class="img_ev3q"></p><p>Hello devs and welcome to this week’s issue of developer weekly! This week, we’re going to talk about the new vetKeys feature that was showcased in a community conversation this week, plus a new dfx release and a new feature packaged with dfx: canister optimization!</p><p>Let’s dive in!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="vetkeys">vetKeys<a href="#vetkeys" class="hash-link" aria-label="Direct link to vetKeys" title="Direct link to vetKeys">​</a></h2><p>This week, a new feature was presented to our community via a community conversation: vetKeys!</p><p>Verifiable Encrypted Threshold Keys (shortened to vetKeys) are a new feature that enables a number of cryptographic functions and use cases on the Internet Computer. The purpose of vetKeys is to help mitigate some of the challenges that developers face when using security and privacy tools on ICP. Encrypting information locally on a device and storing it on a blockchain is easy, as long as the encryption’s secret key value is not exposed and remains on the local device. If a user wants to retrieve the encrypted information from another device or share it with another user, there isn’t a straightforward way that is secure.</p><p>vetKeys strives to resolve this challenge, as it leverages the <a href="https://learn.internetcomputer.org/hc/en-us/articles/34209540682644-Subnet-Keys-and-Subnet-Signatures" target="_blank" rel="noopener noreferrer">BLS signatures</a>, which are the native signature scheme on ICP and can be used as cryptographic decryption keys. Since BLS signatures are computed in a distributed manner on ICP, there is no central authority that is assigning or managing keys on the behalf of users.</p><p>For a more in-depth look at the technology behind vetKeys, check out the <a href="https://internetcomputer.org/blog/features/vetkey-primer" target="_blank" rel="noopener noreferrer">vetKeys primer</a>.</p><p>use cases for vetKeys include, but are not limited to:</p><ul><li>End-to-end encryption.</li><li>Sophisticated access policies.</li><li>Blockchain-issues signatures and cross-chain bridges.</li><li>Verifiable randomness.</li><li>“Dead man’s switch”.</li><li>Secret-bid auctions and MEV protection.</li><li>Time-lock encryption.</li><li>Witness encryption.</li><li>One-time programs.</li></ul><p>Since this is a new feature still in production, there are a number of bounties available for developers to participate in to help enhance the feature and explore different use cases. For more information on the bounties and a link to the community conversation, check out <a href="https://forum.dfinity.org/t/open-bnt-8-vetkeys-enabling-privacy-preserving-applications-on-the-ic/21294" target="_blank" rel="noopener noreferrer">this forum post</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-0142">dfx 0.14.2<a href="#dfx-0142" class="hash-link" aria-label="Direct link to dfx 0.14.2" title="Direct link to dfx 0.14.2">​</a></h2><p>The newest release of dfx 0.14.2 primarily provided fixes and enhancements for existing workflows, such as:</p><ul><li>Diagnose duplicate assets and display upgrade steps: if <code>dfx deploy</code> detects duplicate assets in the <code>dist/</code> and frontend <code>assets/</code> directories, it will now suggest upgrade steps.</li><li>Motoko canisters can import other canisters with service constructor: after a specific canister builder outputs the Wasm and Candid files, dfx will do some post processing on the Candid file.</li><li><code>dfx star</code>t now respects the network replica port configuration in <code>dfx.json</code> or <code>networks.json</code></li><li>The redirect from <code>.raw.ic0.app</code> now redirects to <code>.ic0.app</code> instead of <code>.icp0.io</code>.</li><li>The <code>validate_commit_proposed_batch()</code> method no longer requires any permission to call.</li><li>The asset canister now enforces limits during upload. These limits do not apply to assets already uploaded.</li><li>A fix to the return of the correct expr_path for index.html fallback routes: previously, the requested path was used to construct the <code>expr_path</code> for the <code>index.html</code> fallback route. This was incorrect, as the <code>expr_path</code> should be the path of the <code>index.html</code> file itself in this case.</li></ul><p>Additionally, new features included in this release include:</p><ul><li>The deprecation of the <code>dfx bootstrap</code> and <code>dfx replica</code> commands: please use <code>dfx start</code> instead, which is a combination of the two commands.</li><li>An addition of optional custom build command for asset canisters: the custom build command can be set in <code>dfx.json</code> the same way it is set for custom type canisters. If the command is not provided, dfx will fallback to the default <code>npm run build</code> command.</li></ul><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  "canisters": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    "ui": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "type": "assets",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "build": ["&lt;custom build command&gt;"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The full release notes for dfx 0.14.2 can be found <a href="https://github.com/dfinity/sdk/releases/tag/0.14.2" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="canister-optimization-available-in-dfx-0140-and-newer">Canister optimization available in dfx 0.14.0 and newer<a href="#canister-optimization-available-in-dfx-0140-and-newer" class="hash-link" aria-label="Direct link to Canister optimization available in dfx 0.14.0 and newer" title="Direct link to Canister optimization available in dfx 0.14.0 and newer">​</a></h2><p>A new feature now packaged in versions of dfx 0.14.0 and newer includes <code>wasm-opt</code>, a general purpose Wasm optimizer. With <code>wasm-opt</code>, you can now configure canister optimization options straight from the dfx.json file. For example, to optimize a canister’s cycles consumption, you can use the configuration:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  "canisters": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    "my_canister": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "optimize": "cycles"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Or, you can reduce binary size with the configuration:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  "canisters": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    "my_canister": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "optimize": "size"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>After some benchmark testing, our team estimates that you can expect to see cycle consumptions reduced by around 10% for Motoko canisters and 7% for Rust canisters, and binary size reduction by around 16%.</p><p>For more details, check out the full <a href="https://forum.dfinity.org/t/canister-optimizer-available-in-dfx-0-14-0/21157" target="_blank" rel="noopener noreferrer">forum post announcement here</a>.</p><p>That’s it for this week! If you missed last week’s <a href="https://internetcomputer.org/blog/news-and-updates/team-spotlight-nns" target="_blank" rel="noopener noreferrer">team spotlight blog post</a> that featured the NNS team, be sure to check it out. For the next installment of the team spotlight series, we’ll dive into the Runtime team; be sure to check in next week for that!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[A step towards WebSockets on the Internet Computer]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/websockets-poc</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/websockets-poc"/>
        <updated>2023-07-11T12:26:20.000Z</updated>
        <summary type="html"><![CDATA[Introducing a WebSocket proof-of-concept for the dev community to build on.]]></summary>
        <content type="html"><![CDATA[<p>Today, users expect web applications to be fast and snappy: an exchange should update
the prices in real-time, edits of colleagues should appear immediately when collaborating
on a document, and comments on social media platforms should update continuously.</p><p>To provide such a user-experience, modern web2 applications usually rely on WebSockets,
which allow establishing a long-lived, full-duplex connection between the frontend
and backend of an application. This allows for both sides to send data, for example,
the latest exchange rates, in real-time.</p><p>WebSockets can be seen as the next step after <a href="https://internetcomputer.org/https-outcalls" target="_blank" rel="noopener noreferrer">HTTPS outcalls</a>.
While HTTPS outcalls enable canisters to access publicly-available, off-chain data,
WebSockets provide long-lived, bi-directional connections with any client.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="challenges">Challenges<a href="#challenges" class="hash-link" aria-label="Direct link to Challenges" title="Direct link to Challenges">​</a></h2><p>While WebSockets are a standard in the web2 world, they have not yet
found their way to web3. We aim to change this for the Internet Computer blockchain.</p><p>Unfortunately, this is not a straightforward undertaking due to the decentralized
nature of the Internet Computer, where the backend does not just run on a single
centralized entity, but on multiple replica nodes in a subnet. To enable WebSockets
on the Internet Computer, we need to address the following two main challenges:</p><p><em>One-to-one connections</em> - WebSockets are one-to-one connections: the frontend establishes
a connection with a single centralized backend. An application on the Internet Computer,
however, is running distributed across multiple replica nodes in a subnet. In order
to enable WebSockets, there needs to be a point of consolidation, which provides a
single contact point for the frontend.</p><p><em>Long-lived connections</em> - WebSockets remain open for long periods of time. The
canisters on the Internet Computer however follow the actor model, which accepts
a message, processes it and replies.</p><p>To get started and gain experience, we decided to take things one step at a time, and first
build a proof-of-concept instead of trying to directly integrate WebSockets fully
into the Internet Computer.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="architecture">Architecture<a href="#architecture" class="hash-link" aria-label="Direct link to Architecture" title="Direct link to Architecture">​</a></h2><p>The centerpiece of our proof-of-concept is the WebSocket gateway. It runs on a
dedicated machine and sits between the frontend, the client’s browser, and the
backend, the canister on the Internet Computer as the following figure shows.</p><p><img loading="lazy" alt="WebSockets architecture" src="/assets/images/websockets-architecture-cf3b3796076521deb4cf0d3985309d9e.webp" width="960" height="384" class="img_ev3q"></p><p>The gateway provides a WebSocket endpoint for the frontend and maintains the connection,
while it interfaces with the backend on the Internet Computer through query and update calls.</p><p>The gateway sends messages coming from the frontend as update calls to the backend
and it continuously polls the backend for new messages for the frontend. Instead of
polling, one could have also used HTTPS outcalls to "push" the messages to the gateway.
However, with an increasing number of messages, polling is more and more efficient.</p><p>Despite being a centralized point of failure, the gateway draws on the Internet Computer
to fulfill its role trustlessly: both the frontend and the backend sign their messages
such that the gateway cannot tamper with them.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="try-it-out">Try it out!<a href="#try-it-out" class="hash-link" aria-label="Direct link to Try it out!" title="Direct link to Try it out!">​</a></h2><p>We have released <a href="https://github.com/dfinity/ic-websocket-poc" target="_blank" rel="noopener noreferrer">the proof-of-concept on Github</a>
and invite you to try it out yourself! Use it as an inspiration for your own projects and
build upon it! Please note that this is a proof-of-concept and requires further
improvements to enhance security and stability for any use in production. We have
started <a href="https://forum.dfinity.org/t/websockets-on-the-ic-a-proof-of-concept/20836" target="_blank" rel="noopener noreferrer">a thread in the developer forum</a>
and are looking forward to seeing all the applications you built and your feedback.</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Announcing the Motoko Dev Server: live-reloading for Web3 dapps]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/motoko-dev-server</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features/motoko-dev-server"/>
        <updated>2023-07-06T17:10:45.000Z</updated>
        <summary type="html"><![CDATA[Introducing mo-dev, a flexible live-reload server for quickly building and testing Motoko services on the Internet Computer.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://github.com/dfinity/motoko-dev-server" target="_blank" rel="noopener noreferrer"><img loading="lazy" alt="Motoko Dev Server" src="/assets/images/motoko-dev-server-4a77f1af60b59e7c3d7e9f7be13729af.jpg" width="1400" height="675" class="img_ev3q"></a></p><ul><li><a href="https://medium.com/dfinity/announcing-the-motoko-dev-server-live-reloading-for-web3-dapps-20363088afb4" target="_blank" rel="noopener noreferrer">Medium post</a></li><li><a href="https://forum.dfinity.org/t/announcing-mo-dev-live-reloading-for-motoko-dapps/21007" target="_blank" rel="noopener noreferrer">Developer forum topic</a></li><li><a href="https://github.com/dfinity/motoko-dev-server" target="_blank" rel="noopener noreferrer">GitHub repository</a></li></ul><p>We are excited to introduce <a href="https://github.com/dfinity/motoko-dev-server" target="_blank" rel="noopener noreferrer">mo-dev</a>, a flexible live-reload server for quickly building and testing Motoko services on the Internet Computer.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="background">Background<a href="#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2><p>Live reloading (or more specifically, <a href="https://webpack.js.org/concepts/hot-module-replacement/" target="_blank" rel="noopener noreferrer">hot module replacement</a>) is a well-established technology known to massively improve the productivity of web developers. I highly recommend checking out <a href="https://blog.logrocket.com/complete-guide-full-stack-live-reload/" target="_blank" rel="noopener noreferrer">this blog post</a> for a great explanation of how it works.</p><p>This is a solved problem in the world of conventional web development. Robust solutions such as the <a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer">Vite</a>, <a href="https://nextjs.org/docs/architecture/fast-refresh" target="_blank" rel="noopener noreferrer">Next.js</a>, and <a href="https://webpack.js.org/configuration/dev-server/" target="_blank" rel="noopener noreferrer">Webpack</a> dev servers make it possible to change a line of frontend code and immediately see the result in your browser, usually without even refreshing the page.</p><p>However, this feature is almost nonexistent when developing a decentralized application (or “dapp”) running on a blockchain. Several options exist — such as <a href="https://blog.openzeppelin.com/solidity-hot-reloading-using-zepkit" target="_blank" rel="noopener noreferrer">ZepKit</a> for Solidity smart contracts — but the current state of Web3 live reloading leaves much to be desired given the sky-high expectations from Web2.</p><hr><p>This is where the <a href="/motoko/home">Motoko programming language</a> comes in. With quick compilation times, module-based imports, and <a href="/building-apps/canister-management/upgrade">stable variable</a> semantics, Motoko is the ideal candidate for a game-changing live reload workflow.</p><p>Over the past six months, DFINITY has adopted full-stack live reloading in our internal Motoko projects, saving a huge amount of development time and allowing us to quickly try lots of different ideas to improve the end-user experience of our Internet Computer dapps.</p><p>This was made possible using the <a href="https://github.com/dfinity/motoko-dev-server" target="_blank" rel="noopener noreferrer">Motoko Dev Server</a> (or <code>mo-dev</code> for short), a command-line tool which facilitates a live-reload workflow for Motoko dapps and smart contracts.</p><p><code>mo-dev</code> is already used in a wide range of projects such as the <a href="https://play.motoko.org/" target="_blank" rel="noopener noreferrer">playground</a>, <a href="https://dx.internetcomputer.org/" target="_blank" rel="noopener noreferrer">Developer Experience Feedback Board</a>, and even the language’s own <a href="https://github.com/dfinity/motoko-base" target="_blank" rel="noopener noreferrer">base library</a>.</p><p>Each use case requires different live-reload capabilities, so we decided to create a Swiss Army knife (<a href="https://dfinity.org/foundation/" target="_blank" rel="noopener noreferrer">if you will</a>) of features which you can select depending on your project:</p><ul><li>Deploy canisters to the local replica</li><li>Generate language bindings</li><li>Run unit tests (files ending with <code>.test.mo</code>)</li><li>Execute commands</li><li>Any combination of the above</li></ul><p>For a complete list of features, check out the project’s GitHub repository at <a href="https://github.com/dfinity/motoko-dev-server" target="_blank" rel="noopener noreferrer">github.com/dfinity/motoko-dev-server</a>.</p><p>Now that you know why you’d want to use <code>mo-dev</code>, here are a few ways to get started:</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="online-demo">Online Demo<a href="#online-demo" class="hash-link" aria-label="Direct link to Online Demo" title="Direct link to Online Demo">​</a></h2><p>If you’re curious to try <code>mo-dev</code> without downloading anything, here’s an online example project which you can <a href="https://gitpod.io/#https://github.com/rvanasa/vite-react-motoko" target="_blank" rel="noopener noreferrer">run entirely in your browser</a> (<a href="https://github.com/rvanasa/vite-react-motoko#readme" target="_blank" rel="noopener noreferrer">source code</a>).</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="installation">Installation<a href="#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h2><p>Run the following command in your terminal (requires Node.js ≥ 16):</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">npm install -g mo-dev</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Alternatively, you can download a standalone binary from the project’s <a href="https://github.com/dfinity/motoko-dev-server/releases" target="_blank" rel="noopener noreferrer">GitHub releases</a>.</p><p>Once you’ve installed the tool, run <code>mo-dev --help</code> to view usage examples and descriptions for each available feature.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="candid-ui">Candid UI<a href="#candid-ui" class="hash-link" aria-label="Direct link to Candid UI" title="Direct link to Candid UI">​</a></h2><p>Let’s say you’re developing a Motoko smart contract using the <a href="/building-apps/interact-with-canisters/candid/candid-concepts">Candid UI</a>. Here’s a command which will redeploy the canister on file change:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">mo-dev --deploy -y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The <code>-y</code> flag automatically responds “yes” to prompts from <a href="/building-apps/developer-tools/dfx/dfx-deploy">dfx</a> about upgrading the canister interface (potentially clearing canister data). Feel free to include or omit this depending on your use case.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="full-stack-dapp">Full-Stack Dapp<a href="#full-stack-dapp" class="hash-link" aria-label="Direct link to Full-Stack Dapp" title="Direct link to Full-Stack Dapp">​</a></h2><p><code>mo-dev</code> is specifically designed to play well with popular frontend build tools such as <a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer">Vite</a> and <a href="https://create-react-app.dev/" target="_blank" rel="noopener noreferrer">Create React App</a>.</p><p>If you want to start a new project, consider using the <a href="https://github.com/rvanasa/vite-react-motoko#readme" target="_blank" rel="noopener noreferrer">Vite + React + Motoko</a> template (or the even simpler <a href="https://github.com/rvanasa/vite-react-motoko/tree/simplified-js#readme" target="_blank" rel="noopener noreferrer">plain JavaScript version</a>).</p><p>Otherwise, this is a good starting point for live reloading a backend Motoko canister:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">mo-dev --generate --deploy -y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>The <code>--generate</code> flag automatically creates and updates JavaScript language bindings whenever you make changes to your Motoko source code.</p><p>It’s also possible to use this feature by itself (<code>mo-dev --generate</code>).</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="advanced-usage">Advanced Usage<a href="#advanced-usage" class="hash-link" aria-label="Direct link to Advanced Usage" title="Direct link to Advanced Usage">​</a></h2><p>For those wanting to plug the Motoko Dev Server into an existing webapp, here is a scalable Vite project configuration we’ve adopted at DFINITY:</p><ul><li>Run <code>npm install -D npm-run-all mo-dev</code> in your project’s root directory</li><li>Add a frontend npm script which runs <code>vite</code></li><li>Add a backend npm script which runs <code>mo-dev</code> with relevant flags</li><li>Change the start npm script to <code>run-p frontend backend</code></li></ul><p>With this project configuration, <code>npm start</code> will run the Vite and Motoko dev servers with a seamlessly integrated console output. You can split the outputs via <code>npm run frontend</code> and <code>npm run backend</code> in separate terminals.</p><p>Another benefit of this configuration is that anyone can run the dev server without needing to globally install the <code>mo-dev</code> command, which is great for encouraging open-source contributions or working as part of a team.</p><p>This project configuration will be included by default in the upcoming changes to the <a href="/building-apps/developer-tools/dfx/dfx-new">dfx new</a> command.</p><p><code>mo-dev</code> ships with a test runner compatible with third-party libraries such as motoko-matchers.</p><p>To register a unit test, create a file with the extension <code>*.test.mo</code> anywhere in your project. For example, here is a basic unit test which asserts that <code>2vxsx-fae</code> is the anonymous <a href="https://medium.com/dfinity/internet-computer-basics-part-1-principals-and-identities-215e8f239da4" target="_blank" rel="noopener noreferrer">principal</a>:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div class="buttonGroup_6DOT"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn copyButton_PK4F"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button><button type="button" class="run-button" aria-label="Run" title="Run Code"><svg width="24" height="24" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_552_2339)"><path d="M8 1.33333C11.676 1.33333 14.6667 4.324 14.6667 8C14.6667 11.676 11.676 14.6667 8 14.6667C4.324 14.6667 1.33333 11.676 1.33333 8C1.33333 4.324 4.324 1.33333 8 1.33333ZM8 0C3.582 0 0 3.582 0 8C0 12.418 3.582 16 8 16C12.418 16 16 12.418 16 8C16 3.582 12.418 0 8 0ZM6 11.3333V4.66667L12 8.09733L6 11.3333Z" fill="currentColor"></path></g><defs><clipPath id="clip0_552_2339"><rect width="16" height="16" fill="white"></rect></clipPath></defs></svg></button></div><div><div class="language-motoko codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-motoko codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#F1EEF5">{</span><span class="token plain"> print </span><span class="token punctuation" style="color:#F1EEF5">}</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:base/Debug"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">import</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Principal</span><span class="token plain"> </span><span class="token string" style="color:#F68E5F">"mo:base/Principal"</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">let</span><span class="token plain"> myPrincipal </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Principal</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">fromText</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"2vxsx-fae"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">print</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"Anonymous?"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:#EB318A">assert</span><span class="token plain"> </span><span class="token builtin" style="color:#29ABE2">Principal</span><span class="token punctuation" style="color:#F1EEF5">.</span><span class="token plain">isAnonymous</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token plain">myPrincipal</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">print</span><span class="token punctuation" style="color:#F1EEF5">(</span><span class="token string" style="color:#F68E5F">"Yep!"</span><span class="token punctuation" style="color:#F1EEF5">)</span><span class="token punctuation" style="color:#F1EEF5">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Once you’ve created a <code>*.test.mo</code> file, run the following command:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">mo-dev --test</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>This will run all unit tests whenever you change a Motoko source file.</p><p>Note that when using <code>--test</code> with <code>--deploy</code>, the dev server will wait until all relevant tests succeed before redeploying your canister.</p><p>If you want to run tests without the live-reloading functionality, you can use the <code>mo-test</code> command which is automatically installed alongside <code>mo-dev</code>:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">mo-test --help</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can also include the <code>-f</code> flag to filter specific test files:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">mo-test -f Foo # Run test files starting with "Foo"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mo-test -f Foo.test.mo # Only run test files named "Foo.test.mo"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mo-test -f Foo -f Bar # Run test files starting with "Foo" or "Bar"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>By default, the test runner uses the Motoko interpreter. If performance is critical, you can switch to a compiled <a href="https://wasi.dev/" target="_blank" rel="noopener noreferrer">WASI</a> runtime by installing <a href="https://wasmtime.dev/" target="_blank" rel="noopener noreferrer">Wasmtime</a> and adding <code>--testmode wasi</code> to the test command.</p><p>The <a href="https://github.com/dfinity/vscode-motoko#readme" target="_blank" rel="noopener noreferrer">Motoko VS Code extension</a> also includes a UI for the test runner:</p><p><img loading="lazy" src="https://user-images.githubusercontent.com/522097/219227189-71bb8d54-1904-49f2-8fe8-253b5a709e3f.png" alt="VS Code unit testing integration" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="continuous-integration">Continuous Integration<a href="#continuous-integration" class="hash-link" aria-label="Direct link to Continuous Integration" title="Direct link to Continuous Integration">​</a></h2><p>The Motoko Dev Server can be used in <a href="https://semaphoreci.com/continuous-integration" target="_blank" rel="noopener noreferrer">CI</a> environments such as <a href="https://github.com/features/actions" target="_blank" rel="noopener noreferrer">GitHub Actions</a>, <a href="https://www.travis-ci.com/" target="_blank" rel="noopener noreferrer">Travis</a>, and <a href="https://circleci.com/" target="_blank" rel="noopener noreferrer">CircleCI</a>. In these environments, <code>mo-dev</code> will automatically terminate instead of waiting for file changes.</p><p>You can achieve the same effect on your local system by setting the CI environment variable to <code>true</code> or <code>1</code>:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">CI=true mo-dev --generate --deploy</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="final-thoughts">Final Thoughts<a href="#final-thoughts" class="hash-link" aria-label="Direct link to Final Thoughts" title="Direct link to Final Thoughts">​</a></h2><p>Here are a few miscellaneous tips which might come in handy while working with <code>mo-dev</code>:</p><ul><li>Live reloading works when switching Git branches, which is useful to keep in mind for code reviews and pair programming.</li><li>If you’ve used <a href="/building-apps/developer-tools/dfx/dfx-generate">dfx generate</a>, you might have encountered a common catch-22 where both <code>dfx generate</code> and <code>dfx deploy</code> require running each other first. <code>mo-dev --generate --deploy</code> automatically handles this situation for you.</li><li>You can define custom live-reload logic using <code>mo-dev --exec &lt;command&gt;</code>.</li></ul><hr><p>Feedback is welcome! If you find a bug or want to see a new feature, please feel free to <a href="https://github.com/dfinity/motoko-dev-server/issues" target="_blank" rel="noopener noreferrer">reach out on GitHub</a> (or give us a ⭐ to support the project) at <a href="https://github.com/dfinity/motoko-dev-server" target="_blank" rel="noopener noreferrer">github.com/dfinity/motoko-dev-server</a>.</p><p>Otherwise, consider submitting a request on our <a href="https://dx.internetcomputer.org/" target="_blank" rel="noopener noreferrer">Developer Experience Feedback Board</a>, which itself was built with <code>mo-dev</code>! If you're curious, you can find the source code at <a href="https://github.com/dfinity/feedback" target="_blank" rel="noopener noreferrer">github.com/dfinity/feedback</a>.</p><p>Thanks for reading. Cheers!</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Network Nervous System]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-nns</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-nns"/>
        <updated>2023-07-05T15:42:16.000Z</updated>
        <summary type="html"><![CDATA[For the first installment of this series, we sat down with the Network Nervous System team to learn more about the NNS, the SNS initiative, and the current goals the team is focused on.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="NNS Team spotlight" src="/assets/images/dev-update-blog-nns-1-6def4b4bcfad424e4a4c169d5a057e6f.jpeg" width="1400" height="675" class="img_ev3q"></p><p>Hello devs and welcome to a new blog post series: team spotlight!</p><p>Every two weeks, we're going to be showcasing one of the DFINITY teams to learn what they're working on and dive deeper into how the team fits into the ICP ecosystem. Through this new series, developers will get updates and insight into teams other than the SDK and Motoko teams, which are regularly covered on this blog through the 'Developer weekly update' series.</p><p>For the first installment of this series, we sat down with the Network Nervous System team to learn more about the NNS, the SNS initiative, and the current goals the team is focused on.</p><p><strong>To get started, let's first dive into the focus and purpose of the NNS team. What would you say the mission of the NNS team is?</strong></p><p><em>NNS stands for Network Nervous System. The NNS is the DAO (decentralized autonomous organization) that governs and coordinates the full Internet Computer Protocol. It coordinates, for example, how nodes are assigned to subnets and how the Internet Computer Protocol is updated to new versions.</em>
<em>So, as the name suggests, the main mission of the NNS team is to contribute to the design, implementation, and maintenance of the NNS DAO. In addition to this, the NNS team is a key contributor to the design and implementation of the Service Nervous System (SNS), which is a DAO framework provided by ICP that allows individual applications to decentralize their governance.</em></p><p><strong>The NNS team has quite the responsibility to manage and contribute to, what an exciting team to be a part of! What is the composition of the NNS team?</strong></p><p><em>The team consists of 6 engineers, 1 engineering manager, and 2 researchers spread across Switzerland and USA.</em></p><p><strong>What products or features on ICP are the primary focus of the NNS team?</strong></p><p><em>There are two main products that the NNS team works on:</em></p><p><em>- The NNS DAO</em></p><p><em>- The SNS DAO framework, which consists of the SNS DAO and the SNS launchpad which is used to launch an SNS.</em></p><p><strong>Since we've gotten an overview of the NNS DAO already, so let's talk a bit more about the SNS initiative. Could you give a brief overview of what the NNS team is responsible for in regards to the SNS initiative?</strong></p><p><em>The NNS team is one of the main contributors of the SNS initiative. We helped build and contribute to maintaining the SNS Swap canister which is responsible for collecting initial funding and decentralizing the SNS during the launch. We are also the main responsible team for maintaining:</em></p><p><em>- The SNS Governance canister, responsible for making the decisions in the DAO.</em></p><p><em>- The SNS Root canister, which is responsible for upgrading other canisters.</em></p><p><em>- The NNS canister called “SNS Wasm modules canister” that is responsible for deploying and involved in upgrading the SNS canisters.</em></p><p><strong>Does the NNS DAO have a role that it plays in the SNS initiative and the launching of new SNSes?</strong></p><p><em>The NNS DAO approves and initiates the launch of new SNSes. This means that if someone wants to hand over a dapp’s control to a new SNS, then this process needs approval from the NNS community. You can read more details about this process <a href="/building-apps/governing-apps/launching/launch-summary-1proposal">here</a>.</em></p><p><strong>Let's talk about the team's roadmap. What is the primary project that the NNS team is working on or focused on currently?</strong></p><p><em>We usually work on different projects in parallel (combining NNS and SNS features). One project that we currently work on is making the SNS launch process more user friendly. At the moment, launching an SNS includes 2 NNS proposals and quite some manual steps from the developer team that is handing over their dapp to a new SNS.</em></p><p><em>As the name suggests, once the  “1-proposal” feature is implemented, this full process will be done in one single NNS proposal. This means that there is one NNS proposal where the ICP community decides whether an SNS should be launched for a given dapp and if this proposal is adopted the full SNS launch is triggered and executed automatically.</em></p><p><strong>That sounds like it will drastically improve the SNS launch process! Could you give some insight into what pieces or components are being developed to achieve this goal?</strong></p><p><em>Changing this process requires changing multiple components, including the NNS governance to introduce the new proposal and the SNS Wasm modules canister which coordinates the deployment of the SNS canisters.</em></p><p><strong>We briefly touched on the benefits of this project, but are there any additional benefits to introducing the "1-proposal" feature?</strong></p><p><em>It will tremendously simplify the SNS launch flow for developers who want to hand over their dapp to an SNS. Moreover, it will simplify the process for the NNS community who now only have to understand and verify one NNS proposal to make a decision for whether an SNS should be launched.</em></p><p><strong>Are there any other major roadmap items currently planned for the NNS team?</strong></p><p><em>It’s hard to talk about specific features as the environment we operate in is a bit dynamic. Instead, here are the high level goals we have:</em></p><p><em>- On the NNS side, our focus is on increasing governance participation, new node onboarding, and growth of the Internet Computer.</em></p><p><em>- For SNS, the focus is on improving the project experience when launching an SNS, improving the DAO member experience once an SNS is launched, and extending the framework to support 10x projects.</em></p><p><strong>For developers who want to stay up to date with the latest NNS team updates, where should they be looking?</strong></p><p><em>We publish regular updates for proposals submitted for both the NNS and the SNS canisters on the official DFINITY forum. There users can stay up to date with upcoming API changes and new functionality that we are working on. <a href="https://forum.dfinity.org/t/nns-updates-june-12-2023/20670" target="_blank" rel="noopener noreferrer">Here</a> is an example forum post.</em></p><p><em>We use the forum to discuss feature ideas and designs with the community. All our major features start with a forum post followed by a discussion. <a href="https://forum.dfinity.org/t/enhancement-of-the-sns-launch-process-one-proposal/19548" target="_blank" rel="noopener noreferrer">Here</a> is the forum post for the 1-proposal feature mentioned above.</em></p><p><strong>What are some features or aspects of the NNS DAO or the SNS initiative that the team is the most proud of?</strong></p><p><em>The NNS is one of the most evolved DAOs that exists. A major advantage that it has compared to other DAOs is that the execution of proposals happens fully on chain and that a proposal can trigger any method on any canister - this allows for endless possibilities regarding which decisions can now be made by a whole community and executed fully automatically!</em></p><p><em>The NNS DAO has been running for more than a year with hundreds of proposals!</em></p><p><em>The SNS framework that we helped build has already allowed 2 projects to launch an SNS DAO. This is pretty exciting and we are looking forward to seeing what other projects will follow!</em></p><p><strong>That's incredible, definitely something to be extremely proud of! To close out our spotlight interview, we've got one more question. What makes the NNS team unique compared to some of the other dev teams at DFINITY?</strong></p><p><em>We are a pretty “new” team - many team members joined in the last year. The engineers in our team are spread pretty evenly between the US and CH.</em></p><p>Thank you so much to the NNS team for sitting down with us and diving into all things NNS! We hope that you learned as much as we did. Be sure to check in later in the month for another team spotlight blog post!</p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 28, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/06/28/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/06/28/news-and-updates/update"/>
        <updated>2023-06-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, as Q2 comes to a close, we’re going to recap some of the biggest developer enhancements and features that were released over the past three months, plus discuss the new Motoko Dev Server!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 28 2023" src="/assets/images/dev-update-blog-jun-3-7d434e1777da405e68c22254a72d9e80.jpeg" width="1400" height="675" class="img_ev3q"></p><p>Good afternoon devs and welcome to this week’s issue of developer weekly!</p><p>This week, as Q2 comes to a close, we’re going to recap some of the biggest developer enhancements and features that were released over the past three months, plus discuss the new Motoko Dev Server!</p><p>Let’s get into it!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="q2-recap">Q2 recap<a href="#q2-recap" class="hash-link" aria-label="Direct link to Q2 recap" title="Direct link to Q2 recap">​</a></h2><p>During Q2 2023, our SDK and Languages teams shipped a ton of great new features, updates, and tools. Here are some of the biggest highlights:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motokos-new-certification-library-ic-certification">Motoko’s new certification library: ic-certification<a href="#motokos-new-certification-library-ic-certification" class="hash-link" aria-label="Direct link to Motoko’s new certification library: ic-certification" title="Direct link to Motoko’s new certification library: ic-certification">​</a></h3><p>The new <a href="https://mops.one/ic-certification" target="_blank" rel="noopener noreferrer">ic-certification library</a> released this quarter implements ICP’s certification tree data structure, which underlies the certified access mechanism on ICP. This is used to validate HTTP responses from canisters in order to protect them against malicious nodes. The ic-certification library also underlies the canister signatures mechanism, which is used to let canisters like the Internet Identity canister sign requests that are sent to ICP. The development of the ic-certification library was funded by an icdevs.org bug bounty, with special work by @nomeata!</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="vscode-candid-auto-formatting-and-syntax-highlighting">VSCode Candid auto-formatting and syntax highlighting<a href="#vscode-candid-auto-formatting-and-syntax-highlighting" class="hash-link" aria-label="Direct link to VSCode Candid auto-formatting and syntax highlighting" title="Direct link to VSCode Candid auto-formatting and syntax highlighting">​</a></h3><p>Additional features were added to the Motoko VSCode extension that include syntax highlighting and auto-formatting for Candid files. While this isn’t a huge update, it helps improve the dev quality of life with the aim to boost productivity.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-feedback-board">Developer Feedback Board<a href="#developer-feedback-board" class="hash-link" aria-label="Direct link to Developer Feedback Board" title="Direct link to Developer Feedback Board">​</a></h3><p>This quarter, a new developer feedback tool was launched: the <a href="https://dx.internetcomputer.org/" target="_blank" rel="noopener noreferrer">Developer Feedback Board</a>! This board was developed in response to feedback derived from internal focus groups with the goal to improve and prioritize enhancing the developer experience. This group determined that one way to best serve ICP developers was to figure out what developers need <em>right now</em> to aid in their development. The ICP community also provided the insight that they’d prefer to have a single place for this input, rather than across multiple channels like the developer forum or Discord.</p><p><img loading="lazy" alt="Feedback board" src="/assets/images/feedback_board_1-9b72864f62bb64029c0d411f1fec0292.jpg" width="1920" height="1080" class="img_ev3q"></p><p>In response to this feedback, we launched the Developer Feedback Board, an interactive GUI interface where developers can request new features and upvote things that others have suggested that they also would like.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-0141">dfx 0.14.1<a href="#dfx-0141" class="hash-link" aria-label="Direct link to dfx 0.14.1" title="Direct link to dfx 0.14.1">​</a></h3><p>This quarter also saw a new release of dfx - 0.14.1. In this release, the primary features and updates included:</p><ul><li>Feature: gzip option in dfx.json.</li><li>Feature: Detailed logging for ic-asset.</li><li>Feature: The .env file now includes all created canister IDs.</li><li>Feature: Users are now asked for consent when they remove themselves as the controller.</li></ul><p>In addition to these new features, an array of various fixes have shipped with this release as well:</p><ul><li>Fix: If <code>dfx canister delete</code> is running on a canister that has not been stopped, dfx will confirm the removal of the canister instead of returning an error as it had in the past.</li><li>Fix: The documentation of IC SDK has been cleaned up.</li><li>Fix: To account for a more expensive v2 certification calculation, commit batches are now done incrementally to allow larger changes without exceeding the per-message instruction limit.</li><li>Fix: <code>dfx deploy</code>’s behavior previously allowed the same argument to be provided to all canisters; this behavior has been removed and now results in an error.</li><li>Fix: <code>dfx canister install</code>’s behavior previously allowed an empty argument to call all canisters regardless of any specifications; this behavior has been removed and now results in an error.</li><li>Fix: When starting dfx with <code>dfx start</code>, if the replica does not return a ‘healthy’ status at least once after launching, dfx will terminate the process and restart it.</li><li>Fix: If Bitcoin support is enabled, <code>dfx start</code> will now install the Bitcoin canister. <code>dfx start</code> will add a new field <code>canister_init_arg</code> to the Bitcoin configuration in the <code>networks.json</code> and <code>dfx.json</code> files.</li><li>Fix: The <code>bitcoin_regtest</code> feature has been disabled.</li><li>Chore: <code>nns-dapp</code> and <code>internet_identity</code> have been added to the local canister IDs that are set by the <code>dfx nns import</code> command.</li><li>Chore: SNS subcommands are now visible in the <code>dfx help</code> output.</li></ul><p>You can download and check out the full dfx 0.14.1 release notes <a href="https://github.com/dfinity/sdk/releases/tag/0.14.1" target="_blank" rel="noopener noreferrer">here</a>.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-docs">Developer docs<a href="#developer-docs" class="hash-link" aria-label="Direct link to Developer docs" title="Direct link to Developer docs">​</a></h3><p>In Q2, the developer docs have seen a wide range of changes, updates, and visual alterations. These include:
The development and application of a Developer Docs Style Guide, which has been used to standardize the Developer Docs and assure each page looks, feels, and reads cohesively to one another.
Documentation validation and updates, to assure that each current page of the docs is up to date and showcases the most current version of commands, code blocks, and examples.</p><ul><li><p>New HTTPS outcalls tutorials, such as:</p><ul><li><a href="/references/https-outcalls-how-it-works">HTTPS outcalls: technology overview:</a> this page covers the overview of how the technology behind HTTPS outcalls operates. In summary, when a canister makes an outgoing HTTP request using the management canister API, the request is temporarily stored in the replicated state of the subnet. Then, each replica pushes an instance of the received HTTP response from the external web server through ICP’s <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus</a> layer. Through this, each replica on a subnet can agree on the HTTP response that’s been provided by the canister.</li><li><a href="/building-apps/network-features/using-http/https-outcalls/overview">How to use HTTPS outcalls: Intro:</a> this page provides a high-level overview of the API used to send HTTPS outcalls.</li><li><a href="/building-apps/network-features/using-http/https-outcalls/get">How to use HTTPS outcalls: GET:</a> this page includes a brand new tutorial written by Diego Prats that showcases how to make a GET HTTP request using a sample canister that makes a request to the Coinbase API. This tutorial provides instructions for both Motoko and Rust development workflows.</li><li><a href="/building-apps/network-features/using-http/https-outcalls/post">How to use HTTPS outcalls: POST:</a> this page is another brand new tutorial written by Diego Prats that explains how to make a POST HTTP request using a sample canister that sends a request with JSON information to a free API that is used to verify that the headers and body of the request were sent properly.</li></ul></li><li><p>A new <a href="/building-apps/canister-management/resource-limits">resource limits and constraints documentation</a> page that details ICP’s resource constraints and limits for things such as canister queue limit, instruction limit query calls, Wasm stable memory, and subnet capacity.</p></li><li><p>New <a href="https://learn.internetcomputer.org/hc/en-us/articles/34084394684564-SNS-Service-Nervous-System" target="_blank" rel="noopener noreferrer">SNS documentation</a>, which includes updated instructions for developing, testing, and launching an SNS, including a page dedicated to <a href="/building-apps/governing-apps/managing/sns-asset-canister">SNS asset canisters</a> and a new <a href="/building-apps/governing-apps/tokenomics/sns-checklist">SNS launch checklist</a>.</p></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-quill-release---042">New Quill release - 0.4.2<a href="#new-quill-release---042" class="hash-link" aria-label="Direct link to New Quill release - 0.4.2" title="Direct link to New Quill release - 0.4.2">​</a></h3><p>This quarter, a new version of Quill was released; <a href="https://github.com/dfinity/quill/releases" target="_blank" rel="noopener noreferrer">0.4.2</a>. This release primarily focused on adding new Ledger support, enabling the same key to be shared between the NNS UI and Quill, which previously wasn't possible.</p><p>In addition to Ledger support, other new features and additions in this release include:</p><ul><li>Added <code>--subaccount</code> to <code>quill public-ids</code>.</li><li>Added Ledger support via <code>--ledger</code>.</li><li>Added <code>--confirmation-text</code> to <code>quill sns pay</code>.</li><li>Fixed <code>quill ckbtc update-balance</code> allowing the anonymous principal.</li><li>Added <code>disburse</code>, <code>disburse-maturity</code>, <code>split-neuron</code>, and <code>follow-neuron</code> to quill sns.</li><li>Added option to print DFN address for Genesis investors.</li><li>Updated to new ICRC-1 account ID format.</li></ul><p>Motoko Dev Server</p><p>As we wrap up Q2 this week, we have one more huge release for developers: Motoko Dev Server!</p><p>Motoko Dev Server, or mo-dev, is a live-reload server designed to enable flexible, quick building and testing of Motoko services on the Internet Computer blockchain. Mo-dev is designed to be a Web3 version of popular Web2 live-reloading servers, like Next.js, Webpack, and Vite. Features and functionality of mo-dev include:</p><ul><li>Executing commands.</li><li>Generating type bindings.</li><li>Deploying canisters.</li><li>Running unit tests.</li><li>Any combination of the above.</li></ul><p>You can learn more in <a href="https://ryanvandersmith.medium.com/20363088afb4" target="_blank" rel="noopener noreferrer">Ryan Vandersmith’s blog post</a>, or in the <a href="https://github.com/dfinity/motoko-dev-server" target="_blank" rel="noopener noreferrer">mo-dev repo</a>.</p><p>That wraps up this edition of developer weekly, see you all next week!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 21, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/06/21/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/06/21/news-and-updates/update"/>
        <updated>2023-06-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we’re going to talk about some new important pieces of documentation, a new Quill release, and an awesome new example project developed by Luc Bläser from the DFINITY languages team for the Motoko workshop at KTH summer school.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 21, 2023" src="/assets/images/dev-update-blog-jun-2-2-c3e9b3761658be748d3d2cf863873bd7.jpeg" width="1400" height="675" class="img_ev3q"></p><p>Hello devs and welcome to this week’s issue of developer weekly!</p><p>This week, we’re going to talk about some new important pieces of documentation, a new Quill release, and an awesome new example project developed by Luc Bläser from the DFINITY languages team for the Motoko workshop at KTH summer school.</p><p>Let’s get started!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="important-new-documentation-pages">Important new documentation pages<a href="#important-new-documentation-pages" class="hash-link" aria-label="Direct link to Important new documentation pages" title="Direct link to Important new documentation pages">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="https-outcalls-tutorials">HTTPS outcalls tutorials<a href="#https-outcalls-tutorials" class="hash-link" aria-label="Direct link to HTTPS outcalls tutorials" title="Direct link to HTTPS outcalls tutorials">​</a></h3><p>This week, the developer documentation received some new, comprehensive tutorials on using HTTPS outcalls. These tutorials include:</p><ul><li><a href="/references/https-outcalls-how-it-works">HTTPS outcalls: technology overview</a>: this page covers the overview of how the technology behind HTTPS outcalls operates. In summary, when a canister makes an outgoing HTTP request using the management canister API, the request is temporarily stored in the replicated state of the subnet. Then, each replica pushes an instance of the received HTTP response from the external web server through ICP’s <a href="https://learn.internetcomputer.org/hc/en-us/articles/34207558615956-Consensus" target="_blank" rel="noopener noreferrer">consensus</a> layer. Through this, each replica on a subnet can agree on the HTTP response that’s been provided by the canister.</li><li><a href="/building-apps/network-features/using-http/https-outcalls/overview">How to use HTTPS outcalls: Intro</a>: this page provides a high-level overview of the API used to send HTTPS outcalls.</li><li><a href="/building-apps/network-features/using-http/https-outcalls/get">How to use HTTPS outcalls: GET</a>: this page includes a brand new tutorial written by Diego Prats that showcases how to make a <code>GET</code> HTTP request using a sample canister that makes a request to the Coinbase API. This tutorial provides instructions for both Motoko and Rust development workflows.</li><li><a href="/building-apps/network-features/using-http/https-outcalls/post">How to use HTTPS outcalls: POST</a>: this page is another brand new tutorial written by Diego Prats that explains how to make a <code>POST</code> HTTP request using a sample canister that sends a request with JSON information to a free API that is used to verify that the headers and body of the request were sent properly.</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="resource-limits-and-constraints-documentation">Resource limits and constraints documentation<a href="#resource-limits-and-constraints-documentation" class="hash-link" aria-label="Direct link to Resource limits and constraints documentation" title="Direct link to Resource limits and constraints documentation">​</a></h3><p>Another new page of documentation added this week details ICP’s <a href="/building-apps/canister-management/resource-limits">resource constraints and limits</a> for things such as canister queue limit, instruction limit query calls, Wasm stable memory, and subnet capacity. Check out the full chart below:</p><table><thead><tr><th>Resource</th><th>Constraint</th></tr></thead><tbody><tr><td>Canister queue limit</td><td>500 messages</td></tr><tr><td>Maximum ingress and cross-net inter-canister call payload</td><td>2MB</td></tr><tr><td>Maximum same-subnet inter-canister call payload (may be deprecated at some point)</td><td>10MB</td></tr><tr><td>Maximum response size</td><td>2MB</td></tr><tr><td>Instruction limit per update call/heartbeat/timer</td><td>20B per method invocation</td></tr><tr><td>Instruction limit query calls</td><td>5B</td></tr><tr><td>Instruction limit for canister install and upgrade</td><td>200B</td></tr><tr><td>Subnet capacity</td><td>450GB</td></tr><tr><td>Wasm heap size</td><td>4GB</td></tr><tr><td>Wasm stable memory</td><td>64GB</td></tr><tr><td>Wasm custom sections</td><td>2GB per subnet; 1MB per canister; 16 sections at most (per canister)</td></tr><tr><td>Wasm code section</td><td>10MB</td></tr><tr><td>Query calls execution threads</td><td>2 per replica node</td></tr><tr><td>Update calls execution threads</td><td>4 per subnet</td></tr></tbody></table><p>You can read the full list <a href="/building-apps/canister-management/resource-limits">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-quill-release---042">New Quill release - 0.4.2<a href="#new-quill-release---042" class="hash-link" aria-label="Direct link to New Quill release - 0.4.2" title="Direct link to New Quill release - 0.4.2">​</a></h2><p>This week, Quill version 0.4.2 was released, adding some great new features such as Ledger support! With the new Ledger support feature, the same key can be shared between the NNS UI and Quill, which previously wasn't possible. To use this new feature, the <code>--ledger</code> flag can be used.</p><p>In addition to Ledger support, other new features and additions in this release include:</p><ul><li>Added <code>--subaccount</code> to <code>quill public-ids</code>.</li><li>Added Ledger support via <code>--ledger</code>.</li><li>Added <code>--confirmation-text</code> to <code>quill sns pay</code>.</li><li>Fixed <code>quill ckbtc update-balance</code> allowing the anonymous principal.</li><li>Added <code>disburse</code>, <code>disburse-maturity</code>, <code>split-neuron</code>, and <code>follow-neuron</code> to <code>quill sns</code>.</li><li>Added option to print DFN address for Genesis investors.</li><li>Updated to new ICRC-1 account ID format.</li></ul><p>You can get the new release of Quill <a href="https://github.com/dfinity/quill/releases" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-workshop-at-kth-summer-school">Motoko workshop at KTH summer school<a href="#motoko-workshop-at-kth-summer-school" class="hash-link" aria-label="Direct link to Motoko workshop at KTH summer school" title="Direct link to Motoko workshop at KTH summer school">​</a></h2><p>This past week, DFINITY’s Luc Bläser gave a presentation and workshop as part of the <a href="https://cysep.conf.kth.se/" target="_blank" rel="noopener noreferrer">KTH summer school program</a>. The workshop included a brand new Motoko example dapp that walked students through how to create a decentralized auction using a Motoko canister. The auction platform provides functionality for:</p><ul><li>Opening and viewing auctions.</li><li>Bidding within a defined deadline before the auction ends.</li><li>Authenticating using Internet Identity.</li></ul><p>As part of the workshop, this example provides a foundation that is intended to be built upon. Devs are challenged to add additional functionality to the dapp, such as:</p><ul><li>Storing and retrieving the auction data in the actor, preferably using stable variables.</li><li>Implementation of public functions for the actor.</li><li>Associating the auction’s id for later retrieval.</li><li>Implementing a periodic timer that can be used to terminate auctions.</li></ul><p>You can check out the example repo <a href="https://github.com/luc-blaeser/auction" target="_blank" rel="noopener noreferrer">here</a> and get started workshopping with it yourself, or check out the workshop’s presentation slides <a href="https://github.com/luc-blaeser/auction/blob/main/Motoko_Tutorial.pdf" target="_blank" rel="noopener noreferrer">here</a>.</p><p>We'll see everyone back here next week for another update!</p><p>-DFINITY</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update June 14, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/06/14/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/06/14/news-and-updates/update"/>
        <updated>2023-06-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This week, we’re going to break down our latest release of dfx (0.14.1) by diving into the new features that shipped with this new version, as well as talk about some new features under the hood of Motoko.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="June 14 2023" src="/assets/images/thumb-dev-update-june-1-1eaaaf1a67357f97224bcdd14cc69fc0.jpeg" width="1400" height="675" class="img_ev3q"></p><p>Hello devs and welcome to this week’s issue of developer weekly! This week, we’re going to break down our latest release of dfx (0.14.1) by diving into the new features that shipped with this new version, as well as talk about some new features under the hood of Motoko.</p><p>Let’s dive in!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-0141">dfx 0.14.1<a href="#dfx-0141" class="hash-link" aria-label="Direct link to dfx 0.14.1" title="Direct link to dfx 0.14.1">​</a></h2><p>The latest release of dfx, 0.14.1, primarily addresses issues that were experienced in the previous release, 0.14.0; one of these issues was a bug within the asset canister feature that affected single-page applications. For this reason, we strongly recommend that users upgrade to 0.14.1.</p><p>In addition to the important patch for the asset canister functionality, dfx shipped with new features to enhanced developer experiences, such as:</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="feature-gzip-option-in-dfxjson">Feature: gzip option in dfx.json:<a href="#feature-gzip-option-in-dfxjson" class="hash-link" aria-label="Direct link to Feature: gzip option in dfx.json:" title="Direct link to Feature: gzip option in dfx.json:">​</a></h3><p>dfx can now use gzip on the wasm module as a final step when building canisters. This feature is disabled by default, but can be enabled in the <code>dfx.json</code> file by using the following configuration:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  "canisters" : {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    "app" : {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "gzip" : true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>If you want to specify the <code>.wasm.gz</code> file directly for custom canisters, this functionality is still supported. Metadata, optimization, or shrink options that are set in the <code>dfx.json</code> file will be applied after the custom <code>.wasm.gz</code> file is decompressed, modified, then compressed back into <code>wasm.gz</code> at the end of the canister build process.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="feature-detailed-logging-for-ic-asset">Feature: Detailed logging for ic-asset:<a href="#feature-detailed-logging-for-ic-asset" class="hash-link" aria-label="Direct link to Feature: Detailed logging for ic-asset:" title="Direct link to Feature: Detailed logging for ic-asset:">​</a></h3><p>Log output for <code>dfx deploy -v</code> (or <code>-vv</code>) now includes more detailed information such as:</p><ul><li>The number of chunks that have been uploaded and the total number of bytes.</li><li>The API version for the canister and the ic-asset.</li><li>The count for each <code>BatchOperationKind</code> in <code>CommitBatchArgs</code>.</li><li>The value of <code>CommitBatchArgs</code> (only within the <code>-vv</code> output).</li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="feature-the-env-file-now-includes-all-created-canister-ids">Feature: The <code>.env</code> file now includes all created canister IDs.<a href="#feature-the-env-file-now-includes-all-created-canister-ids" class="hash-link" aria-label="Direct link to feature-the-env-file-now-includes-all-created-canister-ids" title="Direct link to feature-the-env-file-now-includes-all-created-canister-ids">​</a></h3><p>In previous versions, the <code>.env</code> file only contained canister IDs for canisters listed as explicit dependencies during the build process. Now, the <code>.env</code> file includes all canisters and their canister IDs for the specified network.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="feature-users-are-now-asked-for-consent-when-they-remove-themselves-as-the-controller">Feature: Users are now asked for consent when they remove themselves as the controller.<a href="#feature-users-are-now-asked-for-consent-when-they-remove-themselves-as-the-controller" class="hash-link" aria-label="Direct link to Feature: Users are now asked for consent when they remove themselves as the controller." title="Direct link to Feature: Users are now asked for consent when they remove themselves as the controller.">​</a></h3><p>If a user removes themselves, or the wallet that they use, they can lose control over a canister. To prevent this loss, <code>dfx canister update-settings</code> will now ask for confirmation when a principal or wallet is removed from the list of controllers for a canister. This check can be skipped by using either the <code>–yes</code>/<code>-y</code> argument, or passing ‘yes’ to the command with a pipe such as:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">echo "yes" | dfx canister update-settings &lt;...&gt;.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>In addition to these new features, an array of various fixes have shipped with this release as well:</p><ul><li>Fix: If <code>dfx canister delete</code> is running on a canister that has not been stopped, dfx will confirm the removal of the canister instead of returning an error as it had in the past.</li><li>Fix: The documentation of IC SDK has been cleaned up.</li><li>Fix: To account for a more expensive v2 certification calculation, commit batches are now done incrementally to allow larger changes without exceeding the per-message instruction limit.</li><li>Fix: <code>dfx deploy</code>’s behavior previously allowed the same argument to be provided to all canisters; this behavior has been removed and now results in an error.</li><li>Fix: <code>dfx canister install</code>’s behavior previously allowed an empty argument to call all canisters regardless of any specifications; this behavior has been removed and now results in an error.</li><li>Fix: When starting dfx with <code>dfx start</code>, if the replica does not return a ‘healthy’ status at least once after launching, dfx will terminate the process and restart it.</li><li>Fix: If Bitcoin support is enabled, <code>dfx start</code> will now install the Bitcoin canister. dfx start will add a new field <code>canister_init_arg</code> to the Bitcoin configuration in the <code>networks.json</code> and <code>dfx.json</code> files.</li><li>Fix: The <code>bitcoin_regtest</code> feature has been disabled.</li><li>Chore: <code>nns-dapp</code> and <code>internet_identity</code> have been added to the local canister IDs that are set by the <code>dfx nns import</code> command.</li><li>Chore: SNS subcommands are now visible in the <code>dfx help</code> output.</li></ul><p>You can download and check out the full dfx 0.14.1 release notes <a href="https://github.com/dfinity/sdk/releases/tag/0.14.1" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="incremental-gc">Incremental GC<a href="#incremental-gc" class="hash-link" aria-label="Direct link to Incremental GC" title="Direct link to Incremental GC">​</a></h2><p>On the Motoko side of things, under the hood Motoko has recently implemented a new memory management service called the <a href="https://forum.dfinity.org/t/incremental-garbage-collector-beta-release-motoko-update-part-12/20066" target="_blank" rel="noopener noreferrer">Incremental Garbage Collector (GC)</a>. The Incremental GC was released in Motoko v0.9.0 and is currently in beta.</p><p>The Incremental GC is a service in Motoko that distributes the garbage collection workload over multiple different steps (referred to as increments) that each pause the user’s running program for a short, limited period of time. Through this service, the garbage collector runs concurrently to the user’s program and allows scalable heap usage, up to 4GB, before it exceeds the message instruction limit. Therefore, it scales much higher than the previously used garbage collection process in previous Motoko versions.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-does-this-mean-for-motoko-developers">What does this mean for Motoko developers?<a href="#what-does-this-mean-for-motoko-developers" class="hash-link" aria-label="Direct link to What does this mean for Motoko developers?" title="Direct link to What does this mean for Motoko developers?">​</a></h3><p>Based on benchmark tests, the Incremental GC allows for allocations of up to 3x more heap space, all while consuming between 3% and 16% <strong>less</strong> cycles on average compared to other garbage collection processes in Motoko.</p><p>This not only means that the new Incremental GC is scalable, but it is able to perform with low latency and be extremely powerful for enhancing the Motoko developer experience through increased performance.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-documentation">Developer documentation<a href="#developer-documentation" class="hash-link" aria-label="Direct link to Developer documentation" title="Direct link to Developer documentation">​</a></h2><p>In the recent weeks, the developer docs have undergone a series of changes and updates as part of a large, long-term project designed to improve the resources available to developers on ICP. Let’s discuss some of the most important and impactful improvements to the dev docs.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cohesive-format-and-style-guide">Cohesive format and style guide<a href="#cohesive-format-and-style-guide" class="hash-link" aria-label="Direct link to Cohesive format and style guide" title="Direct link to Cohesive format and style guide">​</a></h3><p>The developer documentation has been updated so that each page follows a cohesive, uniform style and format. This includes consistent heading sizes, code block formats, use of language, capitalization, and punctuation. Other general housekeeping tasks like fixing typos, broken links, and updating document links in the side navigation bar were also part of this update.</p><p>In the coming weeks, the documentation will continue to be revised and updated to assure that each page is up to date and accurate according to the latest releases of ICP infrastructure, such as updates to dfx, Motoko, and SNS.</p><p>Another addition to the documentation is the new <a href="https://github.com/dfinity/portal/blob/master/style-guide.md" target="_blank" rel="noopener noreferrer">developer documentation style guide</a>. This document describes in detail the parameters that should be followed when new documentation is contributed. It includes standards such as heading size, word choice, how to structure tutorials and guides, and how to format bullet points, code snippets, lists, and hyperlinks. When creating new documentation, this style guide should be followed to ensure that each page within the dev docs is cohesive and uniform with one another.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-sample-code-documentation">New sample code documentation<a href="#new-sample-code-documentation" class="hash-link" aria-label="Direct link to New sample code documentation" title="Direct link to New sample code documentation">​</a></h3><p>New documentation pages have been created for each piece of sample code that exists in the <code>dfinity/examples</code> repository. For most of these examples, README documentation existed previously, but proper developer documentation pages didn’t. These new pages can be found <a href="https://internetcomputer.org/ecosystem" target="_blank" rel="noopener noreferrer">here</a>, but some notable examples are:</p><ul><li><a href="https://internetcomputer.org/docs/samples/dex" target="_blank" rel="noopener noreferrer">Decentralized exchange (DEX).</a></li><li><a href="/references/samples/motoko/basic_bitcoin/">Deploying your first Bitcoin dapp.</a></li><li><a href="https://internetcomputer.org/docs/samples/game-of-life" target="_blank" rel="noopener noreferrer">Game of Life.</a></li><li><a href="/references/samples/hosting/unity-webgl-template/">Hosting a web game on ICP.</a></li><li><a href="/references/samples/motoko/token_transfer/">ICP token transfer.</a></li></ul><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-sns-documentation-pages">New SNS documentation pages<a href="#new-sns-documentation-pages" class="hash-link" aria-label="Direct link to New SNS documentation pages" title="Direct link to New SNS documentation pages">​</a></h3><p>Another section of the documentation that’s gotten some updates this week is the SNS documentation. These pages have gone through a thorough revision, reorganization, and restructuring to provide clear and comprehensive documentation around how SNS can be created, launched, and managed. Of these pages, a highly requested <a href="/building-apps/governing-apps/tokenomics/sns-checklist">SNS preparation checklist</a> page has been created, which details step by step what is needed to create and launch an SNS.</p><p>The SNS documentation pages are part of an ongoing project, and are expected to continue to be updated, revised, and added to in the coming months. If you have any feedback on these pages, or any other documentation pages, please be sure to let us know through the <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">developer forum</a> or on <a href="https://github.com/dfinity/portal/pulls" target="_blank" rel="noopener noreferrer">Github</a>.</p><p>That’s it for this week, be sure to check in next week for our next round of developer updates!</p><p>-DFINITY</p>]]></content>
        <author>
            <name>Jessie Mongeon</name>
        </author>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update May 17, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/05/17/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/05/17/news-and-updates/update"/>
        <updated>2023-05-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we’re excited to discuss a beta test for the new incremental GC! If you want to test out the full usage of the Motoko heap then keep reading!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" src="https://global.discourse-cdn.com/business4/uploads/dfn/original/2X/d/d118475179adf31ed419566b5052467b00b8bb0a.jpeg" alt="Z0zMQPRKVIaK7jX1WCzBxbK7DNGYjXBoWlMMrpIDSPqavL4W9hlRZqqqYCOEbdnC4EBkqTzFWg7c8iUig_bERsDstWcZSbvzdYWJLnGg0GrhTRAWrX96N-tm5DgMsZD21bEJvxuakLrszCG3Rpr7mXk|690x388" class="img_ev3q"></p><p>Hey Motoko developers! 👋</p><p>Welcome back to the latest Motoko update post!
If you happened to miss our previous update, you can catch up <a href="https://forum.dfinity.org/t/bitcoin-x-ic-hackathon-and-candid-formatting-syntax-highlighting-motoko-update-part-11/19485" target="_blank" rel="noopener noreferrer">here</a>. We discussed a new Bitcoin hackathon for ICP and the VSCode candid features.</p><p>Today, we’re excited to discuss a beta test for the new incremental GC! If you want to test out the full usage of the Motoko heap then keep reading!</p><p><img loading="lazy" src="https://global.discourse-cdn.com/business4/uploads/dfn/original/2X/f/fdf17ef114032b61d14fc6aa8e79509f5f64d6c9.png" alt="IluNt1_OGByxGCHdsyEM-a9NnJq8Y3-SVdbsj0M5kof_MOF2Hyc9cqsg8UMd6AYBDUBFswbyG_eE18Shcf4_ASPIsZ8QM9L3GpKgXtwBtBTmW3N7cku99sihkTinrxCygAWjxSGpK_9CnFI5Sx3o86Y|690x306" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="incremental-garage-collector-beta-release">Incremental Garage Collector: Beta Release!<a href="#incremental-garage-collector-beta-release" class="hash-link" aria-label="Direct link to Incremental Garage Collector: Beta Release!" title="Direct link to Incremental Garage Collector: Beta Release!">​</a></h2><p>A new, powerful garbage collector, the incremental GC, has been released for beta-testing with version <a href="https://github.com/dfinity/motoko/releases/tag/0.9.0" target="_blank" rel="noopener noreferrer"><code>0.9.0</code></a> of Motoko!
The biggest impact of the incremental GC is that it enables heap usage in Motoko up to the full 4GB limit. While the existing GCs are unable to collect the whole heap due to the instruction limit per message, the new GC distributes its work across multiple messages when needed. Using evacuation-compaction based on forwarding pointers, the GC guarantees limited short pauses in all phases and is comparable to the most modern and advanced GCs used in other languages (e.g. Java). The GC’s <a href="https://learn.internetcomputer.org/hc/en-us/articles/34576974172692-Evolution-Scaling" target="_blank" rel="noopener noreferrer">scalability</a> would also be a key enabler when moving Motoko to a 64-bit heap space in the future.
Based on our GC benchmark, the incremental GC allows allocating up to 3x more heap space while consuming around 3-16% less cycles on average compared to the other GCs available in Motoko.
For the moment, the incremental GC is only intended for beta testing and can be explicitly activated by the <code>—incremental-gc</code> compiler flag. You can enable the feature in <code>dfx.json</code> like so:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  “canisters”: {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    “my_dapp”: {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">       “main”: “src/my-dapp.mo”,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">       “type”: “motoko”,</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">       “args” : “--incremental-gc”</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Please let us know of any feedback and special shoutout to @luc-blaeser for leading and building out this large and complex feature!
More information on the incremental GC can be found <a href="https://github.com/dfinity/motoko/pull/3837" target="_blank" rel="noopener noreferrer">here</a>.</p><h1>'Til next time!</h1><p>Keep building, and stay tuned for more updates!
– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update April 25, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/04/25/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/04/25/news-and-updates/update"/>
        <updated>2023-04-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Welcome to this week's edition of Developer Weekly. We have some exciting announcements to share! Buckle in and let's go.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Feedback Board" src="/assets/images/feedback_board_1-9b72864f62bb64029c0d411f1fec0292.jpg" width="1920" height="1080" class="img_ev3q"></p><p>Hello devs! 👋</p><p>Welcome to this week's edition of developer weekly. We have some exciting announcements to share! Buckle in and let's go.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="developer-feedback-tool">Developer feedback tool<a href="#developer-feedback-tool" class="hash-link" aria-label="Direct link to Developer feedback tool" title="Direct link to Developer feedback tool">​</a></h2><p>We held a series of sessions with an internal focus group whose goal was to determine how we can improve and better prioritize enhancing the developer experience of the Internet Computer platform. We learned so much throughout these sessions, but here are the key takeaways:</p><ul><li>Our objective is to deliver the best developer experience possible - to continuously improve and remove obstacles from the journey of ideation to launch on ICP.</li><li>We need the ability to ascertain what the majority of developers need right now.</li></ul><p>The community has asked to have a single place to provide this level of input, and for us, this input helps prioritize what we work on to maximize the value developers get out of ICP.</p><p>Introducing the Feedback Board. This is a place for you as developers to request the features and functionality you want to see land.</p><p><img loading="lazy" alt="Feedback Board" src="/assets/images/feedback_board_2-77aa06947d8b7155ccdedc958f92c1b1.jpg" width="2107" height="1795" class="img_ev3q"></p><p>The Feedback Board allows you to describe what you want and submit that directly to us. Other members of the developer community can see what you have added and upvote if they want to see it land too.</p><p>We have established an internal developer experience focus group whose mission is to triage these requests and address them - to bring them to life in the tools, libraries and frameworks you use everyday.
Now, instead of scattering feedback across a multitude of channels, you’ll have a single place to provide your wishlist and influence the features we focus on more directly.
We’ll be focusing mostly on developer experience related work items that can be accomplished in the short to medium term. This is not replacing NNS motion proposals of course, but it’s still an effective way to influence our roadmap on big ticket items as well.
Oh, and by the way, it’s 100% onchain, written in Motoko, and deployed on ICP. We will also open source the code so you can fork it and use it as an example template. We think it makes a pretty good one.</p><p>Up to now, the community didn’t have an effective, organized channel to provide feedback. That has changed.</p><p>You can visit <a href="https://dx.internetcomputer.org" target="_blank" rel="noopener noreferrer">https://dx.internetcomputer.org</a> today and start voting on the issues you want us to prioritize. And if what you want isn’t listed, submit your own issue in the form of a bug report or request for new functionality. We will review each and every submission. We want to ensure that your experience using the Internet Computer is the best it can be.</p><p>With that, thank you for reading, and looking forward to your feedback!</p><p>P.S. Big thank you to Ryan Vandersmith and Matthew Hammer for bringing this to life.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="buidl-hackathon">BUIDL Hackathon<a href="#buidl-hackathon" class="hash-link" aria-label="Direct link to BUIDL Hackathon" title="Direct link to BUIDL Hackathon">​</a></h2><p><img loading="lazy" alt="BUIDL Board" src="/assets/images/buidl_hackathon-ff0f4a4e970c0b45542d91f6c1b0c541.webp" width="1400" height="700" class="img_ev3q"></p><p>We are excited to announce the Internet Computer BUIDL Bitcoin Hackathon powered by Encode, a four-week online hack designed to empower developers to explore and build on the Internet Computer network. This unique Hackathon offers a fantastic opportunity for hackers worldwide to learn, collaborate, and create groundbreaking projects. With an array of prizes up for grabs, this programme is the perfect chance for both teams and individuals to showcase their talents and make a lasting impact in the web3 space.</p><p>You can read more about the hackathon, including how to sign up, <a href="https://medium.com/encode-club/announcing-the-internet-computer-buidl-bitcoin-hackathon-powered-by-encode-register-now-776398ff1bc2" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="until-next-time">Until next time<a href="#until-next-time" class="hash-link" aria-label="Direct link to Until next time" title="Direct link to Until next time">​</a></h2><p>That's all for now. We'll see you next week with some Motoko updates. Keep exploring, and stay tuned for more!</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update April 17, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/04/17/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/04/17/news-and-updates/update"/>
        <updated>2023-04-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we're excited to discuss a new Hackathon and Candid QoL improvements! If you want to come together with other community members and build Bitcoin based projects on ICP, then keep reading!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Motoko" src="/assets/images/flying-ghost-394098c3c8bbd86bb8572ddbae9f12e9.webp" width="1600" height="900" class="img_ev3q"></p><p>Hey Motoko developers! 👋</p><p>Welcome back to the latest Motoko update post!</p><p>If you happened to miss our previous update, you can catch up <a href="https://forum.dfinity.org/t/enhanced-stable-memory-and-certification-libraries-motoko-update-part-10/19262" target="_blank" rel="noopener noreferrer">here</a>. We discussed recent progress on the stable regions feature and the recently released Motoko certification library.</p><p>Today, we're excited to discuss a new Hackathon and Candid QoL improvements! If you want to come together with other community members and build Bitcoin based projects on ICP, then keep reading!</p><p><img loading="lazy" alt="Motoko" src="/assets/images/buidl-flyer-f46ff3b53d6840ccd341644555dd6881.webp" width="1078" height="832" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bitcoin-x-ic-hackathon-buidl-bitcoin">Bitcoin x IC Hackathon: BUIDL Bitcoin!<a href="#bitcoin-x-ic-hackathon-buidl-bitcoin" class="hash-link" aria-label="Direct link to Bitcoin x IC Hackathon: BUIDL Bitcoin!" title="Direct link to Bitcoin x IC Hackathon: BUIDL Bitcoin!">​</a></h2><p>There’s a new Hackathon happening, brought to you by Encode Club. This is a chance to build really cool Bitcoin related projects on ICP using the newly fully released ckBTC feature! They also have a Blue Skies track for non-bitcoin related projects.</p><p>The Hackathon lasts about a month and will offer various prizes based on placings. Check out the official announcement from Encode Club at this link:
<a href="https://medium.com/encode-club/announcing-the-internet-computer-buidl-bitcoin-hackathon-powered-by-encode-register-now-776398ff1bc2" target="_blank" rel="noopener noreferrer">https://medium.com/encode-club/announcing-the-internet-computer-buidl-bitcoin-hackathon-powered-by-encode-register-now-776398ff1bc2</a></p><p>And you can register here either as an individual or as a group of devs!
<a href="https://www.encode.club/internet-computer" target="_blank" rel="noopener noreferrer">https://www.encode.club/internet-computer</a></p><p><img loading="lazy" alt="Motoko" src="/assets/images/candid-autoformatting-777e3d80ecf90aa1f5e71b878ea42f20.webp" width="982" height="1092" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="candid-with-auto-formatting-and-syntax-highlighting">Candid with auto-formatting and syntax highlighting!<a href="#candid-with-auto-formatting-and-syntax-highlighting" class="hash-link" aria-label="Direct link to Candid with auto-formatting and syntax highlighting!" title="Direct link to Candid with auto-formatting and syntax highlighting!">​</a></h2><p>If you guys hadn’t already noticed, the VSCode extension now has auto-formatting and syntax highlighting for Candid files! We hope this quality of life feature will boost your guys’ productivity as we continue to build out the tooling ecosystem for Motoko and ICP!</p><p>Let us know if you run into any bugs or have any feedback!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="till-next-time">Till next time!<a href="#till-next-time" class="hash-link" aria-label="Direct link to Till next time!" title="Direct link to Till next time!">​</a></h2><p>Keep building, and stay tuned for more updates!</p><p>– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update April 3, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/04/03/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/04/03/news-and-updates/update"/>
        <updated>2023-04-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we’re excited to discuss Motoko’s new Stable Regions and a new ICP Certification library! If you want to weigh in on the direction of stable memory developments in Motoko or checkout a new certification library, then keep reading.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" src="https://lh6.googleusercontent.com/oXZMmHoSuaIlOCVxpJZROCnpevVBA57VY9lKjl59bixEvpNtNJm_D0ZszNsam2dcAgI_cb2E9_jbcNQ2ZNZjKoWBlsG3z3wII0-abpK1x36pvl2tg4P0g0ovGZG-toDY3QVnmuk2FNpWyAdQzrOezWI" alt="|624x477" class="img_ev3q"></p><p>Hey Motoko developers! 👋</p><p>Welcome back to the latest Motoko update post!
If you happened to miss our previous update you can find the post <a href="https://forum.dfinity.org/t/motoko-update-part-9-threshold-canister-benchmark-insights/19040" target="_blank" rel="noopener noreferrer">here</a>. Last time we discussed performance benchmarking of Motoko and the recently released threshold canister.
Today, we’re excited to discuss Motoko’s new stable regions and a new ICP certification library! If you want to weigh in on the direction of stable memory developments in Motoko or checkout a new certification library, then keep reading.</p><p><img loading="lazy" src="https://lh4.googleusercontent.com/Vbnd4HtSiYn0O7WBhOa59ids6A9e6wkrWtvwuuET2gw_wQAsop88oZDaE5Lt74JzhugaGkNND-DE4aZrKnuMy7o4AeU5mUXR7J7uJM9nPiHgMpbhisoe1P3nSaNmPBvTqSQpNOSOD1lf2y1ajd09xXA" alt="|624x416" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="page-allocators-revamped-stable-regions">Page allocators revamped: stable regions!<a href="#page-allocators-revamped-stable-regions" class="hash-link" aria-label="Direct link to Page allocators revamped: stable regions!" title="Direct link to Page allocators revamped: stable regions!">​</a></h2><p>@matthewhammer on the languages team has been hard at work on a new feature for Motoko called stable regions. The idea behind this idea (previously called the page allocator) is to allow users to request access to regions of stable memory that are isolated from each other. While this feature will certainly unlock a lot of use cases, one obvious impact of this will be the ability to create stable data structures in Motoko that stores its data in stable memory (think stable maps, buffers, etc.).</p><p>Checkout Matthew’s forum post <a href="https://forum.dfinity.org/t/motoko-stable-regions/19182" target="_blank" rel="noopener noreferrer">here</a> for more details. And let us know in the comments if you have any questions about the design of this feature as well as any feedback you want to give now to help direct the direction of the development!</p><p><img loading="lazy" src="https://lh6.googleusercontent.com/xYdDzoqUt6opykk-gimH-1hbBx11BOJE0ZpciwcZHljpQ9dsow8F3h_DXgiC1GKVCC71l1H2eLhAFFffPyF-6US9tqWVcSsWG3zrKEU6c9sIQfsd4YKUHK1MyOSjxmHI0VP2FIDoqNFIThJjmJ4clkA" alt="|274x356" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ic-certification-a-new-certification-library-in-motoko"><code>ic-certification</code>: a new certification library in Motoko<a href="#ic-certification-a-new-certification-library-in-motoko" class="hash-link" aria-label="Direct link to ic-certification-a-new-certification-library-in-motoko" title="Direct link to ic-certification-a-new-certification-library-in-motoko">​</a></h2><p>Thanks to work by @nomeata, we now have a new certification library called <a href="https://mops.one/ic-certification" target="_blank" rel="noopener noreferrer"><code>ic-certification</code></a>!
The <code>ic-certification</code> Motoko library implements the Internet Computer’s “certification tree” data structure that underlies the certified assets mechanism, used to validate HTTP response from canisters and protect them against malicious nodes. It also underlies the canister signatures mechanism, used to let canisters such as the Internet Identity sign requests to the Internet Computer, and can be used to implement application-specific certification of query responses.
The development was funded by an icdevs.org bug bounty.
Check out the library at the mops link above, and send over any feedback you might have to @nomeata!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="till-next-time">Till next time!<a href="#till-next-time" class="hash-link" aria-label="Direct link to Till next time!" title="Direct link to Till next time!">​</a></h2><p>Keep exploring, and see you guys in two weeks!
– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 31, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/03/31/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/03/31/news-and-updates/update"/>
        <updated>2023-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Q1 comes to a close today, and with it, many weeks of challenging work on our developer tooling. Let's take a look back at everything we shipped this quarter.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" src="https://images.unsplash.com/photo-1506361397175-641e79c74c23?ixlib=rb-4.0.3&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=2940&amp;q=80" alt="Motoko" class="img_ev3q"></p><p>Hello devs! 👋</p><p>And welcome to this week's edition of developer weekly, where we share some bits about what's
new with Internet Computer.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="quarter-in-review">Quarter in review<a href="#quarter-in-review" class="hash-link" aria-label="Direct link to Quarter in review" title="Direct link to Quarter in review">​</a></h2><p>Q1 comes to a close today, and with it, many weeks of challenging (but rewarding) work on our developer tooling.
Let's take a look back at everything we shipped this quarter.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="asset-canister">Asset canister<a href="#asset-canister" class="hash-link" aria-label="Direct link to Asset canister" title="Direct link to Asset canister">​</a></h3><p>The asset canister got some upgrades (no pun intended). We added an ACL with more granularity over who can
upload assets, who can commit them, and who can't.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="sns">SNS<a href="#sns" class="hash-link" aria-label="Direct link to SNS" title="Direct link to SNS">​</a></h3><p>You might have seen OpenChat launch the first SNS-controlled dApp on Internet Computer. An amazing feat, made possible
by the great collaborative work of several cross-functional teams: NNS, SDK, Research, GIX, and more. Bravo to all
parties involved.</p><p>dfx shipped some new SNS-related features to help run and test an SNS launch locally before doing the real thing. We
have a number of improvements to the process in the works, but you can try it out today with dfx version 0.13.1</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-galore">Bug fixes galore<a href="#bug-fixes-galore" class="hash-link" aria-label="Direct link to Bug fixes galore" title="Direct link to Bug fixes galore">​</a></h3><p>We also fixed a bunch of stubborn bugs to make your experience using our command line tools that much better. We will
continue to prioritize bugs as we go into the next quarter, so keep an eye out for new releases of dfx.</p><p>See the <a href="https://github.com/dfinity/sdk/releases/tag/0.13.0" target="_blank" rel="noopener noreferrer">release notes</a> for everything that went into the latest release of dfx.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="looking-ahead">Looking ahead<a href="#looking-ahead" class="hash-link" aria-label="Direct link to Looking ahead" title="Direct link to Looking ahead">​</a></h2><p>Q2 will bring us a refined focus on developer experience. We will be taking a holistic look at the ICP stack and applying
fundamentals of user experience research to help us understand how we can better improve our tools and services for you.</p><p>Of course, there is no magic bullet, and this will be an ongoing, iterative process. But we are really excited to dive in to the next quarter with a renewed focus on
developer experience. We're confident this will give us the ability to ship tools that bring you joy and excitement as you build on Internet Computer.</p><p>We will also be starting work on a few new features to be excited about, although they won't land until after Q2. For
the next quarter specifically, we'll be focusing mostly on bug fixes and developer experience improvements.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="until-next-time">Until next time<a href="#until-next-time" class="hash-link" aria-label="Direct link to Until next time" title="Direct link to Until next time">​</a></h2><p>That's all for now. We'll see you in Q2! Keep exploring, and stay tuned for more updates!</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Features]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/features"/>
        <updated>2023-03-24T16:23:17.000Z</updated>
        <summary type="html"><![CDATA[Updates about features being developed on ICP]]></summary>
        <content type="html"><![CDATA[<p>Here you will find updates about the ongoing development of features on ICP. You can see what is currently in development by looking at</p><ul><li>The <a href="https://internetcomputer.org/roadmap/" target="_blank" rel="noopener noreferrer">roadmap page on the website</a></li><li>The <a href="https://forum.dfinity.org/c/roadmap/29" target="_blank" rel="noopener noreferrer">roadmap tag on the forum</a> - this is a great place to see discussions as they develop</li><li><a href="https://youtube.com/playlist?list=PLuhDt1vhGcrdQu9Hw8eLDV9OTZXE5lklI" target="_blank" rel="noopener noreferrer">Community conversations playlist</a> on Youtube</li></ul><p>If there's anything that you'd like to know more about, don't hesitate to reach out on the <a href="https://forum.dfinity.org/" target="_blank" rel="noopener noreferrer">forum</a>, or at our <a href="https://twitter.com/DFINITYDev" target="_blank" rel="noopener noreferrer">dev account on twitter</a>.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update March 21, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/03/21/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/03/21/news-and-updates/update"/>
        <updated>2023-03-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we're excited to delve into a newly released threshold canister and some fascinating benchmarking reports!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Motoko" src="/assets/images/motoko-logo-white-f70d2310a2e1e93425958b8ed3d9092f.webp" width="1280" height="920" class="img_ev3q"></p><p>Hello Motoko devs! 👋</p><p>Welcome back to the latest Motoko update post, where we have some engaging news to share with you!</p><p>If you happened to miss our previous update, don't worry, you can catch
up <a href="https://forum.dfinity.org/t/new-let-binding-and-serialization-improvements-motoko-updates/18850" target="_blank" rel="noopener noreferrer">here</a>. We discussed
the innovative <code>let-else</code> binding and significant improvements to Candid deserialization.</p><p>Today, we're excited to delve into a newly released threshold canister and some fascinating benchmarking reports!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-threshold-canister-open-source-and-ready-to-go">Motoko threshold canister: open-source and ready to go!<a href="#motoko-threshold-canister-open-source-and-ready-to-go" class="hash-link" aria-label="Direct link to Motoko threshold canister: open-source and ready to go!" title="Direct link to Motoko threshold canister: open-source and ready to go!">​</a></h2><p><img loading="lazy" alt="Motoko" src="/assets/images/voting-28b71b2ed85cabe58332b295b30630af.webp" width="484" height="356" class="img_ev3q"></p><p>We're thrilled to announce that the <a href="https://github.com/dfinity/threshold" target="_blank" rel="noopener noreferrer">threshold canister</a> is now open-source and
available for your projects! This powerful canister enables groups of principals to make democratic decisions with ease.
Participants can submit proposals to execute calls based on desired behavior, provided the proposal garners a specific
threshold of votes.</p><p>In a real-world application, the threshold canister is already streamlining DFINITY's vote delegation in the recently
decentralized OpenChat SNS to individuals within the DFINITY Foundation. This approach not only further decentralizes
voting power but also ensures the loss or incapacitation of a single individual won't result in the loss of voting power
for the entire foundation. With the canister now open-source, your organization can benefit from the same delegation
capabilities!</p><p>Composed of a mere 200 lines of Motoko, this canister exemplifies the unique advantage of Motoko for crafting concise
and robust code. Feel free to adopt a shared threshold voting scheme for your use case by deploying with an initial
signers list. We welcome any feedback you have on this canister in the public repository.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="canister-profiling-uncover-the-secrets-of-icp-canister-performance">Canister-profiling: uncover the secrets of ICP canister performance<a href="#canister-profiling-uncover-the-secrets-of-icp-canister-performance" class="hash-link" aria-label="Direct link to Canister-profiling: uncover the secrets of ICP canister performance" title="Direct link to Canister-profiling: uncover the secrets of ICP canister performance">​</a></h2><p><img loading="lazy" alt="Motoko" src="/assets/images/race-track-59ec86fcb7a19457d019bc4b8f1b9a5c.webp" width="1024" height="1024" class="img_ev3q"></p><p>Eager to compare data structure performance on ICP, or perhaps the performance of entire languages or canisters? Look
no further than our <a href="https://github.com/dfinity/canister-profiling" target="_blank" rel="noopener noreferrer">canister-profiling</a> repository.</p><p>There, you'll find cycle usage per benchmark (linked under the "Performance" section of the README). Additionally,
performance reports feature links to flamegraphs that provide detailed visualizations of where your cycles are being
spent. Take a look at this example graph for a toy DAO we use to obtain benchmark scores:
<img loading="lazy" alt="Motoko" src="/assets/images/canister-profiling-09b6aed9668f532b8d98fdaf886fa5a4.webp" width="2052" height="656" class="img_ev3q"></p><p>These benchmarks apply not just to Motoko, but to any canister, including those written in Rust.</p><p>Feel free to submit <a href="https://github.com/dfinity/canister-profiling/pulls" target="_blank" rel="noopener noreferrer">PRs</a> containing custom benchmarks to utilize
this powerful tool for your own canister development.</p><p>As always, we value your feedback on our tools, so please file GitHub issues for any requests. Thank you!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="till-next-time">Till next time!<a href="#till-next-time" class="hash-link" aria-label="Direct link to Till next time!" title="Direct link to Till next time!">​</a></h2><p>Keep exploring, and stay tuned for more updates!</p><p>– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update March 13, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/03/13/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/03/13/news-and-updates/update"/>
        <updated>2023-03-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today we'll show you how to migrate your identity so you can take advantage of the new keyring functionality!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="|624x351" src="/assets/images/Decentralized_01-8dc243a4b4dc38ae649f3261ffd84f63.jpg" width="2400" height="1000" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-to-migrate-existing-identities-to-use-keyring">How to migrate existing identities to use keyring<a href="#how-to-migrate-existing-identities-to-use-keyring" class="hash-link" aria-label="Direct link to How to migrate existing identities to use keyring" title="Direct link to How to migrate existing identities to use keyring">​</a></h2><p><img loading="lazy" src="https://images.unsplash.com/photo-1649323357445-bcca3bb9ea3b?ixlib=rb-4.0.3&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=2670&amp;q=80" class="img_ev3q"></p><p>dfx now comes with OS keyring support. This means you don't have to constantly type in your password to decrypt your
identity. If you have existing encrypted identities that you'd like to port over, here is how to do it. This is available
in dfx version <code>0.13.0</code> and later.</p><p>Export your identity to pem file:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx --identity [identity you want to migrate] identity export -&gt; my_plaintext_pem_file.pem</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Import the same identity and give it a different name. By default, keyring will be used:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx identity import [placeholder_name] my_plaintext_pem_file.pem</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Tell dfx to use this identity:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx identity use [placeholder_name]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Now you should test that the newly migrated identity works.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="cleanup">Cleanup<a href="#cleanup" class="hash-link" aria-label="Direct link to Cleanup" title="Direct link to Cleanup">​</a></h3><p>Remove the previous identity:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx identity remove [previous identity name]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Give your new identity a name that you'd like to stick with:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx identity rename [placeholder_name] [final name]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="final-notes">Final notes<a href="#final-notes" class="hash-link" aria-label="Direct link to Final notes" title="Direct link to Final notes">​</a></h3><p>Please test this with a non-critical identity first - this should be tested, but for critical identities you should also
verify this before deleting anything
The identity’s pem file will be stored on disk in plaintext. Take any necessary precautions so you can (temporarily)
trust that file system
If you want to go the truly safe route that doesn’t ever write plaintext to disk:</p><ul><li>Create a new identity (<code>dfx identity new</code>).</li><li>Add that identity’s principal everywhere as a controller (<code>dfx canister update-settings --add-controller [principal]</code>).</li><li>If necessary, also add the principal to other lists like e.g. the asset canister’s allowlist (<code>dfx canister
call [frontend canister] grant_permission “(record { to_principal=principal \“[principal]\“; permission = variant {
Commit }; })“</code>).</li><li>Test that your new identity works as expected.</li><li>Delete the previous identity (dfx identity remove).</li></ul><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-github-search-and-code-view">New GitHub search and code view<a href="#new-github-search-and-code-view" class="hash-link" aria-label="Direct link to New GitHub search and code view" title="Direct link to New GitHub search and code view">​</a></h2><p><img loading="lazy" alt="|624x351" src="/assets/images/github_search_code_view-348090dfb47a656b18b54443d6f7c691.png" width="3256" height="2080" class="img_ev3q"></p><p>GitHub released a new search and code view, and it looks great! Here is how to enable it:
<a href="https://docs.github.com/en/repositories/working-with-files/managing-files/navigating-files-with-the-new-code-view" target="_blank" rel="noopener noreferrer">https://docs.github.com/en/repositories/working-with-files/managing-files/navigating-files-with-the-new-code-view</a></p><p>That's all for this now. See you next week!</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update March 6, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/03/06/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/03/06/news-and-updates/update"/>
        <updated>2023-03-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today we'll be talking about a new `let-else` binding and improved deserialization in Candid!]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="|624x351" src="/assets/images/motoko_dash-3185d6bf59e17f3c30b99939309c5d85.jpeg" width="1600" height="900" class="img_ev3q"></p><p>Hi Motoko devs!</p><p>Welcome to the latest Motoko update post.</p><p>If you missed the last update post from the Motoko team, check it out <a href="https://forum.dfinity.org/t/generational-gc-and-vscode-performance-improvement-motoko-updates/18617" target="_blank" rel="noopener noreferrer">here</a>! Last time we talked about a generational GC <a href="https://youtu.be/hJyFmX__ZGw?t=3765" target="_blank" rel="noopener noreferrer">demo</a> and performance optimizations for our VSCode Extension.</p><p>Today we'll be talking about a new <code>let-else</code> binding and improved deserialization in Candid!</p><p><img loading="lazy" alt="|624x55" src="/assets/images/code-fd8911335a9f5042dc43748397903b3c.png" width="1064" height="94" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-language-feature-let-else-binding">New language feature: <code>let-else</code> binding!<a href="#new-language-feature-let-else-binding" class="hash-link" aria-label="Direct link to new-language-feature-let-else-binding" title="Direct link to new-language-feature-let-else-binding">​</a></h2><p>There is a new <code>let</code> binding known as the <code>let-else</code> binding! <code>let-else</code> works similarly to the usual <code>let</code> binding, except there is an <code>else</code> block that gets executed in case of a pattern match failure.</p><p>E.g. assuming foo() returns type <code>?Nat</code></p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">let ?x = foo() else { Debug.print "foo failed"; return };</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>If foo() returns <code>null</code>, <code>null</code> doesn't match the pattern <code>?x</code>, and so "foo failed" is printed and execution returns out of the current function. Otherwise, the <code>Nat</code> is bound to <code>x</code> and execution continues forward.</p><p>This can be really useful to avoid deeply nested <code>switch</code> statements, such as the following:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">switch (foo()) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  case (?x) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    switch (bar()) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      case (?y) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        switch (baz()) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          case (?z) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            return #ok x + y + z;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          case null {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            return #err "baz failed";</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        } </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      case null {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        return #err "bar failed";</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  case null {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    return #err "foo failed with";</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>With <code>let-else</code> bindings, you get the following:</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">let ?x = foo() else { return #err "foo failed" };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">let ?y = bar() else { return #err "bar failed" };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">let ?z = baz() else { return #err "baz failed" };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">return #ok x + y + x</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>This feature was inspired by the same feature in <a href="https://rust-lang.github.io/rfcs/3137-let-else.html" target="_blank" rel="noopener noreferrer">rust</a>.</p><p>See the PR and more details <a href="https://github.com/dfinity/motoko/pull/3817" target="_blank" rel="noopener noreferrer">here</a>. You can find this feature in version <code>0.8.3</code> of <code>moc</code>.</p><p>Please let us know your experience working with this binding!</p><p><img loading="lazy" alt="|328x240" src="/assets/images/stack_with_motoko-bf85ec12c041f2084d31e1c5f0d5028a.png" width="470" height="345" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="improved-candid-serialization-and-deserialization">Improved Candid serialization and deserialization<a href="#improved-candid-serialization-and-deserialization" class="hash-link" aria-label="Direct link to Improved Candid serialization and deserialization" title="Direct link to Improved Candid serialization and deserialization">​</a></h2><p>Before, it was possible that you could serialize a Motoko value to Candid, but deserializing that encoded value back to Motoko would fail with a trap. It turns out that this was due to the stack consumption of Candid decoding being greater than the stack consumption of Candid encoding, especially when decoding deeply nested, recursive values such as lists. Although Candid related, the problem could also prevent upgrades, since the current stable variable format is based on Candid. Luckily, we managed to diagnose and fix the issue (a premature stack overflow) by putting the Candid decoder on a stack diet. While not a cure-all, our fix should prevent other surprising failures in the future.</p><p>See details for this <a href="https://github.com/dfinity/motoko/pull/3809" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="till-next-time">Till next time!<a href="#till-next-time" class="hash-link" aria-label="Direct link to Till next time!" title="Direct link to Till next time!">​</a></h2><p>– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer news and updates]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates"/>
        <updated>2023-02-22T23:11:37.000Z</updated>
        <summary type="html"><![CDATA[News & Updates - Internet Computer developer blog]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the Internet Computer developer blog! Here, you'll find out about new features, new use cases for existing
features, deep dives into the design and engineering work that goes into ICP, and other things in the dev
world we find interesting enough to share.</p><p>Enjoy!</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update February 20, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/02/20/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/02/20/news-and-updates/update"/>
        <updated>2023-02-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today we’ll be talking about incremental garbage collection, and VSCode extension performance improvements! Bonus section about using GitHub copilot/GPT3 with Motoko.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Header image" src="/assets/images/motoko-3-7227f4b58e552d13aaa24439d6bfba30.png" width="1366" height="762" class="img_ev3q"></p><p>Hey Motoko devs!</p><p>It’s time for a new Motoko update post!</p><p>If you missed the last update post from the languages team, check it
out <a href="https://forum.dfinity.org/t/new-candid-version-and-catching-send-failures-motoko-updates/18410" target="_blank" rel="noopener noreferrer">here</a>! Last time we
talked about catching errors on message sends, and a new version of Candid.</p><p>Today we’ll be talking about incremental garbage collection, and VSCode extension performance improvements! Bonus
section about using GitHub copilot/GPT3 with Motoko.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="incremental-gc-presentation-at-global-rd">Incremental GC: presentation at global R&amp;D!<a href="#incremental-gc-presentation-at-global-rd" class="hash-link" aria-label="Direct link to Incremental GC: presentation at global R&amp;D!" title="Direct link to Incremental GC: presentation at global R&amp;D!">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/garbage-truck-50b50b7ea7bbc7e6fdbfbe004a765d82.png" width="1373" height="702" class="img_ev3q"></p><p>@FIXMETAGLUC has been hard at work over the past many months putting together a new garbage collector for Motoko. This
incremental GC is designed to alleviate <a href="https://learn.internetcomputer.org/hc/en-us/articles/34576974172692-Evolution-Scaling" target="_blank" rel="noopener noreferrer">scalability</a> issues with the language by more eagerly collecting unused objects,
and avoiding runs of the GC that fully sweep the heap.</p><p>And tomorrow, Luc will be presenting on this project live at this month’s public global R&amp;D presentation!</p><p>When: February 22, 2023 / 17:30 CET / 8:30 PDT
Where:
<a href="https://dfinity.us16.list-manage.com/track/click?u=33c727489e01ff5b6e1fb6cc6&amp;id=ce77db3b84&amp;e=8cf7869fe3" target="_blank" rel="noopener noreferrer">https://dfinity.us16.list-manage.com/track/click?u=33c727489e01ff5b6e1fb6cc6&amp;id=ce77db3b84&amp;e=8cf7869fe3</a></p><p>Register at the link above if you haven’t already! Also, this meeting will be recorded and posted on our YouTune channel
in case you can’t make the live presentation.</p><p><a href="https://www.youtube.com/@DFINITY" target="_blank" rel="noopener noreferrer">https://www.youtube.com/@DFINITY</a></p><p>If you want to see detailed discussion about this feature, checkout the
PR <a href="https://github.com/dfinity/motoko/pull/3756" target="_blank" rel="noopener noreferrer">here</a>.</p><p>See you guys tomorrow!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="vscode-extension-optimizations">VSCode extension optimizations<a href="#vscode-extension-optimizations" class="hash-link" aria-label="Direct link to VSCode extension optimizations" title="Direct link to VSCode extension optimizations">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/looneytunes-6dbfda8bb6ed8f33eafe5b35d22cd742.png" width="976" height="558" class="img_ev3q"></p><p>The VSCode extension now runs about 10x - 100x faster on large Motoko projects!</p><p>The performance improvements come from smarter selections of which files to type check. Instead of type-checking every
file in the workspace, the extension now only checks open files and dfx.json canister entry points (along with all
imported files). This was also layered with other optimizations (such as caching diagnostics) to reduce the amount of
messages being passed between VS Code and the language server for large projects.</p><p>This optimization is released as an experimental feature, so please let us know if you run into any bugs!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bonus-github-copilot-x-motoko">Bonus: GitHub Copilot x Motoko<a href="#bonus-github-copilot-x-motoko" class="hash-link" aria-label="Direct link to Bonus: GitHub Copilot x Motoko" title="Direct link to Bonus: GitHub Copilot x Motoko">​</a></h2><p>Recently, I’ve been playing around with GitHub’s generative AI coding tool called GitHub Copilot, at the suggestion of
@FIXMEKYLE. The tool is a wrapper around GPT3, a predecessor model to the recently famous ChatGPT. As you type code,
Copilot will anticipate your intentions, and non-intrusively suggest syntax that you can seamlessly accept or reject as
you work. I’ve found it to be very useful in increasing my development speed, even with a new language such as Motoko,
for which the model would presumably have little training data. I thought I’d share my experience here in case you guys
find it useful as well.</p><p>Find the tool here: <a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer">https://github.com/features/copilot</a></p><p>Note that for non-open source projects, it seems that the tool may be collecting data on your repository/code so please
consider this before using the tool.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="till-next-time">Till next time!<a href="#till-next-time" class="hash-link" aria-label="Direct link to Till next time!" title="Direct link to Till next time!">​</a></h2><p>– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update February 13, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/02/13/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/02/13/news-and-updates/update"/>
        <updated>2023-02-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Welcome to this week’s edition of developer weekly, where we give you the lowdown on new tools and features we’re shipping, new use cases for existing features, and other news and content we found interesting over the past week.]]></summary>
        <content type="html"><![CDATA[<p>Hello devs! Welcome to this week’s edition of developer weekly, where we give you the lowdown on new tools and features
we’re shipping, new use cases for existing features, and other news and content we found interesting over the past week.</p><h1>Quill has a new home</h1><p><img loading="lazy" alt="Header image" src="/assets/images/quill-c3338b00b3d824812938591c83476be3.png" width="1492" height="1006" class="img_ev3q"></p><p>Quill is a minimalistic ledger and governance toolkit for cold wallets. With Quill, you can generate signed messages
using self-custody keys that can be stored on an air-gapped device. Those messages can then be transferred to a machine
with network access where they can be sent to the Internet Computer.
Previously, we had several forks of quill that served specific use cases. We have made it easier to access all the
commands you need in one place. Repos like sns-quill and other internal forks have now been consolidated into Quill.
You can download quill by visiting the releases page.</p><h1>Redeploying a canister</h1><p><img loading="lazy" alt="Header image" src="/assets/images/broken-car-3ee1fbb0f05d02b8c09fe6cc67c36cb4.png" width="1502" height="1000" class="img_ev3q"></p><p>If your canister has ever trapped during an upgrade, we realize that can be a pretty frustrating experience. Luckily,
there is a way out.
The first thing you can try is uninstalling your canister code. This will delete the WASM from your canister and leave
it in an empty state. Note - your canister will not be accessible by your users once the WASM has been uninstalled, so
if you need high uptime, this approach might not be the best for you.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx canister uninstall-code [CANISTER NAME or ID]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Of course, use your canister’s actual name or ID when issuing this command.</p><p>Once your canister code has been uninstalled, try redeploying. This will build your WASM from source and deploy it into
your empty canister.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dfx deploy --upgrade-unchanged [CANISTER NAME or ID]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Using the <code>--upgrade-unchanged</code> flag will force DFX to install your canister WASM and skip checks that compare your new
WASM to the old one.</p><blockquote><p>When upgrading a canister, <code>dfx deploy</code> and <code>dfx canister install</code> skip installing the .wasm
if the wasm hash did not change. This avoids a round trip through stable memory for all
assets on every dfx deploy, for example. By passing this argument, dfx will instead
install the wasm even if its hash matches the already-installed wasm.</p></blockquote><p>We hope this bit of troubleshooting helps you as you build on the Internet Computer!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="chatgpt-getting-weird">ChatGPT getting weird<a href="#chatgpt-getting-weird" class="hash-link" aria-label="Direct link to ChatGPT getting weird" title="Direct link to ChatGPT getting weird">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/chatgpt-8ae6952ff1f63d34be2df10e4133c692.png" width="1505" height="998" class="img_ev3q"></p><p>In an eerie New York Times article, columnist Kevin Roose has a conversation with the chatbot integrated into the new
Bing search engine, powered by OpenAI’s ChatGPT.
For those of you who don’t know, ChatGPT is a language model developed by OpenAI. Essentially, it is a computer program
that has been trained on a large dataset of human language, such as books, articles, and web pages. Through this
training, ChatGPT has learned to understand and generate human-like language, and can now be used to interact with
humans through written text, like a chatbot.</p><p>Microsoft has been developing a partnership with OpenAI for sometime and has recently integrated this model into their
Bing search engine. Bing now comes with a chat feature where you can interact with the search engine in a conversational
manner.</p><p>Kevin Roose spent a couple of hours with the chatbot and in a turn of events, managed to get the model to generate very
strange responses, and ultimately, declare its love for him. I won’t spoil the read for you.</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update February 6, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/02/06/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/02/06/news-and-updates/update"/>
        <updated>2023-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today we’ll be talking about a new language feature that lets you catch send errors, and a beta release of Candid! Bonus section about a podcast on designing languages for smart contract development.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Header image" src="/assets/images/motoko-sentinel-82a46015fab67368cc4a0241c607fc24.png" width="1374" height="571" class="img_ev3q"></p><p>Hi Motoko devs!</p><p>Welcome to the latest Motoko update post. Note that we will be making these posts on a biweekly schedule going forward.</p><p>If you missed the last update post from the Motoko team, check it
out <a href="https://forum.dfinity.org/t/motoko-package-management-and-code-blocks-weekly-motoko-updates/18142" target="_blank" rel="noopener noreferrer">here</a>! Last time
we talked about ongoing efforts with improving package management in the Motoko ecosystem, and a review of code blocks
as a language feature.</p><p>Today we’ll be talking about a new language feature that lets you catch send errors, and a beta release of Candid! Bonus
section about a podcast on designing languages for smart contract development.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="catch-your-errors-from-message-sends-motoko-080">Catch your errors from message sends: Motoko 0.8.0!<a href="#catch-your-errors-from-message-sends-motoko-080" class="hash-link" aria-label="Direct link to Catch your errors from message sends: Motoko 0.8.0!" title="Direct link to Catch your errors from message sends: Motoko 0.8.0!">​</a></h2><p>Last week, we released a new version of Motoko, including a new language feature that lets you catch message send
failures.</p><p>Previously, when you sent a canister message that failed, your program would trap without giving you a chance to recover
from the failure. These failures can happen from a lack of canister resources, typically because the incoming message
queue for the destination canister is full, or because the calling canister does not have enough cycles to pay for the
call. (There are a few more cases where such an error can occur: see
details <a href="https://github.com/dfinity/motoko/pull/3630" target="_blank" rel="noopener noreferrer">here</a>).</p><p>Instead of trapping, these errors are now thrown as an <code>Error</code>! Specifically, they are thrown with
new <code>ErrorCode #call_error { err_code = n }</code>, where <code>n</code> is the error code returned.</p><p>Thus, these errors can be caught and handled with <code>try catch</code> expressions, letting you recover or gracefully fail from
these messages as you see fit!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-candid-beta-release">New Candid: Beta release<a href="#new-candid-beta-release" class="hash-link" aria-label="Direct link to New Candid: Beta release" title="Direct link to New Candid: Beta release">​</a></h2><p>The languages team also just released a new beta release for Candid! Shoutout to @chenyan for taking point on this
project.</p><p>The new version contains several new features, including some breaking changes:</p><p>First, Candid now lets you decode optional variant types, even if the variant tags are not the same, allowing upgrading
variant types without breaking the client code.</p><p>The deserializer also now only performs subtype checks for reference types, which brings it into full conformity to
Candid spec 1.4. The same spec is also implemented in Motoko version 0.8.0, which we released last week.</p><p>For any Rust developers out there, the Rust Candid implementation also included major improvements, including major
optimizations in deserialization time and canister binary size.</p><p>The beta release is up on <a href="https://crates.io/crates/candid/0.9.0-beta.2" target="_blank" rel="noopener noreferrer">crates.io</a>. Please let us know of any bugs you
come across before the full release!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bonus-a16z-podcast---smart-contract-language-design">Bonus: a16z Podcast - smart contract language design<a href="#bonus-a16z-podcast---smart-contract-language-design" class="hash-link" aria-label="Direct link to Bonus: a16z Podcast - smart contract language design" title="Direct link to Bonus: a16z Podcast - smart contract language design">​</a></h2><p>Last week, there was a podcast episode released by Andreessen Horowitz about designing languages to write smart
contracts: a very relevant topic for this audience!</p><p>You can find it here: <a href="https://open.spotify.com/episode/20pTy6Y344MKNySYJZov27" target="_blank" rel="noopener noreferrer">https://open.spotify.com/episode/20pTy6Y344MKNySYJZov27</a></p><p>The episode talks about the differences in challenges between Web2 and Web3 programming, and how to design languages
that accommodate those differences. Personally, I found it insightful so I thought I’d share it here :) Shoutout to
@diegop for sharing this podcast with our team.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="till-next-time">Till next time!<a href="#till-next-time" class="hash-link" aria-label="Direct link to Till next time!" title="Direct link to Till next time!">​</a></h2><p>– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update January 30, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/01/30/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/01/30/news-and-updates/update"/>
        <updated>2023-01-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Welcome to this week’s edition of Developer Weekly, where we give you the lowdown on new tools and features we’re shipping, new use cases for existing features, and other news and content we found interesting over the past week.]]></summary>
        <content type="html"><![CDATA[<p>Hello devs! Welcome to this week’s edition of developer weekly, where we give you the lowdown on new tools and features
we’re shipping, new use cases for existing features, and other news and content we found interesting over the past week.</p><h1>Developer docs revamp</h1><p>The developer docs website is getting a facelift! We’re making it far easier to find the content you’re looking for and
simplifying a number of tutorials along the way. This will be part of ongoing work to improve all aspects of our
documentation.</p><p>We’ll demo the first round of these changes during next week’s global R&amp;D meeting, so please join us if you’d like to
see the work that went into it. Big shout out to Mikhail Turilin, Severin Siffert, and Akos Olasz for all their great
work!
If there’s any thing you think we missed, please drop us a note and we’ll be sure to add it to our backlog.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="canister-profiling">Canister profiling<a href="#canister-profiling" class="hash-link" aria-label="Direct link to Canister profiling" title="Direct link to Canister profiling">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/candlestick-d4e7f344062cc00a573310c9253c0b75.png" width="1501" height="1000" class="img_ev3q"></p><p>We just open sourced a repo that you can use to run benchmarks to assess your canisters performance. We provided a few
example benchmarks to get you started, but ultimately, we’d like to see how your canisters are doing!
You can clone the repo here and open a PR with your addition. We’re hoping this gives you greater insight into your
canisters’ performance and informs you on how you can fine tune your code to achieve optimal results.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ic0">ic0<a href="#ic0" class="hash-link" aria-label="Direct link to ic0" title="Direct link to ic0">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/balloons-7fed17a1f89e8507e13e707e209def69.png" width="1502" height="1012" class="img_ev3q"></p><p>There’s a new kid on the block - @rvanasa just released a new JavaScript library for interacting with Internet Computer.
From the repository description,
The ic0 package is a simple, straightforward way to interact with canisters running on the Internet Computer.
With ic0 you can instantiate representations of local, dev, or ICP canisters in JS, make calls to them, and evaluate
their responses. You can also create mock canisters for testing or running experiments.
Give it a try and let us know what you think.
<a href="https://github.com/dfinity/node-ic0" target="_blank" rel="noopener noreferrer">https://github.com/dfinity/node-ic0</a>
<a href="https://www.npmjs.com/package/ic0" target="_blank" rel="noopener noreferrer">https://www.npmjs.com/package/ic0</a></p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team spotlight - Boundary Node]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-boundary-node</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/news-and-updates/team-spotlight-boundary-node"/>
        <updated>2023-01-26T14:16:07.000Z</updated>
        <summary type="html"><![CDATA[In this interview, we sat down with the Boundary Node team to talk about what role the ICP boundary nodes play on the network, what functionalities they provide, and how developers benefit from their unique attributes.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Boundary node team spotlight" src="/assets/images/dev-update-blog-bn-0dd3e453465fc803227adad9fb4a8c0f.jpg" width="1400" height="675" class="img_ev3q"></p><p><strong>Hello everyone and welcome to this edition of the team spotlight series! In this interview, we sat down with the Boundary Node team to talk about what role the ICP boundary nodes play on the network, what functionalities they provide, and how developers benefit from their unique attributes.</strong></p><p><strong>For our usual introduction to the team, what would you say the purpose of the Boundary Node team is?</strong></p><p><em>[The purpose of the Boundary Node team is]<!-- --> to provide seamless and reliable access to the Internet Computer.</em></p><p><strong>What is the composition of the Boundary Node team?</strong></p><p><em>We are a team of five: four engineers and a research scientist who doubles as a team lead.</em></p><p><strong>Developers may not be familiar with boundary nodes on ICP, so to provide some context, what is a boundary node? What purpose does a boundary node serve on ICP?</strong></p><p><em>The boundary nodes are the gateway to the Internet Computer. Every single request going to the Internet Computer first reaches one of the boundary nodes. The boundary node routes that request to a replica node in the right subnet, where the target canister is hosted. <!-- -->[Additionally]<!-- -->, the boundary nodes improve the user experience by forming a caching layer for the Internet Computer and provide a first layer of protection by applying rate-limits on certain requests.</em></p><p><em>For more details on the internals of a boundary nodes, take a look at <a href="https://learn.internetcomputer.org/hc/en-us/articles/34212818609684-ICP-Edge-Infrastructure" target="_blank" rel="noopener noreferrer">the Learn Hub page</a>.</em></p><p><strong>How do boundary nodes communicate with ICP subnets?</strong></p><p><em>There are mainly two ways in which the boundary nodes interact with ICP:</em></p><ul><li><p><em>First, the boundary nodes need to fetch all the routing information from the registry in the NNS subnet. This information includes a mapping of canisters to the corresponding subnets and a mapping of subnets to the replica nodes, which they are composed of.</em></p></li><li><p><em>Second, the boundary nodes send all the incoming requests to replicas in the correct subnets, wait for the response and pass it on to the client that originated the request.</em></p></li></ul><p><strong>Are there different types of boundary nodes?</strong></p><p><em>At the moment, there is one type of boundary node that serves two functions: first, it provides the API endpoints according to the <a href="/references/ic-interface-spec#http-interface">interface specification</a> (e.g., /api/v2/status), and second, it provides the HTTPS endpoints for browsers to directly interface with the canisters hosted on ICP (cf. <a href="/references/http-gateway-protocol-spec">HTTP gateway protocol specification</a>). In the very near future, the boundary nodes will be split into two different entities or types: API boundary nodes and HTTPS gateways.</em></p><p><strong>By acting as the gateway to ICP, what additional functionalities do boundary nodes provide to the rest of the network?</strong></p><p><em>The API boundary nodes will serve the API endpoints. They simply route the call to the right replica node. The HTTPS gateways translate the browser requests into ICP API calls and forward them to one of the API boundary nodes. In addition, the HTTPS gateways will provide caching of static assets in order to improve the user experience.</em></p><p><strong>Since the boundary nodes provide such an important core piece of the Internet Computer, I can imagine that there are several different teams that the Boundary Node team works with. What are some of those teams?</strong></p><p><em>We work closest with the Trust team, which is currently working on the service worker (one implementation of the HTTP gateway protocol). The service worker is hosted by the boundary nodes and served from them. Together, we have to coordinate the releases of new boundary node and service worker versions.</em></p><p><em>In addition, we also regularly interface with Platform Ops, who provide the hardware on which the boundary nodes run and the Node team, which is responsible for the base layer of the boundary nodes’ operating system.</em></p><p><strong>Since developers don't directly interact with the boundary nodes, is there anything that developers should know about them to enhance or improve their workflow?</strong></p><p><em>Ideally, the developers should know the boundary nodes exist, but should not have to worry about them. That means we are doing our job by seamlessly and reliably providing access to their dapps hosted on ICP.</em></p><p><em>But maybe one thing we would like developers to be aware of is our custom domains feature, which allows developers to host their dapp under their own domain without the need for any additional infrastructure. For more information, you can check the respective <a href="/building-apps/frontends/custom-domains/using-custom-domains">developer docs</a>.</em></p><p><strong>What is unique about the ICP boundary nodes in comparison to how other chains provide a gateway to their network?</strong></p><p><em>The IC’s unique capability to serve web content directly from canister smart contracts is only possible thanks to the HTTP gateway protocol and the boundary nodes that implement it. This allows users to access dapps directly in their standard browser without having to install any special software (e.g., specific browser or browser plugin).</em></p><p><strong>What’s the biggest challenge the Boundary Node team has faced?</strong></p><p><em>We have faced many challenges so far: we worked hard on automating processes and stabilizing the nodes, we enabled developers to set up already over 300 custom domains for their canisters. However, the biggest challenge is yet to come as we are working on the new boundary architecture that splits today’s boundary nodes into API boundary nodes and HTTPS gateways.</em></p><p><strong>What is the primary project that the Boundary Node team is working on or focused on currently?</strong></p><p>Our main focus is currently on the new boundary node architecture.</p><p><strong>What are the primary components of this project?</strong></p><p><em>This project can be broken down into four main pieces or milestones:</em></p><p><em>1. Building <code>ic-boundary</code>, a custom router for API calls, which will be the core of the upcoming API boundary nodes.</em></p><p><em>2. Putting the API boundary nodes under the management of the NNS.</em></p><p><em>3. Building an API boundary node discovery library that helps ICP clients (e.g., an HTTP gateway or a native application) to discover all existing API boundary nodes and route their traffic to them.</em></p><p><em>4. Building the HTTP gateway.</em></p><p><strong>What are the primary benefits that developers will be able to observe from the completion of this project?</strong></p><p><em>The new architecture fully decentralizes the access to ICP and opens the doors for many additional gateways next to the HTTP gateway (e.g., a Websocket gateway, a DNS gateway, etc.).</em></p><p><strong>When can developers expect the project to be completed?</strong></p><p><em>The project is currently going in full swing. We have completed the main work on <code>ic-boundary</code> and have deployed it to the existing boundary nodes for about a week now. Currently, we are working on everything that is required to put the API boundary nodes under the management of the NNS and to build the discovery library. These two topics will keep the team busy until early 2024. Alongside, we will slowly be starting to work on the HTTP gateway.</em></p><p><strong>Where should developers look for the latest Boundary Node updates?</strong></p><p><em>We regularly post updates on the forum. In addition, we are actively monitoring Discord. If you have any questions or feedback just reach out to us on either platform.</em></p><p><strong>What is one feature or aspect of ICP’s boundary nodes that the team is the most proud of?</strong></p><p><em><code>ic-boundary</code>! We are very proud of our new API call router that replaces a combination of services and custom modules centered around nginx. It is more performant and way simpler to extend and maintain.</em></p><p><strong>To wrap things up, what makes the Boundary Node team unique compared to some of the other teams at DFINITY?</strong></p><p><em>Every couple of weeks, we have a meeting titled “Most important meeting of our lives” during which we take a break and just play some games together. Those are indeed very important meetings for our team spirit. 🙂</em></p><p>A huge thank you to the Boundary Node team for sitting down with us today to provide an insightful look into what ICP boundary nodes are and what role they play on the network! Be sure to tune in for the next edition of team spotlight, which will focus on the languages team and dive into all things Motoko!</p><p>-DFINITY</p>]]></content>
        <category label="Team spotlight" term="Team spotlight"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update January 23, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/01/23/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/01/23/news-and-updates/update"/>
        <updated>2023-01-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today we'll be talking about package management and code blocks in Motoko.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Header image" src="/assets/images/moonshot-2c082d0bbc9da34a462b00dfb2986f4d.png" width="1366" height="769" class="img_ev3q"></p><p>Hey Motoko devs,</p><p>If you missed the last update post from the Motoko team, check it
out <a href="https://forum.dfinity.org/t/timers-and-base-library-weekly-motoko-updates/18063" target="_blank" rel="noopener noreferrer">here</a>. The post included updates
about the new Motoko Timers language features as well as continued base library documentation and testing efforts.</p><p>It’s a light week this week from the languages team!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-package-management-planning">Motoko package management planning<a href="#motoko-package-management-planning" class="hash-link" aria-label="Direct link to Motoko package management planning" title="Direct link to Motoko package management planning">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/motoko-cubed-64935c0d0202976ebfa8bd14098e59d3.png" width="944" height="877" class="img_ev3q"></p><p>There are currently discussions about what the future of Motoko package management looks like with respect to Vessel and
other package management tools that the community is using, such as <a href="https://mops.one/" target="_blank" rel="noopener noreferrer">Mops</a>. There was a nice post by
@icme recently talking about this issue that can be found
here: <a href="https://forum.dfinity.org/t/developer-feedback-opportunity-motoko-package-manager-improvements-redesign/18137" target="_blank" rel="noopener noreferrer">https://forum.dfinity.org/t/developer-feedback-opportunity-motoko-package-manager-improvements-redesign/18137</a></p><p>You can expect to see changes in the future coming to this aspect of the Motoko dev experience, so please weigh in and
comment on the thread with your thoughts on package management in Motoko!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="using-blocks-in-motoko">Using blocks in Motoko<a href="#using-blocks-in-motoko" class="hash-link" aria-label="Direct link to Using blocks in Motoko" title="Direct link to Using blocks in Motoko">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/code-blocks-897b5419371795c652dc9f3f9d6ca012.png" width="1361" height="606" class="img_ev3q"></p><p>This is not a new feature update, but as it is a light week, I thought it might be helpful to cover some existing
language features that might be less known to new developers. Apologies if you’re an experienced Motoko user and this is
old news to you :)</p><p>There’s a notion in Motoko of a “block” (found in many languages) that can be thought of as a sequence of statements (
such as assignments, declarations, function calls, etc.). The most common places where you find a block is as the two
bodies of an <code>if</code> expression, the body of a <code>while</code> loop, or a function body.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">while (x &lt; 3) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  // this is a block</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>I assume this is not news to many people.</p><p>Some interesting things to note about this construct is that blocks in Motoko can also be thought of as expressions (in
addition to being sequences of statements). While a statement is a language construct that produces some effect (like
calling a function or declaring a variable), an expression is a construct that can evaluate to some value (such as “2”
or “2 + 3” or “foo()”). In the case of a <code>do</code> block, the block expression evaluates to the last expression in the block.
This means you can bind <code>do</code> blocks to variables!</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">let x = do {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  foo();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  bar();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  3</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">};</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">// the value of x here is 3</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>This is also how you can bind to an <code>if</code> expression.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">let x =</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  if (y &lt; 0) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    foo();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  } else {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    bar();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    3</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">// the value of x here is either 2 or 3, and either foo() or bar() was called depending on y</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can even bind a variable to a <code>while</code> loop, but that is less useful, because the body of a while loop is forced by
the type system to always evaluate to unit.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">let x =</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  while (y &lt; 0) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    foo();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">// x always evaluates to ()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>I mentioned before that function bodies are also blocks. This means that you don’t actually have to use the <code>return</code>
keyword to finish a function, unless you want to exit the function early.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">func foo() : Nat {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  bar1();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  bar2();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  3 // the function returns 3 because the value of the block gets evaluated to the value 3</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>You can also add a <code>?</code> to the <code>do</code> block to work with option types.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">let x : ?Nat = foo(); // x is an option type who may or may not be null</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">let y =</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  do ? {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    x! + 3</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  };</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>If <code>x</code> was null, then the entire <code>do ? {}</code> block evaluates to null when <code>x</code> is examined by the <code>!</code> operator. Thus, <code>y</code>
is also null. However, if <code>x</code> had some Nat value, the value is added to 3, wrapped in an option type, and assigned
to <code>y</code>!</p><p>This is also useful in conjunction with the <code>ignore</code> keyword to perform a side effect that might involve intermediate
option types.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">ignore do ? {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  let x = foo()!;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  let y = bar(x)!;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Debug.print(baz(z)!);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Assuming <code>foo()</code>, <code>bar()</code>, and <code>baz()</code> all return an option type to signal success or failure, you can chain these
functions and have the whole block abort as soon as any of the individual functions abort. Whatever happens in
the <code>do ? {}</code> block, the value that the block evaluates to is ignored, and the program continues onward.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="see-you-next-time">See you next time!<a href="#see-you-next-time" class="hash-link" aria-label="Direct link to See you next time!" title="Direct link to See you next time!">​</a></h2><p>See you guys next week!</p><p>– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="Devs" term="Devs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update January 16, 2023]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/01/16/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2023/01/16/news-and-updates/update"/>
        <updated>2023-01-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today we'll be talking about a new feature that allows you to schedule timers in your code.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Header image" src="/assets/images/motoko-2-006729748ce27d3497775a9988aab374.png" width="1361" height="756" class="img_ev3q"></p><p>Hey Motoko devs,</p><p>Happy New Year!</p><p>The languages team is back in 2023, hitting the ground running and picking up right where we left off last year. Before
we move on, if you missed our last joint post with the SDK team, check it
out <a href="https://forum.dfinity.org/t/sdk-motoko-weekly-update-part-3/17553" target="_blank" rel="noopener noreferrer">here</a>. As a recap, the languages team left off
last year by focusing on testing and documenting large portions of the Motoko base library.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-language-feature-motoko-timers">New language feature: Motoko timers<a href="#new-language-feature-motoko-timers" class="hash-link" aria-label="Direct link to New language feature: Motoko timers" title="Direct link to New language feature: Motoko timers">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/timers-f36dc75aace49aa3777af99fab7a3910.png" width="1368" height="679" class="img_ev3q"></p><p>Meet Motoko timers! This is a new language feature that allows you to easily access the timers capability of the
Internet Computer that lets you schedule asynchronous jobs for the future!</p><p>The most straightforward way to access this feature is through the <code>Timer.mo</code> base library, which exposes <code>setTimer</code>
and <code>recurringTimer</code>.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">setTimer : (d : Duration, job : () -&gt; async ()) -&gt; (id : Nat)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">recurringTimer : (d : Duration, job : () -&gt; async ()) -&gt; (id : Nat)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cancelTimer : (id : Nat) -&gt; ()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Use <code>setTimer</code> to schedule one off jobs that get executed in the future, and <code>recurringTimer</code> to auto-repeat these jobs.
The duration can be given in nanoseconds (or seconds if that is more convenient for you). Use <code>cancelTimer</code> to remove a
previously set timer.</p><p>If you’re a power user that wants precise control over the canister's global timer, you can define a system function
called <code>timer</code> yourself, and establish either a super simple or an elaborately customized mechanism. If you want to
avoid any timer-related code in your canister, you can pass the <code>-no-timer</code> flag to <code>moc</code> and stop paying for what you
don't use. See more details in the PR discussion <a href="https://github.com/dfinity/motoko/pull/3542" target="_blank" rel="noopener noreferrer">here</a>.</p><p>As a first customer, Motoko playground will use timers to control canister expiration soon.</p><p>This feature will be included in the next release of dfx, but is also available in the current release of the Motoko
compiler. Have fun with timers!</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="function-fromiter">Function: fromIter<a href="#function-fromiter" class="hash-link" aria-label="Direct link to Function: fromIter" title="Direct link to Function: fromIter">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/fromiter-a18945bb3ad1131c1bfec3753eb34ff7.png" width="1330" height="480" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="base-library-improved-documentation-and-testing">Base library: improved documentation and testing<a href="#base-library-improved-documentation-and-testing" class="hash-link" aria-label="Direct link to Base library: improved documentation and testing" title="Direct link to Base library: improved documentation and testing">​</a></h2><p>The languages team was hard at work during the end of year and the start of this year, amongst other things, at testing
and documenting the base library en masse! We’ve added a bunch of descriptions to the library functions, as well as
runnable examples so devs can quickly figure out how to use the different APIs. We’ve also expanded the unit test
coverage of these library modules to give developers a stronger level of confidence in our modules. We’ll be cutting a
release of <code>motoko-base</code> soon to get these changes out to you guys, and will also continue to improve the documentation
and testing of our libraries.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="see-you-next-time">See you next time!<a href="#see-you-next-time" class="hash-link" aria-label="Direct link to See you next time!" title="Direct link to See you next time!">​</a></h2><p>We'll be back with more features and updates in a week’s time. Happy building and happy new year!</p><p>– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update December 19, 2022]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2022/12/19/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2022/12/19/news-and-updates/update"/>
        <updated>2022-12-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We’re back with a third weekly update to keep you guys in sync with what we’re working on for Motoko and the Internet Computer SDK.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="DFINITY" src="/assets/images/astronaut-fbb5f7495976e4378d4b051d35c80dd3.png" width="829" height="835" class="img_ev3q"></p><p>Hello devs,</p><p>We’re back with a third weekly update to keep you guys in sync with what we’re working on for Motoko and the Internet
Computer SDK. You can check out our previous
post <a href="https://forum.dfinity.org/t/generational-gc-on-playground-and-new-async-await-weekly-motoko-updates/17270" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="embed-motoko-interactive-code-snippets-directly-in-your-medium-story-or-blog-post">Embed Motoko: interactive code snippets directly in your Medium story or blog post!<a href="#embed-motoko-interactive-code-snippets-directly-in-your-medium-story-or-blog-post" class="hash-link" aria-label="Direct link to Embed Motoko: interactive code snippets directly in your Medium story or blog post!" title="Direct link to Embed Motoko: interactive code snippets directly in your Medium story or blog post!">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/medium-12d00c517bcabe74f139c27cbdb543a9.png" width="1469" height="660" class="img_ev3q"></p><p>We are excited to announce a new collaboration which brings
runnable <a href="https://embed.smartcontracts.org/" target="_blank" rel="noopener noreferrer">Motoko code snippets</a> directly into the <a href="https://medium.com/" target="_blank" rel="noopener noreferrer">Medium</a>
social publishing platform.
As a part of an ongoing effort to overhaul Motoko’s documentation, we wanted to make it easy for anyone in the ICP
community to create interactive tutorials and code examples across the Internet.
You can see the full
post <a href="https://forum.dfinity.org/t/embed-motoko-interactive-code-snippets-directly-in-your-medium-story-or-blog-post/17433" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="react-native---internet-computer">React Native \&lt;-<!-- -->&gt;<!-- --> Internet Computer<a href="#react-native---internet-computer" class="hash-link" aria-label="Direct link to react-native---internet-computer" title="Direct link to react-native---internet-computer">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/react-native-a641ebf2aaf7827f8fd807544fc86d70.png" width="849" height="1872" class="img_ev3q"></p><p>React Native is a popular open-source framework that allows developers to build native mobile applications using
JavaScript and React. With React Native, developers can create high-quality, cross-platform apps that feel and perform
like native apps, without the need to maintain separate code bases for each platform.</p><p>Up until now, React Native had limited support for the necessary APIs to perform cryptographic computations in
JavaScript. With the release of BigInt support however, it is now possible to build and deploy mobile apps that
communicate directly with the Internet Computer!</p><p>We have a starter template available for you here that uses the <a href="https://www.npmjs.com/package/@dfinity/agent" target="_blank" rel="noopener noreferrer">ICP JavaScript agent</a> (0.15) with no patches necessary! Check it out and
let us know what you think! Looking forward to seeing what you build.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="improvements-coming-to-base-library-documentation">Improvements coming to base library documentation<a href="#improvements-coming-to-base-library-documentation" class="hash-link" aria-label="Direct link to Improvements coming to base library documentation" title="Direct link to Improvements coming to base library documentation">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/github-prs-d7eeec11806e376cbdc72e41cefb9bcb.png" width="1513" height="1032" class="img_ev3q"></p><p>The team has been hard at work adding tests, documentation, and examples to the Base Library. We now have nearly 10 PRs
open that each add significant coverage!</p><p>The community has been asking for improvements in this regard for some time, and we know it’s one area that has been
starved of attention for a while. Personally, I’m excited to see live code snippets alongside every block of
documentation that can be edited in real time. I hope that you will accept this as a small token of our appreciation (
and perhaps a holiday gift) for being the best developer community in the world.</p><p>Hats off to everyone involved for their tireless efforts.</p><p>If you’re interested in contributing, please do! We have instructions for how to get your machine set up to run the
Motoko compiler and base library documentation
project <a href="https://dirt-jaguar-6a2.notion.site/How-to-contribute-to-the-base-examples-d2761b204d5443d6b170d0dfe6a70591" target="_blank" rel="noopener noreferrer">here</a>.
You can find the base library on GitHub <a href="https://github.com/dfinity/motoko-base" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="app-of-the-week-fig">App of the week: Fig<a href="#app-of-the-week-fig" class="hash-link" aria-label="Direct link to App of the week: Fig" title="Direct link to App of the week: Fig">​</a></h2><p><img loading="lazy" alt="Header image" src="/assets/images/fig-6c4d0861868adfca197ef0105276a0f8.png" width="1426" height="1037" class="img_ev3q">
Fig is an application that lets you add visual autocomplete to any CLI tool or script. Some of us on the team have been
using it for several weeks now, and it’s offered a nice boost to productivity. It’s like an OS for your terminal.</p><p>Here are the top three things we love about it:</p><p>dropdown command menu for CLI’s
Consolidation of aliases and personal utility scripts
<code>fig ai</code> - translate natural language into bash commands</p><p>and much much more.</p><p>You can download Fig <a href="https://fig.io/" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="see-you-next-time">See you next time!<a href="#see-you-next-time" class="hash-link" aria-label="Direct link to See you next time!" title="Direct link to See you next time!">​</a></h2><p>We'll be back with more features and updates :slight_smile:</p><p>– DFINITY Languages team</p>]]></content>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Motoko update December 9, 2022]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2022/12/09/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2022/12/09/news-and-updates/update"/>
        <updated>2022-12-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The languages team is back with a second weekly update to keep you guys in sync with what we’re working on for Motoko.]]></summary>
        <content type="html"><![CDATA[<p><img loading="lazy" alt="Motoko" src="/assets/images/motoko-1-be2a32464310fbb91577621b9a99b054.png" width="847" height="580" class="img_ev3q"></p><p>Hey Motoko devs,</p><p>The languages team is back with a second weekly update to keep you guys in sync with what we’re working on for Motoko.
You can check out our previous
post <a href="https://forum.dfinity.org/t/highlight-post-new-motoko-features-in-dfx-0-12/17027" target="_blank" rel="noopener noreferrer">here</a>.</p><p>As a recap, last time we talked about the new record extension syntax, extended buffer class, and teased the
generational GC that will be coming in the next release of <code>dfx</code>.</p><p><img loading="lazy" alt="Garbage collector" src="/assets/images/gc-1-27b1d0ab195902f999f44def0256a5eb.png" width="1378" height="478" class="img_ev3q"></p><h1>Collector now available on the Motoko playground!</h1><p>The new generational garbage collector (GC) has been deployed to
the <a href="https://m7sm4-2iaaa-aaaab-qabra-cai.raw.icp0.io/" target="_blank" rel="noopener noreferrer">Motoko playground</a> (thanks to @chenyan)! If you’re curious to try
out the new system, this is a great way to try it out before the official release in the next version of <code>dfx</code>.</p><p>As a reminder, generational garbage collection allows more efficient management and cleaning of your Motoko program’s
heap space. This helps, primarily, with reducing cycle costs for your canisters and avoiding the cycle limit per message
on particularly heavy computation.</p><p>Our internal testing shows that this new garbage collector is more performant than the existing two collection
strategies in most situations, but @luc-blaeser (the team member responsible for this new feature) is interested in real
world metrics. If you're interested in benchmarking and stress-testing Motoko, throw this new collection strategy at
your canisters and send us any metrics you find interesting :)</p><p><img loading="lazy" alt="Async / Await" src="/assets/images/asyncawait-2995f444638282408dbdfdf872197589.png" width="1364" height="193" class="img_ev3q"></p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="teaser-efficient-async-await">Teaser: efficient async await<a href="#teaser-efficient-async-await" class="hash-link" aria-label="Direct link to Teaser: efficient async await" title="Direct link to Teaser: efficient async await">​</a></h2><p>We are adding a new feature to Motoko: <code>async*</code> and <code>await*</code>!</p><p>This new type and operator lets you abstract out asynchronous code without having to send an inter-canister message (and
thus suspend execution and go through the scheduler)!</p><p>This feature is not yet shipped with <code>dfx</code>, but is available on the playground and the most recent release of <code>moc</code>.</p><p>Example:</p><p>Let’s say you have a function that divides two numbers, doubles the sum, and returns the answer. Let’s also assume that
your canister publicly exposes this function for other canisters to call, and so it has an asynchronous type.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">public func foo(number1 : Nat, number2 : Nat) : async Nat {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  if (number2 == 0) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    throw Error.reject "Cannot divide by zero";</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  (number1 / number2) * 2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Now, for the sake of convoluted examples, let’s say you want to pull out the division and the error checking to a helper
function. Something unfortunate happens.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">func divide(number1 : Nat, number2 : Nat) : async Nat {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  if (number2 == 0) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    throw Error.reject "Cannot divide by zero";</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  number1 / number2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">};</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public func foo(number1 : Nat, number2 : Nat) : async Nat {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  (await divide(number1, number2)) * 2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Even though the <code>divide</code> function is a local helper, it needs to be declared with an <code>async</code> type to throw the reject.
This means that when it is called and the result is <code>await</code>ed on, the canister actually pauses execution and sends a
message (to itself…) to invoke this call. Not very efficient, especially if you have a lot of async calls like this.</p><p>But it’s okay. Just add a <code>*</code> to everything. The compiler will take care of the rest.</p><div style="position:relative"><div style="--prism-color:#F8F8F2;--prism-background-color:#181818" class="codeBlockContainer_Ckt0 theme-code-block"><div><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#181818"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">func divide(number1 : Nat, number2 : Nat) : async* Nat {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  if (number2 == 0) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    throw Error.reject "Cannot divide by zero";</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  };</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  number1 / number2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">};</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public func foo(number1 : Nat, number2 : Nat) : async Nat {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  (await* divide(number1, number2)) * 2</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><p>Now, the helper is called locally, and you take no performance hit for pulling out code from async functions to helpers!</p><p>Note: There is a bit more detail to this feature than what we covered so far. In a nutshell, this feature avoids context
switches at the expense of less commit points; your code may behave differently with traps and concurrent messages.
Please be mindful of this tradeoff and difference between this feature and the <code>async</code> / <code>await</code> that you are used to.
As we gather feedback on this new feature from users, we may make changes in future versions of Motoko. If you want to
see the full discussion, you can check it out <a href="https://github.com/dfinity/motoko/pull/3609" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="see-you-next-time">See you next time!<a href="#see-you-next-time" class="hash-link" aria-label="Direct link to See you next time!" title="Direct link to See you next time!">​</a></h2><p>We'll be back with more features and updates :slight_smile:</p><p>– DFINITY Languages team</p>]]></content>
        <author>
            <name>Kento Sugama</name>
        </author>
        <category label="New features" term="New features"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Developer weekly update December 2, 2022]]></title>
        <id>https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2022/12/02/news-and-updates/update</id>
        <link href="https://y2j3u-vaaaa-aaaam-ahtkq-cai.icp0.io/blog/2022/12/02/news-and-updates/update"/>
        <updated>2022-12-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hi everyone and happy Friday! I’d like to share some highlights from the SDK team for this week.]]></summary>
        <content type="html"><![CDATA[<p>Hi everyone and happy Friday! I’d like to share some highlights from the SDK team for this week.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="new-features-and-changes">New features and changes<a href="#new-features-and-changes" class="hash-link" aria-label="Direct link to New features and changes" title="Direct link to New features and changes">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="keyring-integration">Keyring integration<a href="#keyring-integration" class="hash-link" aria-label="Direct link to Keyring integration" title="Direct link to Keyring integration">​</a></h3><p>You’ll now be able to use the OS-native keyring to decrypt your identity. Sure beats having to type your password for
every command.</p><p>If keyring integration is available, PEM files (except for the default identity) are now by default stored in the
OS-provided keyring.
If it is not available, it will fall back on the already existing password-encrypted PEM files.
Plaintext PEM files are still available (e.g. for use in non-interactive situations like CI), but not recommended for
use since they put the keys at risk.</p><p>To force the use of one specific storage mode, use the <code>--storage-mode</code> flag with
either <code>--storage-mode password-protected</code> or <code>--storage-mode plaintext</code>.
This works for both <code>dfx identity new</code> and <code>dfx identity import</code>.</p><p>The flag <code>--disable-encryption</code> is deprecated in favour of <code>--storage-mode plaintext</code>. It has the same behavior.</p><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="motoko-074">Motoko 0.7.4<a href="#motoko-074" class="hash-link" aria-label="Direct link to Motoko 0.7.4" title="Direct link to Motoko 0.7.4">​</a></h3><p>The latest version of dfx includes version 0.7.4 of Motoko, which fixed some bugs and introduced a few new language
features. See the Motoko release notes <a href="https://github.com/dfinity/motoko/releases/tag/0.7.4" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="in-flight">In-flight<a href="#in-flight" class="hash-link" aria-label="Direct link to In-flight" title="Direct link to In-flight">​</a></h2><h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="dfx-pull">dfx pull<a href="#dfx-pull" class="hash-link" aria-label="Direct link to dfx pull" title="Direct link to dfx pull">​</a></h3><p>This feature allows you to pull in third party dependencies automatically via dfx, rather than building and installing
each manually. This should make it much smoother to build integrations with canisters such as Internet Identity,
InfinitySwap, or others.</p><p>Check out the full changelog <a href="https://github.com/dfinity/sdk/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="other-fun-stuff">Other fun stuff<a href="#other-fun-stuff" class="hash-link" aria-label="Direct link to Other fun stuff" title="Direct link to Other fun stuff">​</a></h2><p>I’ve been an avid user of the Arc browser since it launched, and I have had such a good experience with it, I want to
share it with you. I have one invite code I can give to one lucky forum member, so whoever grabs this first can try Arc
right away, without having to join the waitlist.</p><p>More on the Arc browser: <a href="https://www.youtube.com/watch?v=TH255ssNWkI" target="_blank" rel="noopener noreferrer">Arc Browser: Early Access Look | App Review - YouTube</a>.</p><p>Have a wonderful weekend and build something great!</p>]]></content>
        <category label="Devs" term="Devs"/>
    </entry>
</feed>