<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[smacon.dev]]></title><description><![CDATA[smacon.dev]]></description><link>https://smacon.dev</link><generator>GatsbyJS</generator><lastBuildDate>Mon, 12 Jan 2026 09:05:19 GMT</lastBuildDate><item><title><![CDATA[About Sakanosita IC Labs | smacon.dev]]></title><description><![CDATA[Welcome to Sakanosita IC Labs! 🎉 Hey there! We’re Sakanosita IC Labs, founded in 2021 by our fearless leader, Moto Sakanosita. We’re a…]]></description><link>https://smacon.dev/about/</link><guid isPermaLink="false">https://smacon.dev/about/</guid><content:encoded>&lt;h1&gt;Welcome to Sakanosita IC Labs! 🎉&lt;/h1&gt;
&lt;p&gt;Hey there! We’re &lt;strong&gt;Sakanosita IC Labs&lt;/strong&gt;, founded in 2021 by our fearless leader, Moto Sakanosita. We’re a bunch of tech enthusiasts who love working on innovative projects and sharing our knowledge with the world. You can find our work at &lt;a href=&quot;https://github.com/smacon-dev&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What we do 🚀&lt;/h2&gt;
&lt;p&gt;At Sakanosita IC Labs, we’re all about exploring the latest and greatest in technology. We work on a wide range of projects, from software development to hardware design, and everything in between. Our goal is to push the boundaries of what’s possible and to inspire others to do the same.&lt;/p&gt;
&lt;h2&gt;Get in touch 📬&lt;/h2&gt;
&lt;p&gt;Got questions or just want to chat? Feel free to reach out to us! You can find me on &lt;a href=&quot;https://twitter.com/zk_moto&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[No title]]></title><link>https://smacon.dev/all/</link><guid isPermaLink="false">https://smacon.dev/all/</guid><content:encoded></content:encoded></item><item><title><![CDATA[はじめてのスマートコントラクト開発 | Web3 プログラミング入門]]></title><description><![CDATA[smacon.dev はじめてのスマートコントラクト開発]]></description><link>https://smacon.dev/</link><guid isPermaLink="false">https://smacon.dev/</guid><content:encoded>&lt;h1&gt;smacon.dev&lt;/h1&gt;
&lt;p&gt;はじめてのスマートコントラクト開発&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Motoko ではじめるキャニスター開発 | ICP プログラミング学習]]></title><link>https://smacon.dev/motoko/</link><guid isPermaLink="false">https://smacon.dev/motoko/</guid><pubDate>Sun, 14 May 2023 10:38:00 GMT</pubDate><content:encoded></content:encoded></item><item><title><![CDATA[Cycle Wallet キャニスター図解: dfx identity (Principal ID), Ledger (Account ID)との関係]]></title><description><![CDATA[当記事では Internet Computer の dfx という開発ツールにおける秘密鍵やウォレットの取り扱いについて説明します。
以下のような方に向いています dfx を使ってキャニスターを本番メインネットにデプロイする Cycle…]]></description><link>https://smacon.dev/posts/ledger-cycle-wallet</link><guid isPermaLink="false">https://smacon.dev/posts/ledger-cycle-wallet</guid><pubDate>Sun, 14 May 2023 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;当記事では Internet Computer の dfx という開発ツールにおける秘密鍵やウォレットの取り扱いについて説明します。
以下のような方に向いています&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dfx を使ってキャニスターを本番メインネットにデプロイする&lt;/li&gt;
&lt;li&gt;Cycle ウォレットとの取り扱い方を知りたい&lt;/li&gt;
&lt;li&gt;Identity と Principal と Ledger と Wallet の関係を整理したい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e78f5fdfb3e44d60593164dc89b729ed/575bd/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.291139240506325%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnklEQVR42l3T2c7qMAwE4L7/i3HBJSCEQOz7vu/goy9SKs5fKUqbeMbjsVvEn+f7/cZ0Oo16vR6NRiMOh0M8Ho+43+/x+XxiPB5Hu92O1WoVr9crrtdrus/YwsfvhcPtdhu73S72+31sNps4n8/xfD5TnDtkEhyPxxQDWxJSU6lUolarxeVySYdI5vN5rNfr6Ha7sVwuEwFCiYbDYSJtNpsxm80SriQErlarqZScSfBisYjRaJQIkdxut1I9DHWDwSAl/U+hUgTzKl/YAZUquxjrdDql898d7tf/4m9TKOv1eolAmf1+P5Wl3FarlZTxmggPQnHIPIlQ9zKBrPzzzXDlUsprXiJmSa5oMpmk0kvCnM16v98J5Eww/wR3Op3UiDw6uTHsQCx5Hp1CECUUaIwS89hQZncOiAAwj1DGZVG4Chn5AsA7CyGFyrDzNSthB7AkFvWWbkuYSkYqowPBvnPXjIiylQiInLLcaQLEWEmhrIj459AvB+j3QuhOBWbSYoPk4vPIqcJ72WVAARmsPCpkBMjeAeZ353a43zn8B5UZ4+8fWzJkAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;icp&quot;
        title=&quot;&quot;
        src=&quot;/static/e78f5fdfb3e44d60593164dc89b729ed/f058b/1.png&quot;
        srcset=&quot;/static/e78f5fdfb3e44d60593164dc89b729ed/c26ae/1.png 158w,
/static/e78f5fdfb3e44d60593164dc89b729ed/6bdcf/1.png 315w,
/static/e78f5fdfb3e44d60593164dc89b729ed/f058b/1.png 630w,
/static/e78f5fdfb3e44d60593164dc89b729ed/40601/1.png 945w,
/static/e78f5fdfb3e44d60593164dc89b729ed/78612/1.png 1260w,
/static/e78f5fdfb3e44d60593164dc89b729ed/575bd/1.png 1791w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;図は Internet Computer の機能のうち、dfx の部分に絞って表しています。&lt;/p&gt;
&lt;h1&gt;dfx identity&lt;/h1&gt;
&lt;p&gt;dfx identity は, 1 組の Principal ID と秘密鍵に紐づきます。&lt;/p&gt;
&lt;p&gt;上の図では 2 つの dfx identity を表しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aramaki&lt;/li&gt;
&lt;li&gt;batou&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;dfx identity の秘密鍵&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以下のコマンドで表示されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity export aramaki&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Ledger Account&lt;/h1&gt;
&lt;p&gt;Ledger Account は ICP トークンの残高を管理します。
dfx identity ごとに 1 つの Ledger Account を持っています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aramaki の Ledger Account は 2.0 ICP 保有&lt;/li&gt;
&lt;li&gt;batou の Ledger Account は 1.5 ICP 保有&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Canisters&lt;/h1&gt;
&lt;p&gt;キャニスターは Internet Computer 上のあらゆるアプリケーション（スマートコントラクト）の入れ物です。
デプロイする時やキャニスターを走らせる時に Cycle が必要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;batou は hello_frontend と hello_backend キャニスターをデプロイしています&lt;/li&gt;
&lt;li&gt;hello_frontend は 2TCycle デポジットされています&lt;/li&gt;
&lt;li&gt;hello_backend は 1TCycle デポジットされています&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Cycle Wallet&lt;/h1&gt;
&lt;p&gt;dfx identity ごとにウォレットを作成したり削除したりできます。
ウォレットごとに複数の Principal を contorller として追加でき、Controller となった Principal はそのウォレットの Cycle を利用したり、ウォレットを削除したりできます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aramaki の Cycle Wallet は a で 3T Cycle 保有&lt;/li&gt;
&lt;li&gt;batou の Cycle Wallet は b で 2T Cycle 保有&lt;/li&gt;
&lt;li&gt;Cycle Wallet b の controller は aramaki と batou
&lt;ul&gt;
&lt;li&gt;aramaki は Cycle Wallet b を利用することもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cycle Wallet 自体もはキャニスターであり、最初に作る時に少量の ICP が必要です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cycle トークン&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ICP トークンと交換することで入手できます。
アプリケーションキャニスターにデポジットしたり、Cycle ウォレットにデポジットしたりして利用します。
以下の場合には Cycle トークンが必要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キャニスターを作る時&lt;/li&gt;
&lt;li&gt;キャニスターを走らせる時&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://anv4y-qiaaa-aaaal-qaqxq-cai.ic0.app/&quot;&gt;&lt;strong&gt;Cycles Faucet&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Faucet を利用すれば開発用の Cycles をもらうことができます。&lt;/p&gt;
&lt;h2&gt;上の図には書いていない説明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Principal ID は複数の Leger Account を保有できます、図は dfx identity に限定しているので 1 つの Ledger Account だけを持っています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ledger Account と ICP トークンの残高は 特別な NNS サブネット上の Ledger Canister で管理されています。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Internet Computer 入門: メインネットにキャニスターをデプロイする手順]]></title><description><![CDATA[この記事はこんな人にオススメ 自分の作ったキャニスターをインターネット上で公開したい Motoko エンジニア/プログラマになりたい Internet Computer (DFINITY) に興味がある ブロックチェーンや Dapps 開発に興味がある 当記事は、2023 年…]]></description><link>https://smacon.dev/posts/deploy-to-ic</link><guid isPermaLink="false">https://smacon.dev/posts/deploy-to-ic</guid><pubDate>Sat, 13 May 2023 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事はこんな人にオススメ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自分の作ったキャニスターをインターネット上で公開したい&lt;/li&gt;
&lt;li&gt;Motoko エンジニア/プログラマになりたい&lt;/li&gt;
&lt;li&gt;Internet Computer (DFINITY) に興味がある&lt;/li&gt;
&lt;li&gt;ブロックチェーンや Dapps 開発に興味がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当記事は、2023 年 5 月現在の DFINITY 公式のデプロイ手順をもとにした解説です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/setup/deploy-mainnet&quot;&gt;Deploying to Internet Computer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;初めての方はローカルでのデプロイから始めるといいですよ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;前提&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;筆者の実行環境&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;M1 Mac (macOS 12.5.1)&lt;/li&gt;
&lt;li&gt;dfx: 0.14.0&lt;/li&gt;
&lt;li&gt;Node.js: V18.16.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ICP / Cycle トークン&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;公式手順どおりに進めるためには以下の２つが必要になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A. ウォレットを作るための ICP トークン($1.5 相当)&lt;/li&gt;
&lt;li&gt;B. 2 つのキャニスターをデプロイするための Cycle (6.3 TCycle 程度)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;B については開発者向けの Faucet で Cycle をもらえるので活用してください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/setup/cycles/cycles-faucet&quot;&gt;Getting Started with Free Cycles&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Faucet のしくみはたまに変わりますが、2023 年 5 月に筆者がもらった時は Discord で DM をやりとりしました。
ただし DM で誰かに ICP を直接送ってくれと言われたら、それは 99%詐欺なので気をつけましょう。&lt;/p&gt;
&lt;h1&gt;本日のゴール&lt;/h1&gt;
&lt;p&gt;当記事のゴールはシンプルです。まず２つのコマンドを示します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# ローカル開発環境へのデプロイ
dfx deploy

# Internet Computerメインネットへのデプロイ
dfx deploy --network ic&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;違いは &lt;code class=&quot;language-text&quot;&gt;--network ic&lt;/code&gt; オプションをつけるかどうかです。
下のコマンドが成功すれば、メインネットにキャニスターをデプロイできます。&lt;/p&gt;
&lt;p&gt;ソースコードを書いたりキャニスターをコンパイルするところまでは、ローカル開発でもメインネットでも同じです。&lt;/p&gt;
&lt;p&gt;ただし、メインネットへのデプロイコマンドを実行するには Cycle ウォレットと Cycle トークンが必要となります。&lt;/p&gt;
&lt;h1&gt;Cycle トークン・ウォレットとは&lt;/h1&gt;
&lt;p&gt;この記事を読んでいる人の多くはすでに ICP トークンは知っていると思いますが、Internet Computer でキャニスターを走らせるためには Cycle トークンが必要です。&lt;/p&gt;
&lt;p&gt;Ethereum や Solana などほかの多くのブロックチェーンとは異なり Internet Computer は dApps の利用者(ユーザー)ではなく、dApps の運営者(開発者)が Gas を負担します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/capabilities/reverse-gas/&quot;&gt;Internet Computer: Reverse Gas Model&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ここでは以下の 2 つの用途で Cycle を使用します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キャニスターを作成・デプロイする時の Cycle&lt;/li&gt;
&lt;li&gt;デプロイ後のキャニスターを走らせるための Cycle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Internet Computer のウォレット自体もキャニスターとして作られます。
Cycle ウォレットを作る前にウォレットの概念をイメージで掴んでおきましょう。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/ledger-cycle-wallet&quot;&gt;dfx identity と ICP トークンと Cycle ウォレット&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;注意事項&lt;/h1&gt;
&lt;p&gt;ICP や Cycle のレートは変動しており、キャニスターの作成に必要な ICP や Cycle の量も変動します。&lt;/p&gt;
&lt;p&gt;ICP や Cycle を節約したい気持ちもありますが、ギリギリの量で作業を進めてコマンド実行に失敗すると Cycle は戻ってこない場合もあります。&lt;/p&gt;
&lt;p&gt;また今後の IC や dfx の仕様変更でコマンドの実行結果が同じにならない可能性もあります。&lt;/p&gt;
&lt;p&gt;オススメなのは、開発専用のウォレットになくなってもいいと思える $10 程度の ICP を用意しておくことです。&lt;/p&gt;
&lt;p&gt;こういったリスクを理解した上ですべて自己責任で作業を進めてください。&lt;/p&gt;
&lt;h1&gt;Deploying to Internet Computer&lt;/h1&gt;
&lt;p&gt;それでは実際に、公式のガイドに従って進めて行きましょう。
以下のような流れとなっています。(2023 年 5 月現在)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/setup/deploy-mainnet&quot;&gt;Deploying to Internet Computer&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download and install&lt;/li&gt;
&lt;li&gt;Verify the SDK is ready to use&lt;/li&gt;
&lt;li&gt;Create a new project&lt;/li&gt;
&lt;li&gt;Check the connection to the IC mainnet&lt;/li&gt;
&lt;li&gt;Confirm your developer identity and ledger account&lt;/li&gt;
&lt;li&gt;Creating a Cycles Wallet&lt;/li&gt;
&lt;li&gt;Validate your cycles wallet&lt;/li&gt;
&lt;li&gt;Register, build, and deploy the application&lt;/li&gt;
&lt;li&gt;Test the dapp frontend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すでに dfx ツールまではインストール済みとして、「Create a new project」から始めます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Create a new project&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new hello
cd hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;hello というプロジェクトを作ると、2 つのキャニスターのソースコードも自動で作られます。
もちろんソースコードをあなたの好きに変えても構いません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hello_frontend&lt;/li&gt;
&lt;li&gt;hello_backend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IC mainnet にこの 2 つのキャニスターをデプロイすることになります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check the connection to the IC mainnet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;IC mainnet との疎通を確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;log&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-log line-numbers&quot;&gt;&lt;code class=&quot;language-log&quot;&gt;hello &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; dfx ping ic
&lt;span class=&quot;token operator&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;certified_height&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;67799281&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;ic_api_version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.18.0&quot;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;impl_hash&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;83128b3d340d81e601413dcebcbda3bdf0fd5dcb151f7cc0e43790cedd3e5f40&quot;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;impl_version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;6d21535b301fee2ad3e8a0e8af2c3f9a3d022111&quot;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;replica_health_status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;healthy&quot;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;root_key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;129&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;29&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;220&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;124&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;220&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;124&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;97&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;129&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;76&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;110&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;199&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;31&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;171&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;88&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;59&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;189&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;129&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;55&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;37&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;92&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;55&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;132&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;134&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;152&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;164&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;241&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;224&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;139&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;116&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;93&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;251&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;93&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;156&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;213&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;70&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;217&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;104&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;145&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;58&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;44&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;197&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;52&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;131&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;191&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;75&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;67&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;146&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;228&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;103&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;219&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;150&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;214&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;91&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;155&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;203&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;113&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;113&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;248&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;71&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;46&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;77&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;253&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;116&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;132&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;176&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;145&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;135&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;185&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;136&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;131&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;70&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;63&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;152&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;170&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;174&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Confirm your developer identity and ledger account&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Identity, Prncipal ID, Account ID を確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity whoami
dfx identity get-principal
dfx ledger account-id&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Identity は任意のものを使って進めてください。
公式手順では dfx インストール直後のまま進めるので default になっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Principal ID&lt;/li&gt;
&lt;li&gt;Account ID&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の 2 つは後で使うのでメモするか、このコマンドをいつでも使えるように覚えておきましょう。&lt;/p&gt;
&lt;p&gt;次は ICP トークンの残高を確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx ledger --network ic balance&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;log&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-log line-numbers&quot;&gt;&lt;code class=&quot;language-log&quot;&gt;&lt;span class=&quot;token level warning important&quot;&gt;WARN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; The default identity is not stored securely&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; Do not use it to control a lot of cycles&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ICP&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; Create a new identity with `dfx identity new` and use it in mainnet&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;facing commands with the `&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;identity` flag&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この時、WARN が表示されました。dfx identity を切り変える方法を勧めています。&lt;/p&gt;
&lt;p&gt;もし、dfx identity を使い分けられる人はその方がより安全に運用できるのでそうしてください。&lt;/p&gt;
&lt;p&gt;当記事ではなるべく公式手順どおりに進めたいので今後この WARN は無視します。
（これ以降、実行結果に表示されるこの WARN を省略します）&lt;/p&gt;
&lt;p&gt;先ほどのコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx ledger --network ic balance
0.00000000 ICP&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この時点ではまだ送金していないため 0.0 ICP の表示ですが、公式手順ではこのアカウントの ICP 残高が 10 ICP になっています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx ledger --network ic balance
10.00000000 ICP&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これ以降の手順で ICP が必要になるので少量の ICP トークンを先ほどの Principal ID もしくは Account ID 宛に送金する必要があります。&lt;/p&gt;
&lt;p&gt;以下のコマンドで表示されるあなたの Account ID (アドレス)に送りましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx ledger --network ic account-id&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ところで、公式手順の同じコマンドでは &lt;code class=&quot;language-text&quot;&gt;--network ic&lt;/code&gt; をつけていないことに気づきましたか？&lt;/p&gt;
&lt;p&gt;じつは同じ秘密鍵を使えば Principal ID や Account ID はローカルでもメインネットでも同じ値になります。
試しに以下のように比較してみてください。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx ledger account-id
dfx ledger account-id --network ic&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;送金はどこから送っても大丈夫です。（例：NNS, Plug, NFID、取引所からの引き出し）&lt;/p&gt;
&lt;p&gt;ぼくは自分の Plug ウォレット から dfx ledger の Account ID へ 0.3 ICP を送金しました。
送金後にもう一度 Ledger の残高を確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx ledger --network ic balance
0.30000000 ICP&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この後の dfx 用のウォレットの作成には 0.7 TCycle ぐらい必要になるので、当記事ではこのうち 0.25 ICP($1.25 相当)を使います。&lt;/p&gt;
&lt;p&gt;2023/5/12 現在のレート&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 ICP はおよそ $5&lt;/li&gt;
&lt;li&gt;1 TCycle はおよそ $1.4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Creating a Cycles Wallet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2 つのコマンドを実行して Cycle ウォレットを作ります。
ここでのポイントは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cycle ウォレット自身もキャニスターである&lt;/li&gt;
&lt;li&gt;キャニスターの作成は Cycle で支払うが、まだ Cycle ウォレットがないので最初だけは ICP で払う&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt; % dfx ledger &lt;span class=&quot;token parameter variable&quot;&gt;--network&lt;/span&gt; ic create-canister nmcsh-pngle-oimvf-zeu3q-jbynm-qw3vr-44mgt-biuks-xjweo-q2j36-vae &lt;span class=&quot;token parameter variable&quot;&gt;--amount&lt;/span&gt; .28
Transfer sent at block height &lt;span class=&quot;token number&quot;&gt;6106475&lt;/span&gt;
Using transfer at block height &lt;span class=&quot;token number&quot;&gt;6106475&lt;/span&gt;
Canister created with id: &lt;span class=&quot;token string&quot;&gt;&quot;gi5zp-fyaaa-aaaap-qbfwa-cai &quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;さきほど Account ID に送った 0.3 ICP の中から 0.25 ICP を使ってウォレットを作ります。
この時に ICP が足りないとウォレットを作れません。&lt;/p&gt;
&lt;p&gt;公式手順でも 0.25 ICP を使ってウォレットを作っていますが、法定通貨に対して ICP 高くなれば、もっと少ない ICP て良いはずです。
目安は $1 ~ $1.2 ぐらいの ICP です。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt; % dfx identity &lt;span class=&quot;token parameter variable&quot;&gt;--network&lt;/span&gt; ic deploy-wallet &lt;span class=&quot;token string&quot;&gt;&quot;gi5zp-fyaaa-aaaap-qbfwa-cai &quot;&lt;/span&gt;
Creating a wallet canister on the ic network.
The wallet canister on the &lt;span class=&quot;token string&quot;&gt;&quot;ic&quot;&lt;/span&gt; network &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; user &lt;span class=&quot;token string&quot;&gt;&quot;default&quot;&lt;/span&gt; is &lt;span class=&quot;token string&quot;&gt;&quot;gi5zp-fyaaa-aaaap-qbfwa-cai &quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;わたしのウォレットのキャニスター ID は &lt;code class=&quot;language-text&quot;&gt;gi5zp-fyaaa-aaaap-qbfwa-cai&lt;/code&gt; で作られました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validate your cycles wallet&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx identity --network ic get-wallet
gi5zp-fyaaa-aaaap-qbfwa-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx wallet --network ic balance
0.806 TC (trillion cycles).&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;今日現在の 0.25 ICP を使って作ったウォレットには 0.806 TCycle 入っています。&lt;/p&gt;
&lt;p&gt;ブラウザでウォレットを管理するためのインターフェースがあります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;https://&amp;lt;WALLET-CANISTER-ID&gt;.icp0.io&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2023 年 5 月現在筆者環境でこの機能は動作確認できませんでした。
以前はこの機能を使えていましたが、おそらくウォレットの仕様のアップグレードの影響だと思います。&lt;/p&gt;
&lt;p&gt;この機能が使えなくても先には進めるので、ここはいったん飛ばしましょう。
（後日、確認できたら記事を更新します）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deploy の前に Cycle を補充する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;キャニスターのデプロイの前に Cycle を追加で取得する必要があります。
この後で hello プロジェクトの 2 つのキャニスターを１発でデプロイするためには 6.3 TCycle 程度必要です。(2023 年 5 月現在)&lt;/p&gt;
&lt;p&gt;公式ガイドの手順通りに簡単に進めるためにも Faucet を利用して 20 TCycle をもらうのがオススメです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/setup/cycles/cycles-faucet&quot;&gt;Getting Started with Free Cycles&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;補足：公式ガイドの手順とは異なりますがキャニスター作成時に Cycle の量を指定することで利用する Cycle の量を調整することができます。また、終わったらキャニスターを Stop &amp;#x26; Delete すればキャニスターに Deposit した Cycle をウォレットに引き出すこともできます。&lt;/p&gt;
&lt;p&gt;なんらかの事情で Faucet から貰えない場合や、多少の ICP を消費してでもたくさんの Cycle が必要な場合は、&lt;a href=&quot;https://avjzx-pyaaa-aaaaj-aadmq-cai.raw.ic0.app/account&quot;&gt;ICLight&lt;/a&gt; などの dapps で ICP を Cycle に交換したり、Cycle を dfx identity の wallet に送金するといったことできます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx wallet --network ic balance
8.139 TC (trillion cycles).&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;筆者のウォレットには 8.139 TCycle 入れました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Register, build, and deploy the application&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;いよいよ当記事のゴールとして紹介したデプロイのコマンドが登場します。&lt;/p&gt;
&lt;p&gt;まずは Node.js のライブラリをインストールします。
はじめにプロジェクトを作るときにライブラリもインストール済みなので、ここではなにも起こらないかもしれません。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;log&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-log line-numbers&quot;&gt;&lt;code class=&quot;language-log&quot;&gt;hello &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; npm install

up to date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; audited &lt;span class=&quot;token number&quot;&gt;406&lt;/span&gt; packages in &lt;span class=&quot;token number&quot;&gt;461ms&lt;/span&gt;

&lt;span class=&quot;token number&quot;&gt;69&lt;/span&gt; packages are looking for funding
  run `npm fund` for details

found &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; vulnerabilities&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;さていよいよデプロイコマンドです。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;log&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-log line-numbers&quot;&gt;&lt;code class=&quot;language-log&quot;&gt;hello &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; dfx deploy &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;network ic
&lt;span class=&quot;token level warning important&quot;&gt;WARN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; The batou identity is not stored securely&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; Do not use it to control a lot of cycles&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ICP&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; Create a new identity with `dfx identity new` and use it in mainnet&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;facing commands with the `&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;identity` flag
Deploying all canisters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Creating canisters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Creating canister hello_backend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;hello_backend canister created on network ic with canister id:&lt;/span&gt; esbrt&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;3iaaa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;aaaap&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;qbfza&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;cai
Creating canister hello_frontend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;hello_frontend canister created on network ic with canister id:&lt;/span&gt; evaxh&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;wqaaa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;aaaap&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;qbfzq&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;cai
Building canisters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Shrink WASM module size&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Building frontend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token level warning important&quot;&gt;WARN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Building canisters before generate for Motoko
&lt;span class=&quot;token level warning important&quot;&gt;WARN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;did file for canister &lt;span class=&quot;token string&quot;&gt;&apos;hello_frontend&apos;&lt;/span&gt; does not exist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Shrink WASM module size&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;Generating type declarations for canister hello_frontend:&lt;/span&gt;
  src&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;declarations&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_frontend&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_frontend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;did&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts
  src&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;declarations&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_frontend&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_frontend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;did&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;js
  src&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;declarations&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_frontend&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_frontend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;did
&lt;span class=&quot;token property&quot;&gt;Generating type declarations for canister hello_backend:&lt;/span&gt;
  src&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;declarations&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_backend&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_backend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;did&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts
  src&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;declarations&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_backend&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_backend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;did&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;js
  src&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;declarations&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_backend&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;hello_backend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;did

Installing canisters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Installing code for canister hello_backend&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; with canister ID esbrt&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;3iaaa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;aaaap&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;qbfza&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;cai
Installing code for canister hello_frontend&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; with canister ID evaxh&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;wqaaa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;aaaap&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;qbfzq&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;cai
Uploading assets to asset canister&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Fetching properties for all assets in the canister&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Starting batch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;Staging contents of new and changed assets in batch 1:&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/favicon.ico&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15406&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;4e8d31b50ffb59695389d94e393d299c5693405a12f6ccd08c31bcf9b58db2d4&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/index.js.LICENSE.txt&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;413&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;f2dcfd36875be0296e171d0a6b1161de82510a3e60f4d54cc1b4bec0829f8b33&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/sample-asset.txt&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;2d523f5aaeb195da24dcff49b0d560a3d61b8af859cee78f4cff0428963929e6&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/index.js.LICENSE.txt&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;gzip&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;273&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;db89b3ccdfe399f8ef3135c0b076326a0ae9e1c96409f79f8e686031537c572c&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/main.css&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;gzip&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;299&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;b4879e7ba34e68b2965d626e48d772ce615e4f6b78b69cc8f2f91127ed18b850&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/logo2.svg&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15139&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;037eb7ae523403daa588cf4f47a34c56a3f5de08a5a2dd2364839e45f14f4b8b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/main.css&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;537&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;75ac0c5aea719bb2b887fffbde61867be5c3a9eceab3d75619763c28735891cb&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/index.html&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;539&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;053f9dc1283c64d114d43cbf03b0b0062afae08a04a5044ae58dbc68f4a1f93f&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/index.html&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;gzip&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;350&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;16289744897bd78f5df24924dac6972c19e0bb56f5ddcf695de65656b942d769&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/index.js&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;gzip&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;88324&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;03dd42729ce7df78926af89d9da96020425bc2ec160328ae6106e23e1b398efd&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token file-path string&quot;&gt;/index.js&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;246603&lt;/span&gt; bytes&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt; sha &lt;span class=&quot;token hash constant&quot;&gt;4224eb8e09f0b05e9077f0feb1f851d9594700d5bb08093e7bcd63f477833c4e&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;(&lt;/span&gt;with &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;)&lt;/span&gt;
Committing batch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Deployed canisters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;URLs:&lt;/span&gt;
  Frontend canister via browser
    &lt;span class=&quot;token property&quot;&gt;hello_frontend:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;https://evaxh-wqaaa-aaaap-qbfzq-cai.icp0.io/&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;Backend canister via Candid interface:&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;hello_backend:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.icp0.io/?id=esbrt-3iaaa-aaaap-qbfza-cai&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デプロイできました！
いくつか WARN がありますが、無事にデプロイされるとこのようなログが表示されます。&lt;/p&gt;
&lt;p&gt;公式手順ではデプロイした Canister に Cycle を追加する手順を紹介していますが、これは実行しなくても良いでしょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# 実行不要!!!
dfx ledger --network ic top-up gastn-uqaaa-aaaae-aaafq-cai --amount 1.005&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;バックエンドキャニスターを dfx コマンドで実行して確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx canister --network ic call hello_backend greet &apos;(&quot;everyone&quot;: text)&apos;
(&quot;Hello, everyone!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;つづいてブラウザからフロントエンドに繋いでみましょう！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test the dapp frontend&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;公式ガイドが dfx の仕様に対して古いため、公式手順とは少し異なります。&lt;/p&gt;
&lt;p&gt;デプロイしたときのログに hello_frontend の URL が表示されているのでそのままブラウザでアクセスすれば確認できます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;https://&amp;#x3C;hello_frontend のキャニスター ID&gt;.icp0.io/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;hello_frontend キャニスターの ID を知りたいときは&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister id --network ic hello_frontend&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f438ffeec25d8de5dde4eb4cfc6e1dd7/0a867/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAABk0lEQVR42p1Sa2+CQBD0//+gJmqMz29W0+CjiSZUBSo1AgLHS7ibZteCJEWbdJPJHXe7czO7tJRSYACAlIidCLYTAZ8GMtdH6glkfoT0IoBMQqUF4ypSKMlVqDiUQqv+QfG1tjF+WeN9/YqDruFtsYS20KB/6DiYBkzLhGEZEEEEmcvHhHwhFfJLjOIs4IkCcZAg8uMbwgQXN4DvhbzGpJCdqccKbwB+ngX3oY4yFO4i1J+ECkmSIE1T5HmOoigY1+uVQXv180JT7a8eSikxn88xHA6xXC4xnU6xWq2gaRr6/T5ms1mjsqcKKc7nM3RdZ+x2O1iWxaoJ/yJ0HAf7/R7H4xG2beN0OrHlLMueE1Z9rv7HOyn1kkg3mw1M00QURVVuUzAh9axpYnTu+z7b3W63MAyjIqS7Osp8JiQVQgguDsOQ97RScRzHbJNyyjwCnTeB7lrlALrdLkajEdubTCYYDAY86U6ng/F4jHa7jV6vxxMvVdbdUARBgBYxkxr68DyvWl3XZdAwyjMCOSlr6igVfgO6s+rvTv7SegAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;icp&quot;
        title=&quot;&quot;
        src=&quot;/static/f438ffeec25d8de5dde4eb4cfc6e1dd7/f058b/1.png&quot;
        srcset=&quot;/static/f438ffeec25d8de5dde4eb4cfc6e1dd7/c26ae/1.png 158w,
/static/f438ffeec25d8de5dde4eb4cfc6e1dd7/6bdcf/1.png 315w,
/static/f438ffeec25d8de5dde4eb4cfc6e1dd7/f058b/1.png 630w,
/static/f438ffeec25d8de5dde4eb4cfc6e1dd7/40601/1.png 945w,
/static/f438ffeec25d8de5dde4eb4cfc6e1dd7/0a867/1.png 986w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;このようにブラウザで確認できれば成功です。&lt;/p&gt;
&lt;h1&gt;おまけ: キャニスターの Cycle を引き出してウォレットに入れる&lt;/h1&gt;
&lt;p&gt;このまま終わっても良いですが、デプロイしたキャニスターにはそれぞれ 3 TCycle ほどデポジットされています。
キャニスターを削除すれば dfx identity の Cycle wallet に戻すことができます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cycle ウォレットの残高確認&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% dfx wallet balance --network ic
1.939 TC (trillion cycles).&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もともと 8.139 TC だったので 2 つのキャニスターのデプロイで 6.2 TC 消費したことになります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;キャニスターのステータス確認&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister status hello_frontend --network ic
dfx canister status hello_backend --network ic&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx canister status hello_frontend --network ic
Canister status call result for hello_frontend.
Status: Running
Controllers: gi5zp-fyaaa-aaaap-qbfwa-cai nmcsh-pngle-oimvf-zeu3q-jbynm-qw3vr-44mgt-biuks-xjweo-q2j36-vae
Memory allocation: 0
Compute allocation: 0
Freezing threshold: 2_592_000
Memory Size: Nat(2209774)
Balance: 2_996_668_686_422 Cycles
Module hash: 0xe7866e1949e3688a78d8d29bd63e1c13cd6bfb8fbe29444fa606a20e0b1e33f0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;キャニスターの Balance を見るとおよそ 3TCycle デポジットされていることを確認できます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;キャニスターの停止&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Status=Running のままだとキャニスターを削除できないので、先に stop にします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister stop hello_frontend --network ic
dfx canister stop hello_backend --network ic&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;キャニスターの削除&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister delete hello_frontend --network ic
dfx canister delete hello_backend --network ic&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Cycle ウォレットの残高確認&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx wallet balance --network ic
7.887 TC (trillion cycles).&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;全体で消費した量: 0.252 TC&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デプロイ前: 8.139 TC&lt;/li&gt;
&lt;li&gt;デプロイ後: 1.939 TC&lt;/li&gt;
&lt;li&gt;削除後: 7.887 TC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;デプロイ前後で消費した分: 6.2 TC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;8.139（デプロイ前）- 1.939 (デプロイ後)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;削除前後でウォレットに戻った分: 5.948 TC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.939 (削除前) - 7.887（削除後）&lt;/p&gt;
&lt;p&gt;おわり！&lt;/p&gt;
&lt;p&gt;よかったらシェアしてください&lt;/p&gt;</content:encoded></item><item><title><![CDATA[5ステップではじめる Motoko プログラミング | DFINITY ICP 入門]]></title><description><![CDATA[この記事はこんな人におすすめです Motoko エンジニア/プログラマを目指している(初心者) Internet Computer に興味がある ブロックチェーンや Dapps 開発に興味がある 将来 Web…]]></description><link>https://smacon.dev/posts/hello-motoko</link><guid isPermaLink="false">https://smacon.dev/posts/hello-motoko</guid><pubDate>Sat, 29 Apr 2023 20:30:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事はこんな人におすすめです&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Motoko エンジニア/プログラマを目指している(初心者)&lt;/li&gt;
&lt;li&gt;Internet Computer に興味がある&lt;/li&gt;
&lt;li&gt;ブロックチェーンや Dapps 開発に興味がある&lt;/li&gt;
&lt;li&gt;将来 Web エンジニアになりたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;はじめに&lt;/h1&gt;
&lt;p&gt;当記事で紹介する５つのステップは、DFINITY の公式ページに簡潔にまとまっています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/tutorials/deploy_sample_app&quot;&gt;Deploy your first ICP dapp in 5 minutes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Internet Computer は 2021 年 5 月にローンチしたサービスで、これまでの一般的な Web 開発をもっとシンプルに変えてくれます。&lt;/p&gt;
&lt;p&gt;インターネットそのものを TCP/IP のレイヤーから見直して再設計しており、裏側ではブロックチェーンやゼロ知識証明、秘密分散といった暗号技術を組み合わせて使っています。&lt;/p&gt;
&lt;p&gt;誰でもパソコンさえあれば簡単に始めることができるので、まずは実際にやってみましょう。&lt;/p&gt;
&lt;h2&gt;必要なスキル、前提知識&lt;/h2&gt;
&lt;p&gt;当記事を進めるためには、以下のスキルが必要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ターミナル等を使ってコマンドを入力できる（必須）&lt;/li&gt;
&lt;li&gt;npm コマンドを実行できる（任意）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コマンドは、cd と ls が使えれば大丈夫です。&lt;/p&gt;
&lt;p&gt;ステップ 5 でライブラリを使うために npm が登場しますが、必須ではありません。
ブラウザ経由でスマートコントラクトを実行するために npm を使っています。
npm がわからなくてもステップ 4 までは進めらるので、スマートコントを実行することができます。&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;p&gt;本記事では以下の Mac 環境を使った開発を紹介しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS: 12.5.1 Monterey&lt;/li&gt;
&lt;li&gt;dfx: 0.14.0&lt;/li&gt;
&lt;li&gt;node: v16.9.1&lt;/li&gt;
&lt;li&gt;npm: 7.21.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;ステップ 1: dfx(SDK)をインストールする&lt;/h1&gt;
&lt;p&gt;ターミナルソフトで以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ci&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://sdk.dfinity.org/install.sh&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで SDK のインストールは完了です。
dfx コマンドを実行できるようになります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ dfx &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;
dfx &lt;span class=&quot;token number&quot;&gt;0.14&lt;/span&gt;.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;ステップ 2: Hello World プロジェクトを作る&lt;/h1&gt;
&lt;p&gt;自分の好きな作業用ディレクトリを作って移動します。ぼくは dfinity というディレクトリを作っています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; dfinity
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; dfinity&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;dfinity ディレクトリの中に hello という名前の Hello World プロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;dfx new hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;少し時間がかかって以下のような画面が表示されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;added &lt;span class=&quot;token number&quot;&gt;405&lt;/span&gt; packages, and audited &lt;span class=&quot;token number&quot;&gt;406&lt;/span&gt; packages &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; 35s

&lt;span class=&quot;token number&quot;&gt;69&lt;/span&gt; packages are looking &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; funding
  run &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; fund&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; details

  Done.
Creating &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; repository&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.

&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
        Welcome to the internet computer developer community&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;
                        You&apos;re using dfx &lt;span class=&quot;token number&quot;&gt;0.14&lt;/span&gt;.0

            ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄                ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄      ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
       ▄▄▄▄▄▄▄▄▄▄▀▀▀▀▀▄▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄▄▀▀▀▀▀▀▄▄▄▄▄▄▄▄▄▄
      ▄▄▄▄▄▄▄▄▀         ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀         ▀▄▄▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄▀            ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀             ▄▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄               ▀▄▄▄▄▄▄▄▄▄▄▄▄▀                ▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄                ▄▄▄▄▄▄▄▄▄▄▄▄                 ▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄               ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄              ▄▄▄▄▄▄▄▄
      ▄▄▄▄▄▄▄▄           ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄          ▄▄▄▄▄▄▄▄▀
      ▀▄▄▄▄▄▄▄▄▄▄     ▄▄▄▄▄▄▄▄▄▄▄▄▀ ▀▄▄▄▄▄▄▄▄▄▄▄▄    ▄▄▄▄▄▄▄▄▄▄▄
       ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀     ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀
         ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀         ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
           ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀▀             ▀▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀
              ▀▀▀▀▀▀▀▀▀▀▀                    ▀▀▀▀▀▀▀▀▀▀▀



To learn &lt;span class=&quot;token function&quot;&gt;more&lt;/span&gt; before you start coding, see the documentation available online:

- Quick Start: https://internetcomputer.org/docs/current/tutorials/deploy_sample_app
- SDK Developer Tools: https://internetcomputer.org/docs/current/developer-docs/setup/install/
- Motoko Language Guide: https://internetcomputer.org/docs/current/motoko/main/about-this-guide
- Motoko Quick Reference: https://internetcomputer.org/docs/current/motoko/main/language-manual
- Rust CDK Guide: https://internetcomputer.org/docs/current/developer-docs/backend/rust/

If you want to work on programs right away, try the following commands to get started:

    &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; hello
    dfx &lt;span class=&quot;token builtin class-name&quot;&gt;help&lt;/span&gt;
    dfx new &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;tree コマンドで hello ディレクトリにどんなファイルが作られたのか見てみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt; % tree &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; hello
hello
├── README.md
├── dfx.json
├── node_modules
├── package-lock.json
├── package.json
├── src
└── webpack.config.js
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;ステップ 3: ローカル実行環境を起動する&lt;/h1&gt;
&lt;p&gt;hello ディレクトリに移動して、ローカル PC 上のテスト用 IC 環境を起動します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-bash line-numbers&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; hello
dfx start &lt;span class=&quot;token parameter variable&quot;&gt;--background&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のようなログが表示されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hello % dfx start --background
Running dfx start for version 0.14.0
Using the default definition for the &apos;local&apos; shared network because /Users/sakanosita/.config/dfx/networks.json does not exist.
Dashboard: http://localhost:50362/_/dashboard&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;一番最後にダッシュボードの URL が表示されるので、ブラウザでアクセスすると以下のような画面をみることができます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://localhost:50362/_/dashboard&quot;&gt;http://localhost:50362/_/dashboard&lt;/a&gt;
(ポート番号は環境によって変わるかもしれません)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/585b49d2b1052d7c12f993dd48d40dfc/191e2/3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.9873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABkklEQVR42p2TW2+jMBCF+f9/q0+tUCO6IUq4FQ8EFwgXk0IhXM7Kk33YNmnTdqRPPh7bx8MgG7ZtY7PZIAxDOI4Dy3qC67qwLItZr9cwTROr1Qq+70PHsiyfYujDeqM28zwXu92WR51XSqFpGtR1zbpt29uGurIoipCmLyiKEnGcI4oyNM0R1+IrMzYkImi6rkXfn+A4JYh6jCMfxzwvN03eGQqhKyRImSAIfFTVEdN0ruQ3YRC9gChFlikEwR6HQ4NhALpuQtvOaNvpP8YP80uMspyR5xP2+w5J8gYpe9Zx3CGKXkHU8KgRomGIjhBCsdb5MFSc09ogiuH7IYZh5E8dx+UqH9f0/BqGlBJCENJU4XSav92rT39KHDfYbjMI8YY0nXE4LCB6RRBU8P0Knlcwz8/qny55ra6BqlouMGw7wt3dH5imi/v7HfP4GDBSDnh4cBits2xGkvRwnBxFAb68KN5jSHmE56Xw/ZxHDVHF6BvDsIQQZ63Uuaos67nCul4uML7u02XfbvbwJ6/gOy/lL8IlMm7+56wUAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;icp&quot;
        title=&quot;&quot;
        src=&quot;/static/585b49d2b1052d7c12f993dd48d40dfc/f058b/3.png&quot;
        srcset=&quot;/static/585b49d2b1052d7c12f993dd48d40dfc/c26ae/3.png 158w,
/static/585b49d2b1052d7c12f993dd48d40dfc/6bdcf/3.png 315w,
/static/585b49d2b1052d7c12f993dd48d40dfc/f058b/3.png 630w,
/static/585b49d2b1052d7c12f993dd48d40dfc/40601/3.png 945w,
/static/585b49d2b1052d7c12f993dd48d40dfc/78612/3.png 1260w,
/static/585b49d2b1052d7c12f993dd48d40dfc/191e2/3.png 1836w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;これであなたの PC 上にテスト用の Internet Computer が起動できました。
&lt;code class=&quot;language-text&quot;&gt;dfx ping&lt;/code&gt; コマンドを打つと、つながるかどうか疎通を確認できます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;hello &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; dfx ping
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;ic_api_version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.18.0&quot;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;impl_hash&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;8907d861e568171490efc74e7ae687d55aa5f9497a6a2c686d6d5df44556cbe1&quot;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;impl_version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.8.0&quot;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;replica_health_status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;healthy&quot;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&quot;root_key&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;129&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;29&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;220&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;124&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;220&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;124&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;97&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;141&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;198&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;109&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;225&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;153&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;113&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;230&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;222&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;56&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;71&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;153&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;112&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;178&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;173&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;86&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;211&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;231&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;125&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;156&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;66&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;122&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;226&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;136&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;220&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;145&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;107&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;67&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;209&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;92&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;234&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;147&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;150&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;135&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;133&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;121&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;210&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;157&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;252&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;145&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;72&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;183&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;206&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;73&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;251&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;86&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;146&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;184&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;209&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;49&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;205&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;249&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;143&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;71&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;220&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;150&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;179&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;252&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;110&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;159&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;186&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;61&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;71&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;62&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;231&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;247&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;254&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;69&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;151&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;122&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;34&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;197&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;194&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;122&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;178&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;117&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;71&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;169&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;142&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;189&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;94&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;202&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;77&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;77&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;151&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;197&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記のようにエラーではなく JSON フォーマットの謎の数字が返ってきたら成功です。&lt;/p&gt;
&lt;h1&gt;ステップ 4: ビルドしてデプロイする&lt;/h1&gt;
&lt;p&gt;以下のコマンドを実行してフロントエンド用のライブラリをインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;npm を使って JavaScript のライブラリをインストールしています。&lt;/p&gt;
&lt;p&gt;フロントエンドのプログラムは Chrome などのブラウザで実行することになるので、DFINITY の場合でも、そうじゃなくても同じ JavaScript を使います。&lt;/p&gt;
&lt;p&gt;続いて、Hello World プログラムをビルドしてローカル実行環境にデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このコマンドの最後に出力されるログをメモしておきましょう。
具体的には以下のように表示された URL にあとえブラウザからアクセスします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Deployed canisters.
URLs:
  Frontend canister via browser
    hello_frontend: http://127.0.0.1:4943/?canisterId=bd3sg-teaaa-aaaaa-qaaba-cai
  Backend canister via Candid interface:
    hello_backend: http://127.0.0.1:4943/?canisterId=be2us-64aaa-aaaaa-qaabq-cai&amp;amp;id=bkyz2-fmaaa-aaaaa-qaaaq-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この &lt;code class=&quot;language-text&quot;&gt;dfx deploy&lt;/code&gt; コマンドでは、以下の 3 つのことをまとめてやってくれます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローカル実行環境にキャニスターを作る（ID を取得する）&lt;/li&gt;
&lt;li&gt;Motoko で書いたソースコードをコンパイルして、WASM 実行プログラムを作る&lt;/li&gt;
&lt;li&gt;WAS 実行プログラムをキャニスターにインストールする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;キャニスターや WASM について今はわからなくても大丈夫です。この３つはそれぞれ以下のコマンドで個別に実行することができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dfx canister create&lt;/li&gt;
&lt;li&gt;dfx build&lt;/li&gt;
&lt;li&gt;dfx canister install&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;dfx deploy はこの３つをまとめて、しかも終わっていないところだけを実行してくれる便利なコマンドです。&lt;/p&gt;
&lt;h1&gt;ステップ 5: Hello World プログラムを実行する&lt;/h1&gt;
&lt;p&gt;以下のコマンドを実行すると、ローカル PC 上の Internet Computer で動くキャニスターを実行することができます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call hello_backend greet everyone&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このコマンドの意味は以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キャニスターの別名: hello_backend&lt;/li&gt;
&lt;li&gt;実行する関数(命令): greet&lt;/li&gt;
&lt;li&gt;関数に渡す値: everyone&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ dfx canister call hello_backend greet everyone
(&quot;Hello, everyone!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;解説&lt;/h3&gt;
&lt;p&gt;本来 Internet Computer 上でキャニスターを指定する場合はキャニスター ID を使います。
しかし、dfx コマンドの機能として、キャニスター ID に名前をつけて使うことができます。
キャニスターの名前は、dfx.json によってつけられており、
キャニスター ID との紐付けは &lt;code class=&quot;language-text&quot;&gt;./.dfx/local/canister_ids.json&lt;/code&gt; で確認できます。&lt;/p&gt;
&lt;p&gt;今後は、作ったプログラムをブラウザで呼び出してみましょう。
フロントエンドのプログラムを起動します&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm start&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;先ほどメモしておいた、&lt;code class=&quot;language-text&quot;&gt;dfx deploy&lt;/code&gt; の出力に含まれる URL にアクセスしてください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://127.0.0.1:4943/?canisterId=(%E3%82%AD%E3%83%A3%E3%83%8B%E3%82%B9%E3%82%BF%E3%83%BCID)&quot;&gt;http://127.0.0.1:4943/?canisterId=(キャニスターID)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/176060430acd0f9a6c52984dde8f03e5/6a5c3/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.39240506329114%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABO0lEQVR42oVRXUvDMBTtf/dp+KLioyCyZ3+B2L4pOHBjOgW71qLr1E5rtUmbfqRHEhpJP7ZeuCTknnNy7r0G2lFV9VE1nnkDUmFbGB09Qa4JzibB0eQDUwLAm4OcH6BcP9aivFfYQOtnBSryEuP9Syw2KfasF1ycnQKvU/CbEXiR/HfTFu06FIAaszi5Bju2kB6aGD1kGLshnm1zZ+sdhyLKsgShBPF3hJ8rGyyMQFmKySpE8JsiTVLked4ralTaEtQ9JgSWaeHJtvFJI9zOZrif3+HrfY03fwV7aSOO4wZPcY2hrUGrtWG9LesOi6KQ7XLO5SlSd6BS1HVXDYf63FzXhed58H0fjuMgDEP5CWNMppibwAdBIOuU0u2C6lE5Ey50JzpJ1LMsk/WO4OAMsXtug1seyr7N6g7/AJ42qGH76MtXAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;icp&quot;
        title=&quot;&quot;
        src=&quot;/static/176060430acd0f9a6c52984dde8f03e5/f058b/1.png&quot;
        srcset=&quot;/static/176060430acd0f9a6c52984dde8f03e5/c26ae/1.png 158w,
/static/176060430acd0f9a6c52984dde8f03e5/6bdcf/1.png 315w,
/static/176060430acd0f9a6c52984dde8f03e5/f058b/1.png 630w,
/static/176060430acd0f9a6c52984dde8f03e5/40601/1.png 945w,
/static/176060430acd0f9a6c52984dde8f03e5/78612/1.png 1260w,
/static/176060430acd0f9a6c52984dde8f03e5/6a5c3/1.png 1646w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;名前をいれてクリックしてみましょう、先程ローカルの IC にデプロイしたキャニスターを実行して結果をブラウザで表示します。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/81c796cf1e15409a853f907b7a3ce006/2aa89/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.12658227848101%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABWklEQVR42nVTTU/CQBDtTzfxD3jwoidPHvBgQgxHE24NohwMqJQ0IG3agi1ISem2u31mVnZTynaSl8nOvPnOWmhIVVUn+miFMHBwwvkXCwZRAWkp0HM2WHMA2wiZ/QSR7TSnMsRazUQKJJ27F3Rnv7h8XWF6fwMMOhCjW5lIcmrc1g4VkWRw3Qcehvi+esbFcIt+lCCado9LwFkyY4ckggswXiCLd4gf3wDvB2vG0ZutsEpzsJxBCGHYNWDVj6B3l6awbRuTzw+EaYLR+B1fkzE2oY/A9+A4DhhjZ3G6w7pBETjnUouSy244F+Ciaj3gWcLKsOC2gzWnqttORg6CAPP5HFEUYbFYII5jaUuSBEVRoCxLzSM/2ZpFZYfkIIRhiOVyqUGBh8MBeZ5rDiHLMuz3e7lHKkJ+0npkIpHT9314nie7dF1XvpWvDpVYvamoTmj+au27a4Ma+Q+C+KUC9GxyEQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;icp&quot;
        title=&quot;&quot;
        src=&quot;/static/81c796cf1e15409a853f907b7a3ce006/f058b/2.png&quot;
        srcset=&quot;/static/81c796cf1e15409a853f907b7a3ce006/c26ae/2.png 158w,
/static/81c796cf1e15409a853f907b7a3ce006/6bdcf/2.png 315w,
/static/81c796cf1e15409a853f907b7a3ce006/f058b/2.png 630w,
/static/81c796cf1e15409a853f907b7a3ce006/40601/2.png 945w,
/static/81c796cf1e15409a853f907b7a3ce006/78612/2.png 1260w,
/static/81c796cf1e15409a853f907b7a3ce006/2aa89/2.png 1698w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;今は、ローカル PC 上の実行環境にデプロイしたプログラム（キャニスター）を呼び出しています。&lt;/p&gt;
&lt;p&gt;これから ICP トークンや Cycle トークンを使って、インターネット上の Internet Computer にキャニスターをデプロイすることで、世界中のどこからでも自分の作るキャニスターを呼び出せるようになります。&lt;/p&gt;
&lt;p&gt;Internet Computer の世界へようこそ&lt;/p&gt;
&lt;p&gt;公式のチュートリアルや Examples を日本語で解説しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-explore-hello&quot;&gt;DFINITY プロジェクトの始め方&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-actor-hello&quot;&gt;はじめてのアクター&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-location-hello&quot;&gt;パラメータを渡してキャニスターを実行する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-my-counter&quot;&gt;Candid UI を使ってキャニスターを実行する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-calc&quot;&gt;簡単な数値計算&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-phonebook&quot;&gt;ライブラリを使って簡単な電話帳アプリを作ろう&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-multiple-actors&quot;&gt;複数のアクター&amp;#x26;キャニスター&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-linkedup&quot;&gt;キャニスター間の関数呼び出し&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/access-hello&quot;&gt;ID とアクセス管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/cycles-hello&quot;&gt;CYCLE ウォレットとキャニスター&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Start Coding for DFINITY]]></title><description><![CDATA[INTERNET COMPUTER Developer Docs https://internetcomputer.org/docs/current/home Sample Code https://internetcomputer.org/samples Motoko SDK…]]></description><link>https://smacon.dev/posts/dfinity-coding</link><guid isPermaLink="false">https://smacon.dev/posts/dfinity-coding</guid><pubDate>Sat, 29 Apr 2023 18:38:00 GMT</pubDate><content:encoded>&lt;h1&gt;INTERNET COMPUTER Developer Docs&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/home&quot;&gt;https://internetcomputer.org/docs/current/home&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Sample Code&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/samples&quot;&gt;https://internetcomputer.org/samples&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Motoko SDK&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/about-this-guide&quot;&gt;https://internetcomputer.org/docs/current/motoko/main/about-this-guide&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/&quot;&gt;Motoko Base Library Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://m7sm4-2iaaa-aaaab-qabra-cai.raw.ic0.app/&quot;&gt;Motoko Playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4OfarwFrPIg&quot;&gt;Overview of Motoko, the Native Language of the IC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fFaNLKAgoUU&quot;&gt;Overview of Building a Dapp in Motoko&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Rust SDK&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/rust/&quot;&gt;https://internetcomputer.org/docs/current/developer-docs/backend/rust/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=36L33S_DYHY&quot;&gt;Best Practices for Canisters in Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Dev Forum&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.dfinity.org/&quot;&gt;https://forum.dfinity.org/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;NFID&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://nfid.one/&quot;&gt;https://nfid.one/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.nfid.one/&quot;&gt;NFID Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Community Consideration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/non-fungible-token-nft-standard-community-consideration/6157&quot;&gt;Non Fungible Token (NFT) Standard&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Toniq-Labs/extendable-token&quot;&gt;EXT Standard (Toniq Labs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/stopak/ICPunks&quot;&gt;ICPunks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DepartureLabsIC/non-fungible-token&quot;&gt;DepartureLabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Psychedelic/DIP721&quot;&gt;DIP721 (Psychedelic)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/fungible-token-standard-community-consideration/6158&quot;&gt;Fungible Token Standard&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Psychedelic/DIP20&quot;&gt;DIP20 (Psychedelic)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dft.delandlabs.com/&quot;&gt;DFT Standard (Deland Labs)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Psychedelic/dab/blob/main/registries/nft/list.json&quot;&gt;DAB NFT List&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Community Conversations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Hm-NWwiUQZw&quot;&gt;ICP on Canister / Roman Kashitsyn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=JAQ1dkFvfPI&quot;&gt;How to Host a Website on the Internet Computer / Kyle Peacock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=2d4FD6eF13I&quot;&gt;Achievement Unblocked / Michael Hunte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=iPIXE97DFsw&quot;&gt;Reproducible Canister Builds, Or: What Code Is This Canister Running&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xxeKGqwDi_4&quot;&gt;Optimizing The Memory System / Ulan Degenbaev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=NXPkBkzkBZo&quot;&gt;Replicated State / Roman Kashitsyn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-wFkX4r2KcA&quot;&gt;Crypto Component / Andrea Cerulli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=im5HBRd3mqo&quot;&gt;The Ledger Canister / Bogdan Warinschi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=vCyQb9IHNQY&quot;&gt;Internet Identity / Bjorn Tackmann&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=L4443aaAP5A&quot;&gt;Service Nervous System / Lara Schmid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YL4R4jQ78u0&quot;&gt;Charging Canister Cycles&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://assets.ctfassets.net/ywqk17d3hsnp/2raWECOfhx8qZiJTS5QtlA/541072e45c1fc288f904e345703b72b1/Charging_canisters_cycles_on_the_IC.pdf&quot;&gt;Deck&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=nl5BuiWClD0&quot;&gt;Randomness / Manu Drijvers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=hoYo-c9SMfQ&quot;&gt;Overview of the Developer Grants Program&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=MulbKPwv6_s&quot;&gt;Threshold ECDSA Signing / Victor Shoup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YGG1s37juDY&quot;&gt;Increased Canister Storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=iGICt5NPADo&quot;&gt;Toniq Labs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=n9tU9VM-ZBs&quot;&gt;Departure Labs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dfinity.org/grants/&quot;&gt;Grants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discord.com/invite/cA7y6ezyE2&quot;&gt;Discord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://t.me/dfinity/&quot;&gt;Telegram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;In-site Pages&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-overview&quot;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/inside-icp&quot;&gt;Technology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-coding&quot;&gt;Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-roadmap&quot;&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[イーサリアム入門: オラクルのしくみ（Chainlink Data Feeds）]]></title><description><![CDATA[オラクルはスマートコントラクトがオフチェーンの情報を利用するときに使います。 通常の Web サービスでは、他のサービスに HTTP のリクエストを投げて外部の API を実行できます。しかしイーサリアムでは EVM 上のスマートコントラクトから直接 TCP/IP…]]></description><link>https://smacon.dev/posts/oracle</link><guid isPermaLink="false">https://smacon.dev/posts/oracle</guid><pubDate>Sat, 27 Aug 2022 19:00:00 GMT</pubDate><content:encoded>&lt;p&gt;オラクルはスマートコントラクトがオフチェーンの情報を利用するときに使います。&lt;/p&gt;
&lt;p&gt;通常の Web サービスでは、他のサービスに HTTP のリクエストを投げて外部の API を実行できます。しかしイーサリアムでは EVM 上のスマートコントラクトから直接 TCP/IP のリクエストを投げることはできません。&lt;/p&gt;
&lt;p&gt;そのため、オフチェーンのデータを間接的に取得してスマートコントラクトから利用できるようにオラクルというしくみがあります。&lt;/p&gt;
&lt;p&gt;代表的なオラクルの１つに Chainlink があります。このページでは Chainlink Data Feeds を使ってオラクルのしくみを見ていきましょう。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.chain.link/docs/architecture-overview/&quot;&gt;Architecture Overview (Chainlink Docs)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;もし、Solidity における実装方法を知りたい場合はこちらをどうぞ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/price-oracle&quot;&gt;Solidity 入門: オラクルを使う&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;構成要素の説明&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 503px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1e3469cdb25e08cf22fd2bec39103e1c/a4078/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 93.67088607594937%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAADLUlEQVR42lVUZ3PaUBCUO26422AbCfWGGiDAQoBwSexk4pn4c+L8/1+xmT1GTPLhRk/ibndv7x6KoijY3t6G7TjoDwYYDnNMpyXy0QieHyCKYmRZH+VshjhO0Isi+RaEITzfh2lZEjzv7OxAIaCqavj6+oas34cfBMiyTEAfiila7VtYtoNFtYSqdXF335HoqBpcz0cvimFatpwJLIB5nuOhKHB7ewvHcZCmKVRVxaKqMC1nmC8q5KMxUlE6l298UnWaZaiqSsiDIIRimiZGo5F8KIoChmnCdT2U5QyD4VCYqdBxPYwnD1g+PuHX70+UZQlNVRHHMTRNk1oSCWCaZjBtejjE49MzytkCYS9CVzcEaJiPMK+WopC+Ui0toC3VcilRTEvBUYgeJ4n4YFoODMuG1tUFjIzFdArfD6AbBoIgwHyxwI/3dximDcf14QehBDuh/8rNzY0ksi0vCEWRYVrSXpKkcF0XvV4PnueJv61WSyZKD1VNX9uxAgxXQ+nqurRCVVrXgG6YkshWh3kOXddxd3cH3/cFeLGoEMWJTN12vDUgOxXA4+NjRHEsviVpJkG/OCh69fn5Bz8/PvD27TueX75g8lAgTlLJYfBMgrOzMyjKxgZRsbe3h8PDQzSbTVxcXODq6koSOh1V1uLy8lLi6OgIzeaJBNvnqt3f3+P8/BwbKywFdezu7krSycmJgBJA01S0221sbW2t8zY3N+X3/UYDhmFgPB6LINYpVMSrRwb6xEICcQAcCAtZNJ/PxUsWdbtdvL6+yjOKItlF/sYOZQ8tyxKwWgEVTSYTuUG8Mfv7+3JPCUx1dR69Z8uMTqezUsg9tG1bXrhC9I2KCXp9fS2eUXWtnOT8RlUEIRlvyenpqZwVKmAS26MinplIVq4J7zX3lO8kHgwG4jMB67vPOu6qTLn2ikBsiSD0k2xhGEoifWLLHNrBwcF/LdNH2sYn62TKbIdsTGBRPXES1B0wOE2aT6UvLy+ST2v6/b7k8329Nhw7GeglVVI11ROUntHfRqMh5FRPP9k6/6loA3Nlyv/uIZO5JmTl1Okll5ZL/u906yAwyQjE4DD/AhMyDWRotDd4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;chainlink&quot;
        title=&quot;&quot;
        src=&quot;/static/1e3469cdb25e08cf22fd2bec39103e1c/a4078/2.png&quot;
        srcset=&quot;/static/1e3469cdb25e08cf22fd2bec39103e1c/c26ae/2.png 158w,
/static/1e3469cdb25e08cf22fd2bec39103e1c/6bdcf/2.png 315w,
/static/1e3469cdb25e08cf22fd2bec39103e1c/a4078/2.png 503w&quot;
        sizes=&quot;(max-width: 503px) 100vw, 503px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Consumer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一般の開発者が作るスマートコントラクト&lt;/li&gt;
&lt;li&gt;オフチェーンのデータを使うときは、同じチェーン上のスマートコントラクトである Proxy の関数を実行して、Aggregator が保持する state を参照できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Proxy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Chainlink によって各チェーン上にデプロイされたスマートコントラクト&lt;/li&gt;
&lt;li&gt;Proxy は Aggregator のコントラクトアドレスを保持しており、Aggregator を変更する場合でも Proxy のコントラクトアドレスが変わらないため、Consumer は継続してオラクルを利用できる&lt;/li&gt;
&lt;li&gt;仮に Proxy の秘密鍵の保持者に悪意があれば、参照する Aggregator を変更できてしまうので Proxy の Owner を信頼しなければならない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Aggregator&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Chainlink によって各チェーン上にデプロイされたスマートコントラクト&lt;/li&gt;
&lt;li&gt;Consumer が利用したいオフチェーンの情報を保持し、一定間隔で更新する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Off Chain Node&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Chainlink の P2P ネットワークを構成するクライアント&lt;/li&gt;
&lt;li&gt;オフチェーンにあり、インターネット上の任意の API を実行できる&lt;/li&gt;
&lt;li&gt;一定間隔で Aggregator の Write 関数を実行して、ブロックチェーンにデータを送る&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;OCR (Off Chain Reporting)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.chain.link/docs/off-chain-reporting/&quot;&gt;https://docs.chain.link/docs/off-chain-reporting/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;従来は、各 Off Chain Node が個別に Aggregator にデータを送っていましたが、トランザクションが輻輳したり全体の Gas 代が高くなるというデメリットがありました。&lt;/p&gt;
&lt;p&gt;それを改善するため OCR という新しいしくみにアップグレードしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;P2P ノード間でリーダーを選出して、全体でレポートを作成、署名&lt;/li&gt;
&lt;li&gt;全体で署名したレポートを代表するノードが Aggregator に提出&lt;/li&gt;
&lt;li&gt;Aggregator は署名を確認し、全体の中央値を選ぶ&lt;/li&gt;
&lt;li&gt;リーダーやレポートを提出するノードはラウンドごとに入れ替わる&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;実際の Aggregator の state を覗いてみよう&lt;/h1&gt;
&lt;p&gt;実際に Ethereum のメインネットで Proxy や Aggregator コントラクトの関数を実行してみましょう。
Read 関数なので Gas 代はかかりません。&lt;/p&gt;
&lt;p&gt;各チェーンの Proxy のコントラクトアドレスは Chainlink の Documentation に載っています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.chain.link/docs/ethereum-addresses/&quot;&gt;Ethereum Data Feeds&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上のページには ETH / USD の Proxy コントラクトアドレスが載っています。&lt;/p&gt;
&lt;p&gt;Etherscan で見てみましょう。&lt;/p&gt;
&lt;h2&gt;Proxy&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://etherscan.io/address/0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419&quot;&gt;https://etherscan.io/address/0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Contract Name: EACAggregatorProxy&lt;/p&gt;
&lt;p&gt;[Contract] -&gt; [Read Contract] -&gt; [aggregator]をクリックすると Aggregator のアドレスがわかります。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/252a6d8aff472ab06bb5a66b5cdcbe49/36909/3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.9746835443038%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA40lEQVR42p2Q22rDMBBE9f9/14fSNqkvKQmhJODajqzV9ZRVQslLituBw77MrjRjYkyIeKzzDIvHLo6LXeqcLxbvAyFGQniMegrQbjrM0/Mb23bHZB2TC6SU0UdSSsQYKUWt1PmQnKvnuH3H9B97Pk9ncs4/y/f69ZD6SyHEjAD9Zo8ZhoEQQv229x7xHifr0boWJ0gM7Joz5jRaZkmMLjAtV0ONna6x16DVqJr+iFnE40NEtNxbydqhmtaiO6q2OWCGr7HGdSJ3UeRPaOSYE+1rhxmnuR6UW3//wTkhlUL3suEbs85wdJQWHL4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;chainlink&quot;
        title=&quot;&quot;
        src=&quot;/static/252a6d8aff472ab06bb5a66b5cdcbe49/f058b/3.png&quot;
        srcset=&quot;/static/252a6d8aff472ab06bb5a66b5cdcbe49/c26ae/3.png 158w,
/static/252a6d8aff472ab06bb5a66b5cdcbe49/6bdcf/3.png 315w,
/static/252a6d8aff472ab06bb5a66b5cdcbe49/f058b/3.png 630w,
/static/252a6d8aff472ab06bb5a66b5cdcbe49/40601/3.png 945w,
/static/252a6d8aff472ab06bb5a66b5cdcbe49/78612/3.png 1260w,
/static/252a6d8aff472ab06bb5a66b5cdcbe49/36909/3.png 2772w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Aggregator&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://etherscan.io/address/0x37bc7498f4ff12c19678ee8fe19d713b87f6a9e6#code&quot;&gt;https://etherscan.io/address/0x37bc7498f4ff12c19678ee8fe19d713b87f6a9e6#code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Contract Name: AccessControlledOffchainAggregator&lt;/p&gt;
&lt;p&gt;[Contract] -&gt; [Read Contract] -&gt; [latestRoundData]をクリックすると以下のような複数の値を表示します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;  roundId|uint80 :  17400
  answer|int256 :  331512291099
  startedAt|uint256 :  1642312505
  updatedAt|uint256 :  1642312505
  answeredInRound|uint80 :  17400&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;ラウンド ID&lt;/h3&gt;
&lt;p&gt;現在のラウンド、つまり Chainlink が定義する集計間隔です。&lt;/p&gt;
&lt;h3&gt;answer&lt;/h3&gt;
&lt;p&gt;価格情報です。この Aggregator は ETH/USD の価格を持っています。
桁数が大きいので 10 の 8 乗で割ってみましょう。&lt;/p&gt;
&lt;p&gt;331512291099 / 10^8 = 3,315&lt;/p&gt;
&lt;p&gt;3,315 が現在の Chainlink が提供する ETH/USD の価格情報です。&lt;/p&gt;
&lt;h3&gt;startedAt/updatedAt&lt;/h3&gt;
&lt;p&gt;これはプログラマにはおなじみの Unix タイムスタンプ形式の日時情報です。&lt;/p&gt;
&lt;p&gt;1642312505 を ISO8601 フォーマットに変換すると以下のとおりです。&lt;/p&gt;
&lt;p&gt;2022-01-16T06:31:12+00:00&lt;/p&gt;
&lt;h1&gt;実際のレポート提出トランザクションを見てみよう&lt;/h1&gt;
&lt;p&gt;Aggregator の Transactions を見ると、Off Chain Node から提出されたレポートの内容がわかります。&lt;/p&gt;
&lt;p&gt;直前に送られた Transmit のトランザクション
&lt;a href=&quot;https://etherscan.io/tx/0xf56f41524a2fe7178b1d12bb0964221047438818e6d46f1b7eb0fc1aecb33192#eventlog&quot;&gt;https://etherscan.io/tx/0xf56f41524a2fe7178b1d12bb0964221047438818e6d46f1b7eb0fc1aecb33192#eventlog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下のようなログが見れます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;answer :
331512291099
transmitter :
0xdbfea8d5822141c13f92caa06eb94d0f3d67c243
observations :
331121345032
331136000000
331173629766
331175000000
331186000000
331200000000
331285910333
331302646333
（省略）&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このラウンドで集められた価格情報の中央値が answer になっています。&lt;/p&gt;
&lt;p&gt;transmitter のアドレスは、このコントラクトの Write 関数を実行したアカウント(EOA)です。&lt;/p&gt;
&lt;p&gt;Chainlink の Off Chain Node がこのアカウントを使ってレポートを提出したようです。&lt;/p&gt;
&lt;p&gt;このデータフィードでは、１つのレポートにまとめて送っているので OCR を使っているようです。&lt;/p&gt;
&lt;p&gt;ほかのネットワーク上の Proxy/Aggregator や、ETH/USD 以外の Price Feeds など、いろいろ調べてみてください！&lt;/p&gt;
&lt;p&gt;Solidity におけるオラクルの使い方を知りたい場合はこちらをどうぞ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/price-oracle&quot;&gt;Solidity 入門: オラクルを使う&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Solidity ではじめるスマートコントラクト入門 | Web3 プログラミング学習]]></title><link>https://smacon.dev/solidity/</link><guid isPermaLink="false">https://smacon.dev/solidity/</guid><pubDate>Mon, 20 Jun 2022 10:00:00 GMT</pubDate><content:encoded></content:encoded></item><item><title><![CDATA[Hardhat の使い方: 初心者向けの Solidity 開発入門]]></title><description><![CDATA[このページはこんな人におすすめ Solidity を学習したい テストネットやメインネットにスマートコントラクトを作りたい Hardhat の使い方を知りたい Hardhat は 2022 年現在、Solidity…]]></description><link>https://smacon.dev/posts/hardhat</link><guid isPermaLink="false">https://smacon.dev/posts/hardhat</guid><pubDate>Sun, 19 Jun 2022 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solidity を学習したい&lt;/li&gt;
&lt;li&gt;テストネットやメインネットにスマートコントラクトを作りたい&lt;/li&gt;
&lt;li&gt;Hardhat の使い方を知りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardhat は 2022 年現在、Solidity エンジニアの間でもっともよく使われている開発ツールの１つです。&lt;/p&gt;
&lt;p&gt;Hardhat 以外によく使われるツールとしては Truffle があります。
Hardhat の方が新しくビルドやテストでより使いやすくなっています。&lt;/p&gt;
&lt;p&gt;このページでは、Hardhat のチュートリアルを日本語で解説しています。
チュートリアルの中からテストネットでの実行に必要な部分を抜粋しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hardhat.org/tutorial/&quot;&gt;https://hardhat.org/tutorial/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このページで実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/solidity-example/tree/main/hardhat-tutorial&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;h1&gt;インストール&lt;/h1&gt;
&lt;p&gt;Hardhat の Document にしたがいインストールを進めます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hardhat.org/tutorial/setting-up-the-environment.html&quot;&gt;https://hardhat.org/tutorial/setting-up-the-environment.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hardhat を使うには、Nodejs のパッケージマネージャ npm を使います。&lt;/p&gt;
&lt;p&gt;Hardhat はプロジェクトごとにインストールするので、この時点では PC のターミナルで npm コマンドを実行できれば環境構築は完了です。&lt;/p&gt;
&lt;h2&gt;Hardhat プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;hardhat-tutorial という npm 用のプロジェクトを作り、hardhat をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir hardhat-tutorial
cd hardhat-tutorial
npm init --yes
npm install --save-dev hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;新しいプロジェクトに Hardhat をインストールできました。
hardhat コマンドを実行して、hardhat の設定ファイルを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;npx というコマンドは npm によってインストールしたコマンドを実行するためのコマンドです。
npm でインストールしたコマンドをそのまま入力しても見つけられないので npx を使います。&lt;/p&gt;
&lt;p&gt;選択肢が表示されたら、&lt;code class=&quot;language-text&quot;&gt;Create an empty hardhat.config.js&lt;/code&gt;を選びます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What do you want to do? …
  Create a sample project
❯ Create an empty hardhat.config.js
  Quit&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;プロジェクトディレクトリに Hardhat の設定ファイル&lt;code class=&quot;language-text&quot;&gt;hardhat.config.js&lt;/code&gt;が作られます。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Create a sample project&lt;/code&gt;を選択すれば、このあとの作業をもっと簡単にすすめることができます。&lt;/p&gt;
&lt;p&gt;ここではプロジェクトの構成を理解するために、1 つ 1 つ自分で作っていきましょう。&lt;/p&gt;
&lt;h2&gt;プラグインの追加&lt;/h2&gt;
&lt;p&gt;ether.js や waffle といった Hardhat のプラグインを追加します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;スマートコントラクトの作成&lt;/h1&gt;
&lt;h2&gt;コーディング&lt;/h2&gt;
&lt;p&gt;hardhat.config.js を以下のように編集します。&lt;/p&gt;
&lt;h3&gt;hardhat.config.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nomiclabs/hardhat-waffle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * @type import(&apos;hardhat/config&apos;).HardhatUserConfig
 */&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.7.3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;執筆時点での Hardhat のドキュメントのコードをそのまま使っています。
Solidity のバージョンが少し古いので、バージョン番号は適宜更新してください。&lt;/p&gt;
&lt;p&gt;プロジェクトに contracts というディレクトリを作りましょう。
contracts ディレクトリの中に Token.sol というファイルを作り、下のコードを書きます。&lt;/p&gt;
&lt;h3&gt;contracts/Token.sol&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Solidity files have to start with this pragma.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// It will be used by the Solidity compiler to validate its version.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.7.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;// This is the main building block for smart contracts.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Token&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Some string type variables to identify the token.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// The `public` modifier makes a variable readable from outside the contract.&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;My Hardhat Token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; symbol &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MHT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// The fixed amount of tokens stored in an unsigned integer type variable.&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; totalSupply &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// An address type variable is used to store ethereum accounts.&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;address&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; owner&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// A mapping is a key/value map. Here we store each account balance.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;address&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; balances&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/**
     * Contract initialization.
     *
     * The `constructor` is executed only once when the contract is created.
     */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// The totalSupply is assigned to transaction sender, which is the account&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// that is deploying the contract.&lt;/span&gt;
        balances&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sender&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; totalSupply&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        owner &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sender&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/**
     * A function to transfer tokens.
     *
     * The `external` modifier makes a function *only* callable from outside
     * the contract.
     */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;transfer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;address&lt;/span&gt; to&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; amount&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;external&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Check if the transaction sender has enough tokens.&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// If `require`&apos;s first argument evaluates to `false` then the&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// transaction will revert.&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;balances&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sender&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; amount&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Not enough tokens&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// Transfer the amount.&lt;/span&gt;
        balances&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sender&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; amount&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        balances&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; amount&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/**
     * Read only function to retrieve the token balance of a given account.
     *
     * The `view` modifier indicates that it doesn&apos;t modify the contract&apos;s
     * state, which allows us to call it without executing a transaction.
     */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;balanceOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;address&lt;/span&gt; account&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;external&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; balances&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;account&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コンパイル&lt;/h2&gt;
&lt;p&gt;hardhat コマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat compile&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Downloading compiler 0.7.3
Compiling 1 file with 0.7.3
contracts/Token.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing &quot;SPDX-License-Identifier: &amp;lt;SPDX-License&gt;&quot; to each source file. Use &quot;SPDX-License-Identifier: UNLICENSED&quot; for non-open-source code. Please see https://spdx.org for more information.

Compilation finished successfully
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;テスト&lt;/h2&gt;
&lt;p&gt;プロジェクトの直下に test というディレクトリを作ります。
test ディレクトリの中に Token.js というファイルを作り、以下のコードを書きます。&lt;/p&gt;
&lt;h3&gt;test/Token.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; expect &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chai&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Token contract&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Deployment should assign the total supply of tokens to the owner&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;owner&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSigners&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hardhatToken &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Token&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ownerBalance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hardhatToken&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;balanceOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;owner&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hardhatToken&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;totalSupply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ownerBalance&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;コンパイル済みのスマートコントラクトに対して上のテストコードを使ってテストを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat test&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;  Token contract
    ✓ Deployment should assign the total supply of tokens to the owner (565ms)


  1 passing (569ms)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;テストネットへのデプロイ&lt;/h1&gt;
&lt;p&gt;Ethereum のテストネットにデプロイする方法はこちらをどうぞ&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/deploy-testnet&quot;&gt;Hardhat の使い方: Ethereum のテストネットにデプロイしよう！&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;scripts/deploy.js&lt;/h3&gt;
&lt;p&gt;デプロイ用のスクリプトを用意します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;deployer&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSigners&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Deploying contracts with the account:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; deployer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Account balance:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; deployer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBalance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Token&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Token address:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;hardhat.config.js&lt;/h3&gt;
&lt;p&gt;hardhat.config.js を書き換えます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nomiclabs/hardhat-waffle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ROPSTEN_PRIVATE_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROPSTEN_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ROPSTEN_RPC_URL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROPSTEN_RPC_URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.7.3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;ropsten&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROPSTEN_RPC_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;accounts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROPSTEN_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Ropsten にデプロイ&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat run scripts/deploy.js --network ropsten&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Deploying contracts with the account: 0x470815ee5b366755284C9e85f0D636F1e046d013
Account balance: 1288845007486614009
Token address: 0xfa9D0729c104841668E0DDeb433Cbc6107AB59C1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このようなログが表示されたらテストネットへのデプロイが正常に実行されています。&lt;/p&gt;
&lt;p&gt;Etherscan(Ropsten)でコントラクトアドレスやトランザクションを確認してみましょう。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ropsten.etherscan.io/address/0xfa9D0729c104841668E0DDeb433Cbc6107AB59C1&quot;&gt;https://ropsten.etherscan.io/address/0xfa9D0729c104841668E0DDeb433Cbc6107AB59C1&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Metamask で確認&lt;/h2&gt;
&lt;p&gt;Hardhat のチュートリアルには載っていませんが、せっかくトークンを作ったので Metamask に登録してみましょう。&lt;/p&gt;
&lt;p&gt;deploy.js を実行した際に出力された&lt;code class=&quot;language-text&quot;&gt;Token address&lt;/code&gt;を Metamask に登録します。
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f98e24ad854d28d0fbe15c17d42e492a/38cea/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 80.37974683544303%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAABhElEQVR42pWUbW7CMAyGc5TdYNfcLabtHGgSE5tAYhRNRYL/GwwKtEnTpm0+3ikZKV8FOkuP0rqRY/uNS4wx8AB7Dv2nHNrpN+IftDFQes+1gFprKKWhtD4PuD8JmK4KfC4EIi5xzaL1Bt+LJb7mC+RC1JlaIxGv4FnQEnNaYpnufau0Ql4qGKNdZhapFKSUDqVU7beQFStgWVKBiBWO2scK/FABLkpIWaGq/vDBLN7nIYAGjPaFH3Rb4z/mtSJhGOJjNHIvg8EAnU4H4/EYQRBgNps1KtmkOmUpeJaBZFkGzlPnFEKAc+5Wm35Zlq0zrHtY3zytL268leHxtbEpG7VTTB413KvYFrufhMkWUypPJTmbhrZG7h4C3D/GqITA2/s7er0eut0uJpMJ+v0+hsOhO/2aOEeiPL1wPL8y2y3nSNPUYYWxa57nN5W25ssmbcrywtQT0Rh0N3qV1LD4zfaUNj07HLej0WtqPs9yrDcxEsqwjRNQysBYijih7sdg+3Wpql+G0uNUFovOBQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Metamask&quot;
        title=&quot;&quot;
        src=&quot;/static/f98e24ad854d28d0fbe15c17d42e492a/f058b/1.png&quot;
        srcset=&quot;/static/f98e24ad854d28d0fbe15c17d42e492a/c26ae/1.png 158w,
/static/f98e24ad854d28d0fbe15c17d42e492a/6bdcf/1.png 315w,
/static/f98e24ad854d28d0fbe15c17d42e492a/f058b/1.png 630w,
/static/f98e24ad854d28d0fbe15c17d42e492a/38cea/1.png 678w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;これで 1,000,000 MHT が見えるようになります。&lt;/p&gt;
&lt;p&gt;これは Token.sol というサンプルコードであなたが作った’My Hardhat Token’です。&lt;/p&gt;
&lt;p&gt;ほかのアドレスに送ることもできます。自由に試してください。&lt;/p&gt;
&lt;p&gt;メインネット用の ETH と RPC を使えば同じやり方でメインネットにデプロイすることもできます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Solidity / Hardhat の使い方: イーサリアムのテストネットにデプロイしよう！]]></title><description><![CDATA[このページはこんな人におすすめ Solidity を学習したい テストネットにスマートコントラクトを作りたい Hardhat の使い方を知りたい Hardhat 自体を使ったことがない場合は先に以下の記事をご覧ください。 Hardhat の使い方: 初心者向けの Solidity…]]></description><link>https://smacon.dev/posts/deploy-testnet</link><guid isPermaLink="false">https://smacon.dev/posts/deploy-testnet</guid><pubDate>Sun, 19 Jun 2022 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solidity を学習したい&lt;/li&gt;
&lt;li&gt;テストネットにスマートコントラクトを作りたい&lt;/li&gt;
&lt;li&gt;Hardhat の使い方を知りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardhat 自体を使ったことがない場合は先に以下の記事をご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けの Solidity 開発入門&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Ethereum のテストネットについて&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://ethereum.org/en/developers/docs/networks/&quot;&gt;Ethereum Networks&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gorli&lt;/li&gt;
&lt;li&gt;Kovan&lt;/li&gt;
&lt;li&gt;Kintsugi&lt;/li&gt;
&lt;li&gt;Rinkeby&lt;/li&gt;
&lt;li&gt;Ropsten&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ethereum には複数のテストネットが用意されています。&lt;/p&gt;
&lt;p&gt;スマートコントラクトを開発するにあたっては、トークンや RPC エンドポイントを入手できるものであれば
どのネットワークを使っても構いません。&lt;/p&gt;
&lt;p&gt;NFT を使った開発が目的であれば、Opensea が対応している Rinkeby がオススメです。&lt;/p&gt;
&lt;h1&gt;事前準備&lt;/h1&gt;
&lt;p&gt;テストネットにデプロイするために以下のものを準備します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EOA（Externally Owned Account）の秘密鍵（Metamask ウォレットで使う秘密鍵)&lt;/li&gt;
&lt;li&gt;テストネットの ETH トークン&lt;/li&gt;
&lt;li&gt;テストネットの RPC エンドポイントの URL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;１つずつ解説していきます。&lt;/p&gt;
&lt;h2&gt;EOA の秘密鍵&lt;/h2&gt;
&lt;p&gt;Ethereum のテストネットではスマートコントラクトをデプロイするためのアカウントとして EOA を使います。&lt;/p&gt;
&lt;p&gt;EOA（Externally Owned Account）とは ユーザーが使うアカウントのことで、Metamask で作るウォレット用のアカウントです。&lt;/p&gt;
&lt;p&gt;Metamask でアカウントを作って Private Key をエクスポートすれば取得できます。&lt;/p&gt;
&lt;p&gt;念のため、本番で使っているアカウントと分けることをおすすめします。&lt;/p&gt;
&lt;h2&gt;テストネット の ETH トークン&lt;/h2&gt;
&lt;p&gt;0.1ETH ぐらいあればデプロイには足りると思います。&lt;/p&gt;
&lt;p&gt;テストネット用のトークンは、テストネットのノードを運営している団体が無料で配布したりしています。&lt;/p&gt;
&lt;p&gt;以下のように Google 検索してみてください。&lt;/p&gt;
&lt;p&gt;「Rinkeby Faucet」
「Ropsten Faucet」&lt;/p&gt;
&lt;p&gt;Faucet は蛇口という意味ですが、ブロックチェーンの開発においてテストネット用のトークンをもらうためのキーワードです。
Ethereum 以外でも Faucet で検索すればテストネット用のトークンを入手することができます。&lt;/p&gt;
&lt;p&gt;Faucet では自分のアドレスを入力するだけで送られてくるものもあれば、SNS でシェアした URL を入力するともらえる場合などもあります。&lt;/p&gt;
&lt;p&gt;Faucet でパスワードやシードフレーズを聞かれることはありません。もし聞かれたら偽物の詐欺サイトです。&lt;/p&gt;
&lt;h3&gt;RPC エンドポイントの URL&lt;/h3&gt;
&lt;p&gt;ブロックチェーンのネットワークにアクセスするためのエンドポイントです。&lt;/p&gt;
&lt;p&gt;エンドポイントを使うということはブロックチェーンのノードにアクセスするということです。&lt;/p&gt;
&lt;p&gt;Ethereum では PC やサーバを使って自分でノードを建てることができますが、ノードプロバイダーと呼ばれるを有名なサービスがいくつかあり、メインネットやテストネットのノードを無料で借りることができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INFURA&lt;/li&gt;
&lt;li&gt;Alchemy&lt;/li&gt;
&lt;li&gt;QuickNode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;じつは Metamask で使われている RPC エンドポイントは INFURA というノードプロバイダーの RPC サーバです。&lt;/p&gt;
&lt;p&gt;Metamask の Network の設定を開けば設定内容が見れるのでそれを使っても構いません。&lt;/p&gt;
&lt;p&gt;筆者のおすすめは Alchemy です。
ユーザー登録すれば、RPC サーバの URL を取得できて、ある程度まで無料プランで利用できます。&lt;/p&gt;
&lt;h1&gt;環境変数の設定&lt;/h1&gt;
&lt;p&gt;以下のような環境変数を設定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ropsten の場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ROPSTEN_PRIVATE_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ROPSTEN_RPC_URL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rinkeby の場合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;RINKEBY_RPC_URL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;env.txt&lt;/h3&gt;
&lt;p&gt;秘密鍵や API Key などのクレデンシャルは Git に commit しないようにする必要があります。&lt;/p&gt;
&lt;p&gt;そこで環境変数の中身は、env.txt というファイルに書いて Git プロジェクトの外に置いたり、.gitignore を使って Git に commit しないようにしましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;export ROPSTEN_PRIVATE_KEY=&quot;&amp;lt;EOA の秘密鍵&gt;&quot;
export ROPSTEN_RPC_URL=&quot;https://ropsten.infura.io/v3/xxxxxxxx&quot;

export RINKEBY_PRIVATE_KEY=&quot;&amp;lt;EOA の秘密鍵&gt;&quot;
export RINKEBY_RPC_URL=&quot;xhttps://eth-rinkeby.alchemyapi.io/v2/xxxxx&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ターミナルで以下のコマンドを実行すれば、環境変数の値を読み込んだ状態になります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;source env.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;hardhat.config.js&lt;/h3&gt;
&lt;p&gt;hatdhat.config.js を以下のように編集します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nomiclabs/hardhat-waffle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ROPSTEN_PRIVATE_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROPSTEN_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ROPSTEN_RPC_URL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROPSTEN_RPC_URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.x.x&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;ropsten&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROPSTEN_RPC_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;accounts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ROPSTEN_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;rinkeby&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;accounts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;デプロイ&lt;/h1&gt;
&lt;p&gt;環境変数を設定したターミナルウィンドウで以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# 環境変数を読み込む
source env.txt&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# Ropsten にデプロイ
npx hardhat run scripts/deploy.js --network ropsten

# Rinkeby にデプロイ
npx hardhat run scripts/deploy.js --network rinkeby&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デプロイするには&lt;code class=&quot;language-text&quot;&gt;scripts/deploy.js&lt;/code&gt;といったデプロイ用のスクリプトを用意する必要があります。&lt;/p&gt;
&lt;p&gt;デプロイスクリプトの内容はスマートコントラクトによって変わります。&lt;/p&gt;
&lt;p&gt;具体的なスクリプトが見たい場合はこれらのページをご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/first-app&quot;&gt;はじめてのイーサリアム Dapps 開発&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けのスマートコントラクト開発&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[W3C Security Standards and Drafts]]></title><description><![CDATA[W3C (World Wide Web Consortium) All Security Standards and Drafts DID Decentralized Identifiers (DIDs) v1.0 DID Method Rubric v1.0 DID…]]></description><link>https://smacon.dev/posts/w3c-security</link><guid isPermaLink="false">https://smacon.dev/posts/w3c-security</guid><pubDate>Sat, 18 Jun 2022 15:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;W3C (World Wide Web Consortium)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/?tag=security&quot;&gt;All Security Standards and Drafts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;DID&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2022/REC-did-core-20220719/&quot;&gt;Decentralized Identifiers (DIDs) v1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2021/NOTE-did-rubric-20211119/&quot;&gt;DID Method Rubric v1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2021/NOTE-did-spec-registries-20211102/&quot;&gt;DID Specification Registries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2021/NOTE-did-imp-guide-20211012/&quot;&gt;DID Implementation Guide v1.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Web Authn&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2019/REC-webauthn-1-20190304/&quot;&gt;Web Authentication: An API for accessing Public Key Credentials Level 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2021/REC-webauthn-2-20210408/&quot;&gt;Web Authentication: An API for accessing Public Key Credentials Level 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2021/WD-webauthn-3-20210427/&quot;&gt;Web Authentication: An API for accessing Public Key Credentials Level 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Verifiable Credentials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2022/REC-vc-data-model-20220303/&quot;&gt;Verifiable Credentials Data Model v1.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Organizations&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://identity.foundation/&quot;&gt;DIF (Decentralized Identity Foundation)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sovrin-foundation/&quot;&gt;The Sovrin Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jolocom/jolocom-did-driver/blob/master/jolocom-did-method-specification.md&quot;&gt;Jolocom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/spruceid&quot;&gt;Spruce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ceramic.network/&quot;&gt;Ceramic Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hashgraph/did-method&quot;&gt;Hedera Hashgraph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hyperledger.org/participate&quot;&gt;Hyperledger Foundation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[The Graph 入門: はじめてのサブグラフ – Subgraph の自動生成]]></title><description><![CDATA[このページで作成したサブグラフのソースコードは GitHub からダウンロードできます。 サブグラフをデプロイして Subgraph Studio でクエリを実行することは無料で誰でもできます。 なるべく簡単な方法を紹介しています。
GraphQL…]]></description><link>https://smacon.dev/posts/subgraph</link><guid isPermaLink="false">https://smacon.dev/posts/subgraph</guid><pubDate>Tue, 24 May 2022 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページで作成したサブグラフの&lt;a href=&quot;https://github.com/smacon-dev/subgraphs/tree/main/event001&quot;&gt;ソースコード&lt;/a&gt;は GitHub からダウンロードできます。&lt;/p&gt;
&lt;p&gt;サブグラフをデプロイして Subgraph Studio でクエリを実行することは無料で誰でもできます。&lt;/p&gt;
&lt;p&gt;なるべく簡単な方法を紹介しています。
GraphQL は知らなくてもこのページで作ったサブグラフを試すことはできます。（サンプルクエリつき）&lt;/p&gt;
&lt;p&gt;サブグラフを作成するときは、デプロイ済みのスマートコントラクトからコードを自動生成することができます。&lt;/p&gt;
&lt;p&gt;非常にシンプルなスマートコントラクトから自動生成されるコードを使って簡単なサブグラフを作ってみましょう。&lt;/p&gt;
&lt;h1&gt;必要なもの&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;Metamask と アカウント&lt;/li&gt;
&lt;li&gt;Event スマートコントラクト&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Metamask は Subgraph Studio を使うときに使いますが、ETH は不要(のはず)です。&lt;/p&gt;
&lt;p&gt;Event スマートコントラクトは以下のページで作った非常にシンプルなスマートコントラクトです。
もし、サブグラフだけ作りたいときは、筆者の作ったスマートコントラクトを使って進められます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/solidity-events&quot;&gt;Solidity 入門: 定義したイベントを発行してブロックチェーンに記録&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;サブグラフを自動生成するためにスマートコントラクトが以下の条件を満たす必要があります。
Event スマートコントラクトはこの条件を満たしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Etherscan でコードを Verify していること&lt;/li&gt;
&lt;li&gt;スマートコントラクトが events を発行していること&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;graph-cli のインストール&lt;/h1&gt;
&lt;p&gt;以下のコマンドを実行して、システムに graph-cli をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install -g @graphprotocol/graph-cli&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;正しくインストールできれば、以下のように graph コマンドを実行できるようになります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; % graph version
0.26.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;graph init&lt;/h1&gt;
&lt;p&gt;プロジェクト用のディレクトリを作り以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;graph init&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;いくつかの質問があるので答えます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protocol: &lt;code class=&quot;language-text&quot;&gt;ethereum&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Product for which to initialize: &lt;code class=&quot;language-text&quot;&gt;subgraph-studio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Subgraph slug: &lt;code class=&quot;language-text&quot;&gt;event001&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Directory to create the subgraph in: &lt;code class=&quot;language-text&quot;&gt;event001&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ethereum network: &lt;code class=&quot;language-text&quot;&gt;rinkeby&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Contract address: &lt;code class=&quot;language-text&quot;&gt;0xc5BeE3DDcD7F58380Aa0CA3D01dA63a34a9C3c09&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このコントラクトアドレスは筆者が Rinkeby にデプロイしたコントラクトです。
&lt;a href=&quot;https://rinkeby.etherscan.io/address/0xc5BeE3DDcD7F58380Aa0CA3D01dA63a34a9C3c09&quot;&gt;https://rinkeby.etherscan.io/address/0xc5BeE3DDcD7F58380Aa0CA3D01dA63a34a9C3c09&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; % graph init
✔ Protocol · ethereum
✔ Product for which to initialize · subgraph-studio
✔ Subgraph slug · event001
✔ Directory to create the subgraph in · event001
✔ Ethereum network · rinkeby
✔ Contract address · 0xc5BeE3DDcD7F58380Aa0CA3D01dA63a34a9C3c09
✔ Fetching ABI from Etherscan
✔ Contract Name · Event
  Generate subgraph
  Write subgraph to directory
✔ Create subgraph scaffold
✔ Initialize subgraph repository
✔ Install dependencies with yarn
✔ Generate ABI and schema types with yarn codegen

Subgraph event001 created in event001

Next steps:

  1. Run `graph auth` to authenticate with your deploy key.

  2. Type `cd event001` to enter the subgraph.

  3. Run `yarn deploy` to deploy the subgraph.

Make sure to visit the documentation on https://thegraph.com/docs/ for further information.
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;graph init を実行したディレクトリに event001 というディレクトリができて、その中にいろんなファイルが作られます。&lt;/p&gt;
&lt;h1&gt;ブロック番号の指定&lt;/h1&gt;
&lt;p&gt;このまま 1 行も変えずにデプロイすることもできますが、時間短縮のために 1 箇所だけ変えましょう。&lt;/p&gt;
&lt;p&gt;どのブロックからデータの取得を開始するかを指定します。&lt;/p&gt;
&lt;h3&gt;subgraph.yaml&lt;/h3&gt;
&lt;p&gt;dataSources -&gt; source -&gt; startBlock&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;startBlock: 10028560&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;10028560 は Event コントラクトをデプロイしたときの Rinkeby のブロック番号です。&lt;/p&gt;
&lt;p&gt;これを指定しないとコントラクトをデプロイする前のログまで分析してしまうので無駄に時間がかかります。&lt;/p&gt;
&lt;p&gt;追加後の subgraph.yaml は以下のようになります。&lt;/p&gt;
&lt;h3&gt;subgraph.yaml&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-yaml line-numbers&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;specVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.0.2
&lt;span class=&quot;token key atrule&quot;&gt;schema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./schema.graphql
&lt;span class=&quot;token key atrule&quot;&gt;dataSources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ethereum
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Event
    &lt;span class=&quot;token key atrule&quot;&gt;network&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rinkeby
    &lt;span class=&quot;token key atrule&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0xc5BeE3DDcD7F58380Aa0CA3D01dA63a34a9C3c09&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;abi&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Event
      &lt;span class=&quot;token key atrule&quot;&gt;startBlock&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10028560&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ethereum/events
      &lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.0.5
      &lt;span class=&quot;token key atrule&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; wasm/assemblyscript
      &lt;span class=&quot;token key atrule&quot;&gt;entities&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; AnotherLog
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; Log
      &lt;span class=&quot;token key atrule&quot;&gt;abis&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Event
          &lt;span class=&quot;token key atrule&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./abis/Event.json
      &lt;span class=&quot;token key atrule&quot;&gt;eventHandlers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; AnotherLog()
          &lt;span class=&quot;token key atrule&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; handleAnotherLog
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Log(indexed address&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;string)
          &lt;span class=&quot;token key atrule&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; handleLog
      &lt;span class=&quot;token key atrule&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./src/mapping.ts&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;コードの自動生成＆ビルド&lt;/h1&gt;
&lt;p&gt;ここから先の作業はサブディレクトリで行います。（subgraph.yaml があるディレクトリ）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd event001&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;コードを自動生成します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;graph codegen&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% graph codegen
Skip migration: Bump mapping apiVersion from 0.0.1 to 0.0.2
Skip migration: Bump mapping apiVersion from 0.0.2 to 0.0.3
Skip migration: Bump mapping apiVersion from 0.0.3 to 0.0.4
Skip migration: Bump mapping apiVersion from 0.0.4 to 0.0.5
Skip migration: Bump mapping specVersion from 0.0.1 to 0.0.2
✔ Apply migrations
✔ Load subgraph from subgraph.yaml
Load contract ABI from abis/Event.json
✔ Load contract ABIs
Generate types for contract ABI: Event (abis/Event.json)
Write types to generated/Event/Event.ts
✔ Generate types for contract ABIs
✔ Generate types for data source templates
✔ Load data source template ABIs
✔ Generate types for data source template ABIs
✔ Load GraphQL schema from schema.graphql
Write types to generated/schema.ts
✔ Generate types for GraphQL schema

Types generated successfully&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のコマンドを実行してサブグラフをビルドします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;graph build&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% graph build
Skip migration: Bump mapping apiVersion from 0.0.1 to 0.0.2
Skip migration: Bump mapping apiVersion from 0.0.2 to 0.0.3
Skip migration: Bump mapping apiVersion from 0.0.3 to 0.0.4
Skip migration: Bump mapping apiVersion from 0.0.4 to 0.0.5
Skip migration: Bump mapping specVersion from 0.0.1 to 0.0.2
✔ Apply migrations
✔ Load subgraph from subgraph.yaml
Compile data source: Event =&gt; build/Event/Event.wasm
✔ Compile subgraph
Copy schema file build/schema.graphql
Write subgraph file build/Event/abis/Event.json
Write subgraph manifest build/subgraph.yaml
✔ Write compiled subgraph to build/

Build completed: /Users/sakanosita/ghq/github.com/smacon-dev/subgraphs/event001/build/subgraph.yaml&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Subgraph のデプロイ&lt;/h1&gt;
&lt;h2&gt;Subgraph Studio で Subgraph 作成&lt;/h2&gt;
&lt;p&gt;Subgraph Studio で Subgraph を作って、Deploy Key を用意します。
&lt;a href=&quot;https://thegraph.com/studio/subgraph/&quot;&gt;https://thegraph.com/studio/subgraph/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[Create a Subgraph]をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ede4845114b7edee4b609c17dce60f74/f6b04/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.202531645569614%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABnklEQVR42m2S7Y6TQBhG+efyVaAtUKbQb3YAscY0pkjd9SMbd7VRN2pqYmKyXoS35G0ew5Q2rfHHE5iXzJnzvoPWdWdEYUYsSmxzRNC/JPQlnjOj685xOxMce4JlJFh6rGI2TyPBvBjihymBP8dzR5h6hNbvNgVJ6GdqYwPtWCNsI1HvCnRIC2rqpgIP6TtLhkGF8Ne4lkQr8ivW1Zb1eouISvRH4rjZbI0sIz4zbLoYBDlOJ2aV/ubz5o9KKnZoe6PxmY3ZpLX5d22be0PHHqtOrPab2R6s9bw5QW+OCDM8Z6ra7joT/O4CtzNVMzys97OMj5CzcajaEG0yXvL19ifXWa0uZzZ9xu7DA1eyYhBKFrMV398/UKfPCQOJ0dgo67g1azs4AHNZcXu9oxwtSaKcIqu5efEFKXLiKKcsXvJu840sLhgOcvSLPdBQiY9RtQZYyJrX9Uc2qxvG4jFZWrG7/8Xdm3uEL3lavuLT3Q/ebraIQKKfGh6inwB7XkoUFAS9y/28vAXz6YpElOqymt8qEU8Y+FKtjf8AjRPgX7yD7i3Y/x++AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Subgraph Studio&quot;
        title=&quot;&quot;
        src=&quot;/static/ede4845114b7edee4b609c17dce60f74/f058b/1.png&quot;
        srcset=&quot;/static/ede4845114b7edee4b609c17dce60f74/c26ae/1.png 158w,
/static/ede4845114b7edee4b609c17dce60f74/6bdcf/1.png 315w,
/static/ede4845114b7edee4b609c17dce60f74/f058b/1.png 630w,
/static/ede4845114b7edee4b609c17dce60f74/40601/1.png 945w,
/static/ede4845114b7edee4b609c17dce60f74/78612/1.png 1260w,
/static/ede4845114b7edee4b609c17dce60f74/f6b04/1.png 2658w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[Ethereum Rinkeby]を選択&lt;/li&gt;
&lt;li&gt;[任意の Subgraph 名]を入力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/67f9a6194271840df5c47e3c36efec9e/0ff19/3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 64.55696202531645%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACb0lEQVR42o2TS2sTURiGZ9dkMveZZJLJpElmkmmaazO59BKSlKahNxAXlopiUUrRnaALQXCl4s4f4FZw5dJfoSi48uc8MtMb7aJ08XC+88F5zsvhO4Ku+ShyCUUqIkvFuE6JhbiO1ggxmY/R5T6Gsoom9+jUDhksP6eQf4SuTtGlNSx1gnB1yL0U3CSSJRMOutJDEVdYax/x4eU33p585+PpV44n78noe5jKGkIkuo3rwhAp2WDYfsLJgy/sd1/zZv6OZ7ufcOwDDLl/lfA2LoSq3EGVV8haQ6Ybp8zmL9iev6Lk3UeR2hjK8G7ClBi9oYMiN5HEFuJCHdsM6fQPqTX3MNUwflddOU+YSDiINyRnPRfpMmEOTWlRr81pNXap+lu06jt0mvtU/RmS2EaVuwimUcEvdHHNAF3z0JQypuHjRT0rwNB9pJQbC1W5QdXfpF7bphZs0Wrs0O0csBTMyOfWsYweQtFdoVkdk1M9TN1DlUsUnDatYIqjRb1IWDgXLlNa3MAvj6l4E7zSOCa6pOJNsYwQIZtZxknXMdUSluajqx45u04+08BSy6QNH0k8S6hIAY4d4mRDyqV1GvUZzcY2bn6I6wzJZnoIbq5FszbCL4ZYmkc06EW3Q+AN8Be72GaV1IUwVcU2emStPpl4HcRkjD62OcTSQ4RI4OQapM0ARVqMf4iu+mSsJUy9gioXL4VyyqeQ3aDojOLDpto9Q+li633SWoiQTLokFhySify1gY72V738eUIPO06zip1eJaMNSGv9mKg2lfZdBzu6IIsqVbg3+MHj8V8ejn5xsvuHp/PfHI1+crz5j0n9M/8BaYNlG5Ew78AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Subgraph Studio&quot;
        title=&quot;&quot;
        src=&quot;/static/67f9a6194271840df5c47e3c36efec9e/f058b/3.png&quot;
        srcset=&quot;/static/67f9a6194271840df5c47e3c36efec9e/c26ae/3.png 158w,
/static/67f9a6194271840df5c47e3c36efec9e/6bdcf/3.png 315w,
/static/67f9a6194271840df5c47e3c36efec9e/f058b/3.png 630w,
/static/67f9a6194271840df5c47e3c36efec9e/40601/3.png 945w,
/static/67f9a6194271840df5c47e3c36efec9e/78612/3.png 1260w,
/static/67f9a6194271840df5c47e3c36efec9e/0ff19/3.png 2084w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;これでデプロイの準備ができました。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/49a1e9d02eb3cf8323847bbac6573bac/61c89/4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.79746835443038%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABxklEQVR42nVSy27bMBDUyXqQlGTJsp4UJbWK5dqt4xooih5SIC7afkEuvfZ/+seZYFcPp4ccBgS5y9md2bXi9TukyQCjT1gHHQLVIIl7RGHHWActAmXgSwPhVpCehvTGUzglwrB71vXpOd/uEfoNLAoQCZHRB0pyVzlcu1gI1ISR6BWmuGunsFcxPKeERR1W+QFJ1GPXf8Px8B2Xyy805gKKKVFzoutqOBOEe+vSc3Lk8Ve0+W/4soZF8ob+C4p0j/vzFY8/nvB4fcLx8ABdHrHd3LGCXGloXyMXBZRXManyDOxVhE/dX1zP/9giK/Tb0bOgg/INhKzgOQV3RZI30XsIafAQlfiTlvgZFQgmwkWyk8GxE863Ar+BT0STBJKopIGSNUMKzSBSKRt4fNZLfMypeQZR2I5D4WG4Fajb2bPxrVxiNCx6l151e3uFmcdKkx2vTLrZoTOfUWQf2ALybkF8O2l9yCsaGDVA93mtqJi13ezQmjOyZOBP2XYA7VT2Hwbk6Z6x9ltUxYELUzP0n94pRwlNhHdo6hN3qcuPqIrjm2DCoENJaxb3ixoqQt1Okgd05ryQvoWmvueCo8SGvZ49n3eS8AIv0hpHslhU/gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Subgraph Studio&quot;
        title=&quot;&quot;
        src=&quot;/static/49a1e9d02eb3cf8323847bbac6573bac/f058b/4.png&quot;
        srcset=&quot;/static/49a1e9d02eb3cf8323847bbac6573bac/c26ae/4.png 158w,
/static/49a1e9d02eb3cf8323847bbac6573bac/6bdcf/4.png 315w,
/static/49a1e9d02eb3cf8323847bbac6573bac/f058b/4.png 630w,
/static/49a1e9d02eb3cf8323847bbac6573bac/40601/4.png 945w,
/static/49a1e9d02eb3cf8323847bbac6573bac/78612/4.png 1260w,
/static/49a1e9d02eb3cf8323847bbac6573bac/61c89/4.png 2678w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;ローカルの graph コマンドの認証&lt;/h2&gt;
&lt;p&gt;以下のコマンドでローカルの graph コマンドを認証します&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;
graph auth --studio &amp;lt;Deploy Key&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;デプロイ&lt;/h2&gt;
&lt;p&gt;以下のコマンドを実行するとデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;graph deploy --studio event001&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Version Label を効かれるので&lt;code class=&quot;language-text&quot;&gt;v0.0.1&lt;/code&gt;を入力します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;event001 % graph deploy --studio event001
✔ Version Label (e.g. v0.0.1) · v0.0.1
Skip migration: Bump mapping apiVersion from 0.0.1 to 0.0.2
Skip migration: Bump mapping apiVersion from 0.0.2 to 0.0.3
Skip migration: Bump mapping apiVersion from 0.0.3 to 0.0.4
Skip migration: Bump mapping apiVersion from 0.0.4 to 0.0.5
Skip migration: Bump mapping specVersion from 0.0.1 to 0.0.2
✔ Apply migrations
✔ Load subgraph from subgraph.yaml
Compile data source: Event =&gt; build/Event/Event.wasm
✔ Compile subgraph
Copy schema file build/schema.graphql
Write subgraph file build/Event/abis/Event.json
Write subgraph manifest build/subgraph.yaml
✔ Write compiled subgraph to build/
Add file to IPFS build/schema.graphql
.. QmfDwzvSmUKGNFcdzW1HztSZ9nWRBchUwDMxjhzsuooYeT
Add file to IPFS build/Event/abis/Event.json
.. QmUWzzjttfyk8JDNTHHq46ergQphaVBjnc3VKCVPAYV33q
Add file to IPFS build/Event/Event.wasm
.. QmcfLjHPhH14RtGuaLnUnDrEFsBU4bW9pWBSYb6jiDt8Gs
✔ Upload subgraph to IPFS

Build completed: QmWd2aK1DWtCNNjGSULXuZavu1JAkFZreykYFmZ2aDiPDc

Deployed to https://thegraph.com/studio/subgraph/event001

Subgraph endpoints:
Queries (HTTP): https://api.studio.thegraph.com/query/610/event001/v0.0.1
Subscriptions (WS): https://api.studio.thegraph.com/query/610/event001/v0.0.1
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでサブグラフをデプロイできました。&lt;/p&gt;
&lt;h1&gt;クエリ実行&lt;/h1&gt;
&lt;p&gt;デプロイしてしばらくするとサブグラフのステータスが Synced になりクエリを実行できる状態になります。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4822009ceee663162b999b4aff40f4d7/082c8/5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABu0lEQVR42nVSy27bMBDUpbH4lqmHrSdl2bKNpEmA2gWKnBygSE89tb/W380UXMqJk7SHxUrk7szOLKMi28K19/BZiQ55uoVN1rDJQFlLh0T1EKyB5C0kD9n/K9k9V83n53p5TX2C1Yg8SKJ7KuKzCmxWIr4qLwD+FU0I1lAdjytcfbJgswJRU97QdEP/FXe3jzgcnrDbPSCzIxHxuJ6aQv44aQ0jN1hXP2H1DaJxOKKrb7Edv+F0+oXT428cvjzBtXdYFnvMzQpG9SQ/0SuoSa6cgHlcIjP3+HH8g674jihPR2TzDfmnREvjh1zDztcEZJTDIt+hyHcE+t4OwRvEsxwsXiDS2tGB9IByiulbiqlJhKZQ177WTTU+53aE5DUiz/iGjeS0L5Io2Nt7zqpwz14Xc15OtO6PJG1uhskvR5L/t10jVkjlPkwmOjrXoiOfBasQLbItcruht+YB02RNgOKC+Ty1nywVe7T6AUJ5qY6WYrRDkW+DZG0GaP+ATU+MwfAgRRsHpRwk7y4k12BsCWscctvDqI7qPRlnJaLEjtDex/cyPaDuYRfXSJLhheTsaZEOyG2w6bwHL/kvcMsRcC+f80AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Subgraph Studio&quot;
        title=&quot;&quot;
        src=&quot;/static/4822009ceee663162b999b4aff40f4d7/f058b/5.png&quot;
        srcset=&quot;/static/4822009ceee663162b999b4aff40f4d7/c26ae/5.png 158w,
/static/4822009ceee663162b999b4aff40f4d7/6bdcf/5.png 315w,
/static/4822009ceee663162b999b4aff40f4d7/f058b/5.png 630w,
/static/4822009ceee663162b999b4aff40f4d7/40601/5.png 945w,
/static/4822009ceee663162b999b4aff40f4d7/78612/5.png 1260w,
/static/4822009ceee663162b999b4aff40f4d7/082c8/5.png 2734w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Synced になったら、Playground でクエリを実行してみましょう。&lt;/p&gt;
&lt;p&gt;GraphQL を知らなくてもデフォルトで入力されているクエリをそのまま実行すれば結果が返ってきます。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f662d88683e87d2aebe06d344073c0a7/3c9d8/6.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.67088607594937%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABGUlEQVR42oWRy26DMBBFs8SPGWMDCQFjJ9Coyqab9v9/7VaYV6CRurjyQ6PjM+OTb77AOiLnW1q17P5JAMkALf16p4RPkeKK0/XyRFU8YM0dLu9R2GEt0mIPE6JGQz+48jcUhQRXokXhBpTuAyKrccpND+YbSAeQChtshKgOKmvXs5IeJCNYRTgbYU0HKRqQ9jAcZuD5CbYDiGMCrjDhwW6AKT5B+gaZ+SmiTQ9Vbuymhx2FdEwPyxGoZ8iSybBLMyrLAXX7xLnqUbo7quKOnKc5WxMTeOlqrE/A1eglC9BwhLU9DAWwnkJq/xGbyAx8/anjvip7XOpHMluSczgI+L3hEfZ6XoxIb4bHuindX8N3wGNb+zn7t8BfkAXZyu4ePhIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Subgraph Studio&quot;
        title=&quot;&quot;
        src=&quot;/static/f662d88683e87d2aebe06d344073c0a7/f058b/6.png&quot;
        srcset=&quot;/static/f662d88683e87d2aebe06d344073c0a7/c26ae/6.png 158w,
/static/f662d88683e87d2aebe06d344073c0a7/6bdcf/6.png 315w,
/static/f662d88683e87d2aebe06d344073c0a7/f058b/6.png 630w,
/static/f662d88683e87d2aebe06d344073c0a7/40601/6.png 945w,
/static/f662d88683e87d2aebe06d344073c0a7/78612/6.png 1260w,
/static/f662d88683e87d2aebe06d344073c0a7/3c9d8/6.png 2724w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;サンプルクエリ&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;graphql&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-graphql line-numbers&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property-query&quot;&gt;exampleEntities&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;count&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;実行結果&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;exampleEntities&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0x1da392e33b2c00aeee46b9538a364751c8d8e00e&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0x470815ee5b366755284c9e85f0d636f1e046d013&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この結果は、Event というスマートコントラクトの test()という関数を実行したアドレスと実行した回数を表しています。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Web3 プログラミング入門: 初心者向け Solidity 学習4選]]></title><description><![CDATA[この記事はこんな人におすすめです。 スマートコントラクト開発を始める人 Solidity の本を買ったけど、次に何をしたら良いかわからない人 開発環境の構築でつまずいた人 Web3/Dapps 開発に興味がある人 この記事で紹介するサイトやツールの一覧 CryptoZombies…]]></description><link>https://smacon.dev/posts/solidity-beginner</link><guid isPermaLink="false">https://smacon.dev/posts/solidity-beginner</guid><pubDate>Sun, 22 May 2022 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事はこんな人におすすめです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スマートコントラクト開発を始める人&lt;/li&gt;
&lt;li&gt;Solidity の本を買ったけど、次に何をしたら良いかわからない人&lt;/li&gt;
&lt;li&gt;開発環境の構築でつまずいた人&lt;/li&gt;
&lt;li&gt;Web3/Dapps 開発に興味がある人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この記事で紹介するサイトやツールの一覧&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CryptoZombies (クリプトゾンビ)&lt;/li&gt;
&lt;li&gt;Solidity by Example
&lt;ul&gt;
&lt;li&gt;Remix&lt;/li&gt;
&lt;li&gt;Hardhat&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;イーサリアム navi&lt;/li&gt;
&lt;li&gt;Ethernaut&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;プログラミング初心者が挫折しないために&lt;/h1&gt;
&lt;p&gt;プログラミングを始めたばかりの人は、プログラムを実行する環境の問題が原因で挫折してしまう人がたくさんいます。&lt;/p&gt;
&lt;p&gt;たとえば、サンプルコードをそのままコピーして動かない場合は、ほとんど環境側に問題があります。
なぜなら、サンプルコード自体は本来間違っていないからです。&lt;/p&gt;
&lt;p&gt;実行環境の問題を解決するためには、プログラミングの文法以外に多くの前提知識が必要になることがあります。&lt;/p&gt;
&lt;p&gt;せっかくプログラミング言語を覚えたいのに、プログラミングとは関係ない部分で時間とやる気を浪費して挫折してしまいます。&lt;/p&gt;
&lt;p&gt;もし、環境構築が不要なら覚えることはプログラミングだけに集中できます。&lt;/p&gt;
&lt;p&gt;そこ最初におすすめするのは定番の CryptoZombies です。&lt;/p&gt;
&lt;h1&gt;CryptoZombies&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e4f1e1b3bcf73fd130cabb81e32d28b1/5a190/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.06329113924051%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAACPElEQVR42iXI2Y7SUACA4T4AE6FA9+WcLmfrAqW0dANaZBszAgaEMepkEo2XJt4Zb4zGjNHoO5s4yZ/v4uc6vAosimkELaZqNt9Vuj2F54UOL7Q7/fajnX6np4gKkHVLkA1RAe2u1O5KnGTmfX3S08Y9Le4Z464ei7gx07MUbLXkpMQHObqRhzctzW8pXkthj12p3pXqcTppdDJX0VRxCsWtLH9Fkj0rLzg9oMkLWpxIfkLpwQqXMi55GPNg1LXirjXmrTEHBhsBDJ+IVkdy2pKrwsiiBSAZwBMDp4BmJkpNlBpuyiuoJYCWAK9EW8CFyGoOJXuDViisZSOUjUAy/J6M7XAugUFPpX2N8ZKr4cSkeV9johmIRtBRkcQqfbThaHbScG6T0qWljXLiTU2cQTa13MwLGxbMDSc1WMkGjT9siDe1UCaC0Bxv3fLI0eyoOKkTLGiyYZMNjdeQzUw2w9GKphuWrJ1gqbOpO1iRZM3SNR4sVVLY1RFPL5yfnw1a0Wh1+Pzt9uHP/uMXiHLTzVfvP11+/L58/emNN6IR5bu78/dfrx7+znb3gh7C+NpJ99xo+c6Nt3bUwGzlVNcgrhWU4nKHnh7J9ozXL/VhA+MViBf29BnMl5qfS25C57d+c8eNNx9otveitYtylxS2M4F+HZQHL1w4pGRhg4dLkj1n4QLTCpHCRrnpz7zmdbi454bNnTPamriApIS0gqiAXg28Gv4/NiltvzG8ueFmZLDAQQ1QAYI6aN6E9dt/t4N4OK+9G/0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;CryptoZombies&quot;
        title=&quot;&quot;
        src=&quot;/static/e4f1e1b3bcf73fd130cabb81e32d28b1/f058b/1.png&quot;
        srcset=&quot;/static/e4f1e1b3bcf73fd130cabb81e32d28b1/c26ae/1.png 158w,
/static/e4f1e1b3bcf73fd130cabb81e32d28b1/6bdcf/1.png 315w,
/static/e4f1e1b3bcf73fd130cabb81e32d28b1/f058b/1.png 630w,
/static/e4f1e1b3bcf73fd130cabb81e32d28b1/5a190/1.png 800w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cryptozombies.io/&quot;&gt;https://cryptozombies.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ゲーム感覚で１つずつ課題をクリアしながら Solidity を学んでいきます。&lt;/p&gt;
&lt;p&gt;CryptoZombies の良いところ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日本語に対応している&lt;/li&gt;
&lt;li&gt;ゲーム感覚で面白い&lt;/li&gt;
&lt;li&gt;プログラムをブラウザ上で実行できる&lt;/li&gt;
&lt;li&gt;多くの Solidity エンジニアがここから入っている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CryptoZombies のイマイチなところ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内容が更新されておらず Solidity のバージョンが古い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ブラウザさえあれば、ほかに何も必要ないので初心者でもすぐに始められます。日本語に対応しているのも良いですね！&lt;/p&gt;
&lt;p&gt;しかし、CrypboZombies は体系的に学習を進めていくので、自分に必要ないことも学習しなければなりません。
ボリュームが多い上に、自分に必要かどうかもわからないことを理解しなければ先に進めなかったりするので段々とモチベーションが下がります。&lt;/p&gt;
&lt;p&gt;プログラミング学習においては、必ずしも体系的な学習がベストではないとぼくは考えます。
簡単なプログラムを実行できるようになったら、なるべく実際にプログラムを動かしてみることをおすすめします。&lt;/p&gt;
&lt;p&gt;そこで、次はいろんなコードサンプルから自分が気になるものを選んで実際に動かしてみましょう。&lt;/p&gt;
&lt;h1&gt;Solidity by Example&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://solidity-by-example.org/&quot;&gt;https://solidity-by-example.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Solidty をある程度学んだら、次にやるべきことは自分でコンパイルして動かしてみることです。&lt;/p&gt;
&lt;p&gt;サンプルコードをコンパイルして、テストネットにデプロイしたり実行してみましょう。
Solidity by Example のうち、いつくかのサンプルコードを当サイトでも解説しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/first-app&quot;&gt;はじめてのイーサリアム Dapps 開発&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/erc721&quot;&gt;NFT プログラミング (ERC721)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/price-oracle&quot;&gt;オラクルの基本的な使い方（Chainlink Data Feeds)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/merkle-tree&quot;&gt;Merkle Proof（マークルツリーと Keccak256）&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/solidity-events&quot;&gt;定義したイベントを発行してブロックチェーンに記録&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際にビルドしたり、デプロイすればいろんなエラーに必ずぶつかります。
しかし、プログラマにとって大事なことは言語の文法を知っていることではなく問題を解決する力です。&lt;/p&gt;
&lt;p&gt;エラーがおきたとき、はじめのうちは原因を切り分けるのが大変です。
サンプルコードならコード自体はだいたい正しいと言えるのでエラーの原因を絞り込むことができます。&lt;/p&gt;
&lt;p&gt;テスト環境にデプロイするための 2 つの方法をご紹介します。
そのときの自分に合っている方法を試してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remix&lt;/li&gt;
&lt;li&gt;Hardhat&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Remix&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://remix.ethereum.org/&quot;&gt;https://remix.ethereum.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Remix はブラウザでコードを編集したり、Metamask ウォレットを使ってテストネットやメインネットに
スマートコントラクトをデプロイできる無料サービスです。&lt;/p&gt;
&lt;p&gt;Remix の使い方はこちらのページにまとめてあります。（画像多め）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/remix-tutorial&quot;&gt;Remix の使い方: Metamask でスマートコントラクトをデプロイ&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Hardhat&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://hardhat.org/&quot;&gt;https://hardhat.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hardhat はローカル PC に仮想のスマートコントラクト実行環境を作ることができます。
2022 年現在、Solidity エンジニアがメインネットのデプロイにもよく使っています。&lt;/p&gt;
&lt;p&gt;Hardhat を使ったデプロイ方法はこちら&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けのスマートコントラクト開発&lt;/a&gt;
&lt;a href=&quot;/posts/deploy-testnet&quot;&gt;Hardhat の使い方: Ethereum のテストネットにデプロイしよう！&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;自分の気になるサンプルコードを選んだり、エラーにぶつかったり、その解決方法を検索したりして進めてください。
そうした小さな成功体験の積み重ねこそがかならずエンジニアとして成長に繋がります。&lt;/p&gt;
&lt;p&gt;進んでいくうちに、自分だけで解決できない問題にぶつかるかもしれません。&lt;/p&gt;
&lt;p&gt;そんなときは相談できる相手や、一緒に学習を進める仲間が欲しくなります。&lt;/p&gt;
&lt;p&gt;つぎに紹介するイーサリアム navi はそんな人たちが集まるコミュニティです。&lt;/p&gt;
&lt;h1&gt;イーサリアム navi&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://ethereumnavi.com/&quot;&gt;https://ethereumnavi.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;でりおてんちょーさんというエンジニア(NFT リサーチャー)が、運営されているサイトと無料の Discord コミュニティです。&lt;/p&gt;
&lt;p&gt;でりおてんちょーさん自身が Solidity を学習しながら、みんなで一緒に成長しているぬくもりのあるコミュニティです笑&lt;/p&gt;
&lt;p&gt;不定期で勉強会なども開催しているので、Discord に参加したり、Twitter をフォローしましょう。&lt;/p&gt;
&lt;p&gt;日本の Solidity エンジニアはまだ数が少ないので、結構すごい人が勉強会に参加することもあるかも？&lt;/p&gt;
&lt;h1&gt;Ethernaut&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/82d1e75ab5fa8fe0656b112bb2530ea1/5a190/3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAACZklEQVR42j2QWU8TUQCF5w+YyIOiQcu0dJG0TLdhbRFoi1IWq2GpGCPRYOSBmIASo8IDiT/Fd180JiRsyhIJ8mZiQofpMi0tIC3TO/fO3DvtNaOBL+ecx5Ocw5RkACGsVCrVavUi9XMIIZTSmZlX9ltOzu2z2hsbnRzn8Xl9vM/fwqRPQF7WNEyAgQKA0UUIuSiilM7OzHqbXC1+vp3nebfndiDg8fpdTW7mV1bOybgMlMT+viiKiUQimUzKsgwRwhjruk4pnZ9/Nz4WjT8cnJgYnJy8/2xi2OXy2hxO5uAYHgGCiY4QghAihFRNRQgiBBUFIIQopW/nXve29oz3x0KB1nCwJdrdGQ7yHq6BEU9QoUxUDRcKeUmScrkcQghhomIdaUTVNErph4WnA6ErowPsaL95JMpGu2sjwavB5suMcKwcAR0oUPyHIAjiwcG+kBTEVCqTTaUzekVfeDMXC4Tikb5Im6+3gx/qCXR3uH1ulskU1QIgqkbOzkpnhkvFUkmWZYwxNQ4zNi++n+oLmGJhR3+XJRa23ws7wkFLR/N1RjhS8mWiQCRJUiaTyWazeUkqn5wSoGgQ/j9scX76QYR7MhwYGeKG+myPRvzxYf+dkJ35fVg+LGMAUeacdDqdTqWSophKJbPZHKX05fQc19DWw99t47q8zvZWrrPR4a43W5lkERdgFRNcPP0DFXAhhBQIgaaqlNLnL6Yu1dTcZNk6U/0Nk5GmegvLWpmPX7Y/reyubu4tf/uxvvVzdWNn5fvO6ubu0tr21+WNz0vra1t7o/HHtdfqGqwOs9lmyGJjzVbWbP0LPDat8dQusWYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Ethernaut&quot;
        title=&quot;&quot;
        src=&quot;/static/82d1e75ab5fa8fe0656b112bb2530ea1/f058b/3.png&quot;
        srcset=&quot;/static/82d1e75ab5fa8fe0656b112bb2530ea1/c26ae/3.png 158w,
/static/82d1e75ab5fa8fe0656b112bb2530ea1/6bdcf/3.png 315w,
/static/82d1e75ab5fa8fe0656b112bb2530ea1/f058b/3.png 630w,
/static/82d1e75ab5fa8fe0656b112bb2530ea1/5a190/3.png 800w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ethernaut.openzeppelin.com/&quot;&gt;https://ethernaut.openzeppelin.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ethernaut は中上級者向けで、Chrome の Developer Tools の Console を使って、ゲーム感覚で Solidity を学ぶことができます。&lt;/p&gt;
&lt;p&gt;Ethernaut の良いところ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テストネットのスマートコントラクトを実際に操作している&lt;/li&gt;
&lt;li&gt;ゲーム感覚で学ぶことができる&lt;/li&gt;
&lt;li&gt;プログラムの脆弱性の問題を理解できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;はじめに Metamask を使って Ethereum のテストネットに繋ぎます。&lt;/p&gt;
&lt;p&gt;ブロックチェーンのテストネットにあるスマートコントラクトを実際に操作しながら進むので、ブロックチェーンを実際に使いながら理解できます。&lt;/p&gt;
&lt;p&gt;スマートコントラクトの実行には Web3.js を使うので JavaScript の知識が多少必要になるかもしれません。&lt;/p&gt;
&lt;p&gt;このサイトがほかと違うのは、問題の内容がスマートコントラクトの脆弱性、つまりバグを見つけるようになっているからです。&lt;/p&gt;
&lt;p&gt;ぼく自身も、まだ少ししかやっておりませんが、プログラムのバグを見つけるという課題は、高度なプログラミング知識を求められるので、この課題をマスターしたら、開発における高度かつ実践的なスキルが身につきます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[EVM と WASM の違い | Web3 プログラミング, スマートコントラクト入門]]></title><description><![CDATA[この記事はこんな人にぴったり EVM と WASM の特徴を理解したい スマートコントラクト開発を始めたい Web3 エンジニアになりたい EVM と WASM の特徴 EVM (Ethereum Virtual Machine) と WASM (Web Assembly…]]></description><link>https://smacon.dev/posts/evm-and-wasm</link><guid isPermaLink="false">https://smacon.dev/posts/evm-and-wasm</guid><pubDate>Fri, 20 May 2022 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事はこんな人にぴったり&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EVM と WASM の特徴を理解したい&lt;/li&gt;
&lt;li&gt;スマートコントラクト開発を始めたい&lt;/li&gt;
&lt;li&gt;Web3 エンジニアになりたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;EVM と WASM の特徴&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;EVM (Ethereum Virtual Machine)&lt;/strong&gt; と &lt;strong&gt;WASM (Web Assembly)&lt;/strong&gt; はどちらもブロックチェーン上のスマートコントラクトを実行するための環境として使われています。&lt;/p&gt;
&lt;p&gt;iPhone と Android に喩えるとわかりやすいかもしれません。&lt;/p&gt;
&lt;p&gt;どちらで Dapps を開発することもできますが、それぞれのメリット・デメリットを考慮する必要があります。&lt;/p&gt;
&lt;h2&gt;代表的なブロックチェーン&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;EVM&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ethereum.org/&quot;&gt;Ethereum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.avax.network/&quot;&gt;Avalanche&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://polygon.technology/&quot;&gt;Polygon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bnbchain.world/&quot;&gt;BNB Chain (旧 BSC)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://astar.network/&quot;&gt;Astar Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aurora.dev/&quot;&gt;Aurora&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://celo.org/&quot;&gt;Celo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WASM&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://solana.com&quot;&gt;Solana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.near.org/docs/develop/basics/getting-started&quot;&gt;NEAR Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dfinity.org/&quot;&gt;Internet Computer (DFINITY)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;開発言語&lt;/h2&gt;
&lt;p&gt;EVM のスマートコントラクトは Solidity を使って開発します。&lt;/p&gt;
&lt;p&gt;WASM はいろんなプログラミング言語を WASM にコンパイルすることができますが、代表的なものは Rust と C (C++) です。&lt;/p&gt;
&lt;h2&gt;誕生背景&lt;/h2&gt;
&lt;p&gt;EVM は名前の通り、Ethereum 上でスマートコントラクトを動かすために開発されました。&lt;/p&gt;
&lt;p&gt;EVM と Solidity は Ethereum とともに開発されてきたので、ブロックチェーンやスマートコントラクトを実装するために最適化されています。&lt;/p&gt;
&lt;p&gt;一方で、WASM はもともとブラウザで実行するプログラムのフォーマットとして設計されています。&lt;/p&gt;
&lt;h2&gt;互換性と拡張性&lt;/h2&gt;
&lt;p&gt;EVM は互換性が高いので、Ethereum 用に開発した Solidity のスマートコントラクトやライブラリ、開発ツールをほとんどそのまま他のチェーンでも使うことができます。&lt;/p&gt;
&lt;p&gt;互換性が高いことはメリットにもなりますが、それが制約になってしまうというデメリットにつながります。&lt;/p&gt;
&lt;p&gt;たとえばウォレットの機能やアカウントの権限を拡張したいと思っても EVM の仕様以外のことはできません。&lt;/p&gt;
&lt;p&gt;そういった EVM のチェーンにできないことをできるようにしたチェーンの多くが採用しているのが WASM です。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ゼロ知識証明を学ぼう | Web3 プログラミング, スマートコントラクト入門]]></title><description><![CDATA[…]]></description><link>https://smacon.dev/posts/zero-knowledge-proof</link><guid isPermaLink="false">https://smacon.dev/posts/zero-knowledge-proof</guid><pubDate>Fri, 20 May 2022 12:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;ゼロ知識証明とは？&lt;/h1&gt;
&lt;p&gt;ゼロ知識証明は、これまでのシステムやサービスにおいてできなかったことをできるようにしてくれるしくみです。&lt;/p&gt;
&lt;p&gt;準同型暗号や秘密計算といった数学の理論をもとにしており、秘密にしたい情報を公開せずに計算したり、証明したりするときに使います。&lt;/p&gt;
&lt;p&gt;ゼロ知識証明自体は、ブロックチェーンに限らずどんな分野でも使うことができますが、ブロックチェーンの課題を解決するために Web3 界隈で活発に研究が進められてきました。&lt;/p&gt;
&lt;p&gt;開発で使うためには数学やプログラミング、あるいはブロックチェーンの知識が必要ですが、ゼロ知識証明の概念を理解したり使うだけなら、誰にでもできます。&lt;/p&gt;
&lt;h3&gt;YouTube&lt;/h3&gt;
&lt;p&gt;YouTube のこの動画では、子供でもわかるようにゼロ知識証明を説明しています。&lt;/p&gt;
&lt;p&gt;日本語字幕はまだありませんが、YouTube の自動翻訳を使えば理解の助けになると思います。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fOGdb1CTu5c&quot;&gt;Computer Scientist Explains One Concept in 5 Levels of Difficulty | WIRED&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fOGdb1CTu5c&quot;&gt;&lt;img src=&quot;http://img.youtube.com/vi/fOGdb1CTu5c/0.jpg&quot; alt=&quot;Computer Scientist Explains One Concept in 5 Levels of Difficulty | WIRED&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;ゼロ知識証明を使った事例&lt;/h1&gt;
&lt;p&gt;ゼロ知識証明は、ブロックチェーンだけでなく既存の IT システムでも活用することができます。&lt;/p&gt;
&lt;p&gt;台湾では、コロナ対策のためにゼロ知識証明や QR コードを使ってプライバシーを保護しながら個人情報を共有するシステムを開発して、社会に役立ったという事例があります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.coindeskjapan.com/148317/&quot;&gt;ブロックチェーン的発想で社会を救う【オードリー・タン氏】&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;Zero-Knowledge University (zku.ONE)&lt;/h1&gt;
&lt;p&gt;ZKU (Zero-Knowledge University) ではオンラインでゼロ知識証明を体系的に学ぶことができます。&lt;/p&gt;
&lt;p&gt;筆者は受講していないので詳細まで把握していませんが、2022 年時点でゼロ知識証明を学びたい人にとっては、ZKU がもっとも優れた環境の 1 つではないかと思います。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zku.one/&quot;&gt;https://zku.one/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Ethereum L2 におけるゼロ知識証明&lt;/h1&gt;
&lt;p&gt;Ethereum のエコシステムにはスケーリングの課題があります。イーサリアムが世界中で使われるようになるとたくさんの処理をさばかなければなりません。そのために Rollup という手法が採用されました。&lt;/p&gt;
&lt;p&gt;Rollup とはレイヤー 2 というブロックチェーンを作りその上で行われる取引を集約してレイヤー 1 である Ethereum にまとめて記録する方法です。&lt;/p&gt;
&lt;p&gt;Rollup は大きく分けて Optimistic Rollup と ZK Rollup の 2 つの手法あります。
ZK Rollup の ZK はゼロ知識証明の Zero Knowledge です。&lt;/p&gt;
&lt;h2&gt;SNARK と STARK&lt;/h2&gt;
&lt;p&gt;ZK Rollup で使うゼロ知識証明には SNARK と STARK の 2 つのタイプがあります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/&quot;&gt;Zero-Knowledge Proofs: STARKs vs SNARKs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://academy.binance.com/en/articles/zk-snarks-and-zk-starks-explained&quot;&gt;zk-SNARKs and zk-STARKs Explained&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://pseudotheos.mirror.xyz/_LAi4cCFz2gaC-3WgNmri1eTvckA32L7v31A8saJvqg&quot;&gt;zkSNARKs vs zkSTARKs: a primer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SNARK と STARK にはそれぞれメリットがありますが、STARK のほうが SNARK よりあとに考案されており、SNARK のいくつかの弱点を補っています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;SNARK&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;STARK&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;信頼すべき機関&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;必要&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;不要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;量子コンピュータ耐性&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;なし&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;あり&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;それなら、SNARK より STARK のほうがいいのかと言えば、必ずしもそうとは言えません。
SNARK を使った ZkSync なら Solidity の資産を活かすことができます。&lt;/p&gt;
&lt;h4&gt;SNARK を使ったプロトコル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zksync.io/&quot;&gt;ZkSync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Loopring&lt;/li&gt;
&lt;li&gt;Polygon Hermez&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;STARK を使ったプロトコル&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://starkware.co/starknet/&quot;&gt;Starkware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Polygon Miden&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Rust ではじめるスマートコントラクト入門 | Web3 プログラミング学習]]></title><link>https://smacon.dev/rust/</link><guid isPermaLink="false">https://smacon.dev/rust/</guid><pubDate>Thu, 19 May 2022 20:38:00 GMT</pubDate><content:encoded></content:encoded></item><item><title><![CDATA[DFINITY 入門: Motoko プログラミングの始め方]]></title><description><![CDATA[このページは、DFINITY(Internet Computer) の Motoko Language チュートリアルを日本語で解説しています。 Explore the default project 実際に使ったソースコードはGitHub…]]></description><link>https://smacon.dev/posts/motoko-explore-hello</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-explore-hello</guid><pubDate>Wed, 18 May 2022 19:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページは、DFINITY(Internet Computer) の Motoko Language チュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/explore-templates/&quot;&gt;Explore the default project&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/explore_hello&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方は先にこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;手順&lt;/h1&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new explore_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のようなファイルが作られていれば OK です。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;explore_hello % ls explore_hello
README.md               node_modules            package.json            webpack.config.js
dfx.json                package-lock.json       src&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このプロジェクトで使うソースコードは&lt;code class=&quot;language-text&quot;&gt;src/explore_hello/main.mo&lt;/code&gt;に書かれています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;actor &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello, &quot;&lt;/span&gt; # name # &lt;span class=&quot;token string&quot;&gt;&quot;!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;greet()という関数に文字列を渡すと &lt;code class=&quot;language-text&quot;&gt;Hello, &amp;lt;文字列&gt;!&lt;/code&gt;を返す簡単なプログラムです。&lt;/p&gt;
&lt;h2&gt;ローカル実行環境の起動&lt;/h2&gt;
&lt;p&gt;以下のコマンドを実行して、ローカル PC 上に実行環境を起動します。
dfx.json ファイルがあるディレクトリで dfx コマンドを実行してください。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd explore_hello
dfx start&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のようにログが出力されれば成功です。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; INFO Starting server. Listening on http://127.0.0.1:8000/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もし、すでに 8000 番ポートを使っている場合は起動できません。&lt;/p&gt;
&lt;h2&gt;キャニスターの作成&lt;/h2&gt;
&lt;p&gt;キャニスターとは、スマートコントラクトの入れ物です。
直訳すると空き缶という意味で、ここでは空の入れ物をまず作るイメージです。
dfx.json があるプロジェクトディレクトリ上で dfx コマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd explore_hello
dfx canister create --all&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のように出力されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;The wallet canister on the &lt;span class=&quot;token string&quot;&gt;&quot;local&quot;&lt;/span&gt; network &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; user &lt;span class=&quot;token string&quot;&gt;&quot;default&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;&lt;/span&gt;
Creating canister &lt;span class=&quot;token string&quot;&gt;&quot;explore_hello&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;explore_hello&quot;&lt;/span&gt; canister created &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; canister id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rrkah-fqaaa-aaaaa-aaaaq-cai&quot;&lt;/span&gt;
Creating canister &lt;span class=&quot;token string&quot;&gt;&quot;explore_hello_assets&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;explore_hello_assets&quot;&lt;/span&gt; canister created &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; canister id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ryjl3-tyaaa-aaaaa-aaaba-cai&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最初に&lt;code class=&quot;language-text&quot;&gt;dfx start&lt;/code&gt;で&lt;code class=&quot;language-text&quot;&gt;local&lt;/code&gt;に起動したローカル実行環境に
&lt;code class=&quot;language-text&quot;&gt;default&lt;/code&gt;ユーザーによって
2 つのキャニスターが作られました。&lt;/p&gt;
&lt;p&gt;作られたキャニスターを識別するための ID が割り振られます。
今後キャニスターを指定するときにはこの ID を使います。
この ID は &lt;code class=&quot;language-text&quot;&gt;.dfx/local/canister_ids.json&lt;/code&gt; というファイルに保存されています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;cat&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dfx &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; local &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; canister_ids&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;explore_hello&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rrkah-fqaaa-aaaaa-aaaaq-cai&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;explore_hello_assets&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ryjl3-tyaaa-aaaaa-aaaba-cai&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ビルド&lt;/h2&gt;
&lt;p&gt;ソースコードをビルドします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx build&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Motoko で書かれたソースコードをコンパイルして WASM という実行モジュールをビルドしています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;explore_hello &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; dfx build
Building canisters&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
Building frontend&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;デプロイ&lt;/h2&gt;
&lt;p&gt;先ほどビルドして作成した WASM モジュールを実行環境にデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister install --all&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Internet Computer に作った空き缶（キャニスター）の中に、WASM という実行プログラムを入れるイメージです。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;explore_hello &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; dfx canister install &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;all
Creating &lt;span class=&quot;token constant&quot;&gt;UI&lt;/span&gt; canister on the local network&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
The &lt;span class=&quot;token constant&quot;&gt;UI&lt;/span&gt; canister on the &lt;span class=&quot;token string&quot;&gt;&quot;local&quot;&lt;/span&gt; network &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;r7inp-6aaaa-aaaaa-aaabq-cai&quot;&lt;/span&gt;
Installing code &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; canister explore_hello&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; canister_id rrkah&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;fqaaa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;aaaaa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;aaaaq&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;cai
Installing code &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; canister explore_hello_assets&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; canister_id ryjl3&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;tyaaa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;aaaaa&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;aaaba&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;cai
Authorizing our &lt;span class=&quot;token function&quot;&gt;identity&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; to the asset canister&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
Uploading assets to asset canister&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
Starting batch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
Staging contents &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;and&lt;/span&gt; changed assets&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;favicon&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ico &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15406&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;html &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;671&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gzip&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;386&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;js &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;604206&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;js&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gzip&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;144664&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;css &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;537&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;css&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gzip&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;297&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;sample&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;asset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;txt &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;logo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;png &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;25397&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;js&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;map &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;653971&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;js&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gzip&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;148954&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Committing batch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ローカルの実行環境にキャニスターをデプロイしました。&lt;/p&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;p&gt;キャニスターを実行してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;explore_hello % dfx canister call explore_hello greet &apos;(&quot;everyone&quot;: text)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;explore_hello&lt;/code&gt;はキャニスターの名前です。裏側ではキャニスター ID で管理されています。
greet()という関数に&lt;code class=&quot;language-text&quot;&gt;&quot;everyone&quot;&lt;/code&gt;という text 型の文字列を渡しています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;結果
(&quot;Hello, everyone!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ローカル実行環境の停止&lt;/h2&gt;
&lt;p&gt;以下のいずれかの方法でローカル PC の実行環境を停止できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dfx start を実行したターミナルで Ctrl+C を実行&lt;/li&gt;
&lt;li&gt;dfx.json があるディレクトリ上で以下のコマンドを実行&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Internet Computer の世界へようこそ&lt;/h1&gt;
&lt;p&gt;公式のチュートリアルや Examples を日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-actor-hello&quot;&gt;はじめてのアクター&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-location-hello&quot;&gt;パラメータを渡してキャニスターを実行する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-my-counter&quot;&gt;Candid UI を使ってキャニスターを実行する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-calc&quot;&gt;簡単な数値計算&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-phonebook&quot;&gt;ライブラリを使って簡単な電話帳アプリを作ろう&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-multiple-actors&quot;&gt;複数のアクター&amp;#x26;キャニスター&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/motoko-linkedup&quot;&gt;キャニスター間の関数呼び出し&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/access-hello&quot;&gt;ID とアクセス管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/cycles-hello&quot;&gt;CYCLE ウォレットとキャニスター&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[NFT プログラミング入門: OpenZeppelin ライブラリを使った ERC721 コントラクト]]></title><description><![CDATA[このページはこんな人におすすめ Solidity を学びたい NFT のプログラミングを学習したい 簡単なスマートコントラクトの作り方を知りたい 新しい Hardhat プロジェクトを作る open-zeppelin-erc721 というディレクトリを作り
npm…]]></description><link>https://smacon.dev/posts/open-zeppelin-erc721</link><guid isPermaLink="false">https://smacon.dev/posts/open-zeppelin-erc721</guid><pubDate>Mon, 02 May 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solidity を学びたい&lt;/li&gt;
&lt;li&gt;NFT のプログラミングを学習したい&lt;/li&gt;
&lt;li&gt;簡単なスマートコントラクトの作り方を知りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;新しい Hardhat プロジェクトを作る&lt;/h1&gt;
&lt;p&gt;open-zeppelin-erc721 というディレクトリを作り
npm パッケージの hardhat をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir open-zeppelin-erc721
cd open-zeppelin-erc721
npm init -y
npm i --save-dev hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hardhat のサンプルプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Create a sample project&lt;/code&gt;を選択して、すべて Yes で回答します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What do you want to do? …
❯ Create a sample project
  Create an empty hardhat.config.js
  Quit&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;OpenZeppelin ライブラリのインストール&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install -D hardhat @openzeppelin/contracts&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;コーディング&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.openzeppelin.com/contracts/4.x/erc721&quot;&gt;OpenZeppelin (ERC721)&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;contracts/GameItem.sol&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// contracts/GameItem.sol&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.8.6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@openzeppelin/contracts/utils/Counters.sol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GameItem&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; ERC721URIStorage &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Counters&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; Counters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Counter&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    Counters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Counter &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; _tokenIds&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ERC721&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;GameItem&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ITM&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;awardItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;address&lt;/span&gt; player&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;memory&lt;/span&gt; tokenURI&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; newItemId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _tokenIds&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;_mint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;player&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newItemId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;_setTokenURI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newItemId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tokenURI&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        _tokenIds&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; newItemId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;hardhat.config.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nomiclabs/hardhat-waffle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// This is a sample Hardhat task. To learn how to create your own go to&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// https://hardhat.org/guides/create-task.html&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;accounts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Prints the list of accounts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;taskArgs&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; hre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; accounts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSigners&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; account &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; accounts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// You need to export an object to set up your config&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Go to https://hardhat.org/config/ to learn more&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * @type import(&apos;hardhat/config&apos;).HardhatUserConfig
 */&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.8.6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Solidity 入門: NFT プログラミング (ERC721)]]></title><description><![CDATA[このページはこんな人におすすめ NFT のプログラミングを学習したい Solidity を学びたい 簡単なスマートコントラクトの作り方を知りたい Web3 エンジニアになりたい このページでは Solidity by Example…]]></description><link>https://smacon.dev/posts/erc721</link><guid isPermaLink="false">https://smacon.dev/posts/erc721</guid><pubDate>Mon, 02 May 2022 19:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NFT のプログラミングを学習したい&lt;/li&gt;
&lt;li&gt;Solidity を学びたい&lt;/li&gt;
&lt;li&gt;簡単なスマートコントラクトの作り方を知りたい&lt;/li&gt;
&lt;li&gt;Web3 エンジニアになりたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このページでは Solidity by Example の&lt;a href=&quot;https://solidity-by-example.org/app/erc721&quot;&gt;サンプルコード&lt;/a&gt;を使ってスマートコントラクトを作る方法を解説します。&lt;/p&gt;
&lt;p&gt;以下のページでほかのサンプルコードも解説しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/first-app&quot;&gt;はじめてのイーサリアム Dapps 開発&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/erc721&quot;&gt;NFT プログラミング (ERC721)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/price-oracle&quot;&gt;オラクルの基本的な使い方（Chainlink Data Feeds)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/merkle-tree&quot;&gt;Merkle Proof（マークルツリーと Keccak256）&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/solidity-events&quot;&gt;定義したイベントを発行してブロックチェーンに記録&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardhat を使ったことがない方は以下の記事も合わせてご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けのスマートコントラクト開発&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;事前準備&lt;/h1&gt;
&lt;p&gt;今回はテスト版の OpenSea がある Rinkeby にデプロイします。
JavaScript の開発ツールである npm と npx をインストールした環境で開発します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;npm &amp;#x26; npx コマンド&lt;/li&gt;
&lt;li&gt;テストネット Rinkeby の ETH トークン&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rinkeby のエンドポイントと秘密鍵を環境変数で設定しておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/code&gt;: ウォレットの秘密鍵&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;RINKEBY_RPC_URL&lt;/code&gt;: Rinkeby の RPC エンドポイント&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;環境変数の使い方については以下の記事をご覧ください&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/deploy-testnet&quot;&gt;Hardhat の使い方: Ethereum のテストネットにデプロイしよう！&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;新しい Hardhat プロジェクトを作る&lt;/h1&gt;
&lt;p&gt;erc721 というディレクトリを作り
npm パッケージの hardhat をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir erc721
cd erc721
npm init -y
npm i --save-dev hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hardhat のサンプルプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Create a sample project&lt;/code&gt;を選択して、すべて Yes で回答します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What do you want to do? …
❯ Create a sample project
  Create an empty hardhat.config.js
  Quit&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;コーディング&lt;/h1&gt;
&lt;p&gt;以下の 3 つのファイルを作ります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hardhat.config.js&lt;/li&gt;
&lt;li&gt;contracts/erc721.sol&lt;/li&gt;
&lt;li&gt;scripts/deploy.js&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;hardhat.config.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nomiclabs/hardhat-waffle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * @type import(&apos;hardhat/config&apos;).HardhatUserConfig
 */&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.8.6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;rinkeby&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;accounts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;contracts/erc721.sol&lt;/h3&gt;
&lt;p&gt;Solidity by Example のサンプルコードを丸ごとコピペして &lt;code class=&quot;language-text&quot;&gt;contracts/erc721.sol&lt;/code&gt; を作ります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://solidity-by-example.org/app/erc721&quot;&gt;Solidity by Example (ERC721)&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;secripts/deploy.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hre &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hardhat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Factory &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ERC721&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Factory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deployed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Contract deployed to:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;コンパイル＆デプロイ&lt;/h1&gt;
&lt;p&gt;以下のコマンドでコンパイルします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat compile&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のように表示されればコンパイル成功です。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Compiled 1 Solidity file successfully&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;環境変数を設定した状態で以下のコマンドでデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# 環境変数を書いたファイルを読み込む
source env.txt

# デプロイ
npx hardhat run scripts/deploy.js --network rinkeby&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のように表示されれば、デプロイ成功です。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Contract deployed to: 0x2789eE319C74dd5bd9b3E46E2B89Ba2E07cC7D88&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;確認&lt;/h2&gt;
&lt;p&gt;Rinkeby の Etherscan でデプロイしたコントラクトを確認してみましょう。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rinkeby.etherscan.io/address/0x2789eE319C74dd5bd9b3E46E2B89Ba2E07cC7D88&quot;&gt;https://rinkeby.etherscan.io/address/0x2789eE319C74dd5bd9b3E46E2B89Ba2E07cC7D88&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このページで実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/solidity-example/tree/main/erc721&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Solidity 入門: イーサリアムアプリ開発 Dapps プログラミング]]></title><description><![CDATA[このページはこんな人におすすめ Solidity を学びたい 簡単なスマートコントラクトの作り方を知りたい Hardhat を使った Solidity のテスト方法を知りたい このページで実際に使ったソースコードはGitHubからダウンロードできます。 Solidity by…]]></description><link>https://smacon.dev/posts/first-app</link><guid isPermaLink="false">https://smacon.dev/posts/first-app</guid><pubDate>Fri, 29 Apr 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solidity を学びたい&lt;/li&gt;
&lt;li&gt;簡単なスマートコントラクトの作り方を知りたい&lt;/li&gt;
&lt;li&gt;Hardhat を使った Solidity のテスト方法を知りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このページで実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/solidity-example/tree/main/first-app&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;Solidity by Example のサンプルコードを使ってスマートコントラクトを作る方法を解説します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://solidity-by-example.org/first-app/&quot;&gt;First Application (Solidity by Example)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hardhat を使ったことがない方は先にこちらもご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けのスマートコントラクト開発&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;新しい Hardhat プロジェクトを作る&lt;/h1&gt;
&lt;p&gt;first-app というディレクトリを作り
npm パッケージの hardhat をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir first-app
cd first-app
npm init -y
npm i --save-dev hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hardhat のサンプルプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Create a sample project&lt;/code&gt;を選択して、すべて Yes で回答します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What do you want to do? …
❯ Create a sample project
  Create an empty hardhat.config.js
  Quit&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで hardhat.config.js の初期設定や ether.js などプラグインを追加した状態になります。&lt;/p&gt;
&lt;h1&gt;コーディング&lt;/h1&gt;
&lt;p&gt;contracts/Counter.sol と hardhat.config.js を編集します。
2 つの Solidity バージョンが一致するようにしましょう。&lt;/p&gt;
&lt;h3&gt;contracts/Counter.sol&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.8.9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; count&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Function to get the current count&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; count&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Function to increment count by 1&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        count &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Function to decrement count by 1&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        count &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2022 年 1 月現在、サンプルコードのバージョンは 0.8.10 になっており、
Hardhat 側は 0.8.9 まで対応中なので、0.8.9 に合わせます。&lt;/p&gt;
&lt;h3&gt;hardhat.config.js の一部&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.8.9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;テスト&lt;/h1&gt;
&lt;p&gt;Hardhat では JavaScript のテストツールの chai を使っています。
sample-test.js を以下のように編集します。&lt;/p&gt;
&lt;h3&gt;test/sample-test.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; expect &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chai&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ethers &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hardhat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; Factory&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 各テストの前に毎回デプロイ処理が走ります&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    Factory &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Factory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 初期状態でget()の戻り値が0であること&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Should be 0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// inc()を実行すると+1されること&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Should be 1 after inc()&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Tx &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Tx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// dec()を実行すると-1されること&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Should be 0 after inc() and dec()&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Tx1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Tx1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Tx2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Tx2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;テスト実行&lt;/h2&gt;
&lt;p&gt;以下のコマンドを実行すると test ディレクトリ配下にあるテストが実行されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat test&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
  Counter
    ✓ Should be 0
    ✓ Should be 1 after inc()
    ✓ Should be 0 after inc() and dec()


  3 passing (406ms)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;3 つのテストがすべて Pass(成功)となりました。&lt;/p&gt;
&lt;h1&gt;デプロイ（ローカル実行環境）&lt;/h1&gt;
&lt;p&gt;scripts/deploy.js というファイルを作ります。
このファイルはローカル実行環境あるいはパブリックブロックチェーンにデプロイしたり、
スマートコントラクトの関数を実行したりする処理を記述します。&lt;/p&gt;
&lt;h3&gt;scripts/deploy.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hre &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hardhat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Factory &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Factory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deployed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Contract deployed to:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のコマンドでデプロイを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat run scripts/deploy.js&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Contract deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでローカル実行環境にデプロイできました。&lt;/p&gt;
&lt;p&gt;ローカル実行県境で試したら、つぎはパブリックテストネットにデプロイしてみましょう。&lt;/p&gt;
&lt;h1&gt;デプロイ（テストネット）&lt;/h1&gt;
&lt;p&gt;ブロックチェーンには本番用のメインネットと検証用のテストネットがあります。&lt;/p&gt;
&lt;p&gt;Ethereum には複数のテストネットがあり、誰でもトークンをもらうことができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ropsten&lt;/li&gt;
&lt;li&gt;Rinkeby&lt;/li&gt;
&lt;li&gt;Kovan&lt;/li&gt;
&lt;li&gt;Goerli&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スマートコントラクトをテストネットやメインネットにデプロイする方法を 2 つ紹介します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/deploy-testnet&quot;&gt;Hardhat の使い方: Ethereum のテストネットにデプロイしよう！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/remix-tutorial&quot;&gt;Remix の使い方: Metamask でスマートコントラクトをデプロイ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Motoko Base Library]]></title><description><![CDATA[Motoko Language Tour https://internetcomputer.org/docs/current/motoko/main/motoko Motoko Programming Language Guide https://internetcomputer…]]></description><link>https://smacon.dev/posts/motoko-base-library</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-base-library</guid><pubDate>Fri, 29 Apr 2022 10:38:00 GMT</pubDate><content:encoded>&lt;h2&gt;Motoko Language Tour&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/motoko&quot;&gt;https://internetcomputer.org/docs/current/motoko/main/motoko&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Motoko Programming Language Guide&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/about-this-guide&quot;&gt;https://internetcomputer.org/docs/current/motoko/main/about-this-guide&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Sample Code&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/samples&quot;&gt;https://internetcomputer.org/samples&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dfinity/examples/tree/master/motoko&quot;&gt;https://github.com/dfinity/examples/tree/master/motoko&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Motoko Base Library Reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Array&quot;&gt;Array&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/AssocList&quot;&gt;AssocList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Blob&quot;&gt;Blob&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Bool&quot;&gt;Bool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Buffer&quot;&gt;Buffer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/CertifiedData&quot;&gt;CertifiedData&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Char&quot;&gt;Char&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Debug&quot;&gt;Debug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Deque&quot;&gt;Deque&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Error&quot;&gt;Error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/ExperimentalCycles&quot;&gt;ExperimentalCycles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/ExperimentalStableMemory&quot;&gt;ExperimentalStableMemory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Float&quot;&gt;Float&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Func&quot;&gt;Func&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Hash&quot;&gt;Hash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/HashMap&quot;&gt;HashMap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Heap&quot;&gt;Heap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Int&quot;&gt;Int&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Int8&quot;&gt;Int8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Int16&quot;&gt;Int16&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Int32&quot;&gt;Int32&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Int64&quot;&gt;Int64&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Iter&quot;&gt;Iter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/IterType&quot;&gt;IterType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/List&quot;&gt;List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Nat&quot;&gt;Nat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Nat8&quot;&gt;Nat8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Nat16&quot;&gt;Nat16&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Nat32&quot;&gt;Nat32&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Nat64&quot;&gt;Nat64&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/None&quot;&gt;None&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Option&quot;&gt;Option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Order&quot;&gt;Order&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Prelude&quot;&gt;Prelude&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Principal&quot;&gt;Principal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/RBTree&quot;&gt;RBTree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Random&quot;&gt;Random&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Result&quot;&gt;Result&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Stack&quot;&gt;Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Text&quot;&gt;Text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Time&quot;&gt;Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/Trie&quot;&gt;Trie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/TrieMap&quot;&gt;TrieMap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/motoko/main/base/TrieSet&quot;&gt;TrieSet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[NFT プログラミング入門: いろんな NFT の実装方法の分類]]></title><description><![CDATA[このページはこんな人におすすめ NFT の実装の分類が知りたい 独自スマートコントラクトの NFT を作りたい NFT では ERC721 や ERC115…]]></description><link>https://smacon.dev/posts/original-nft</link><guid isPermaLink="false">https://smacon.dev/posts/original-nft</guid><pubDate>Sun, 24 Apr 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NFT の実装の分類が知りたい&lt;/li&gt;
&lt;li&gt;独自スマートコントラクトの NFT を作りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NFT では ERC721 や ERC1155 という共通の仕様がありますが、その機能によって実装方法はいろいろあります。&lt;/p&gt;
&lt;p&gt;それらを分類して作り方を紹介しているサイトをまとめました。&lt;/p&gt;
&lt;p&gt;NFT の種類は無数に存在しますが、ここでは 2021~2022 年に開発が活発になっている NFT について紹介します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenSea で発行&lt;/li&gt;
&lt;li&gt;ジェネラティブ NFT&lt;/li&gt;
&lt;li&gt;Loot&lt;/li&gt;
&lt;li&gt;フルオンチェーン(SVG/Bitmap/オリジナル）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;おまけでノーコードのサービスも載せておきます。エンジニアじゃなくても画面をポチポチするだけで ERC721 や ERC1155 のスマートコントラクトをメインネットにデプロイできます。&lt;/p&gt;
&lt;h1&gt;どのブロックチェーンがいいの？&lt;/h1&gt;
&lt;p&gt;チェーンはたくさんありますが、学習目的の場合にオススメなのは Ethereum のテストネット(Rinkeby)です。&lt;/p&gt;
&lt;p&gt;どのブロックチェーンを使うか決まっていないのなら、まずは EVM(Ethereum Virtual Machine)に取り組むのが良いでしょう。&lt;/p&gt;
&lt;p&gt;理由は、開発者もユーザー数も最大で技術と市場が一番成長しているからです。&lt;/p&gt;
&lt;p&gt;テスト用の OpenSea があるため、発行した NFT を OpenSea で見ることができます。&lt;/p&gt;
&lt;h2&gt;ERC721/1155&lt;/h2&gt;
&lt;p&gt;EVM で発行される NFT は、ERC721 または ERC1155 のスマートコントラクトと言い換えることができます。&lt;/p&gt;
&lt;p&gt;あとから紹介するジェネラティブ, Loot, フルオンチェーンも ERC721 または ERC1155 に従っています。&lt;/p&gt;
&lt;p&gt;NFT を作る場合に、一番簡単な方法は、OpenSea から発行する方法です。&lt;/p&gt;
&lt;p&gt;OpenSea で発行する場合は OpenSea が所有する ERC1155 のコントラクトです。(2022 年 1 月現在)&lt;/p&gt;
&lt;p&gt;独自コントラクトでも ERC721 や ERC1155 のフォーマットに合わせていれば OpenSea や他のマーケットプレイスで売買することができます。&lt;/p&gt;
&lt;h3&gt;OpenSea (Testnet)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://testnets.opensea.io/&quot;&gt;https://testnets.opensea.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;テストネット用の ETH は無料で入手できますが、不安定なので動いているときと動いていないときがあります。&lt;/p&gt;
&lt;h4&gt;Faucet (Rinkeby)&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://faucet.rinkeby.io/&quot;&gt;https://faucet.rinkeby.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Chainlink の Faucet からでも Rinkeby の ETH をもらうことができます。&lt;/p&gt;
&lt;h4&gt;Faucet Chainlink&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://faucets.chain.link/rinkeby&quot;&gt;https://faucets.chain.link/rinkeby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OpenSea で作る場合は、スマートコントラクトの所有者は OpenSea です。
もし OpenSea で作った NFT に不便を感じていないならいまは独自コントラクトをつくる必要はないでしょう。&lt;/p&gt;
&lt;p&gt;もし、ユーザーに直接 mint してもらう NFT や、フルオンチェーンの NFT を作りたい場合は、OpenSea では作れません。
そういう NFT を作る時には独自のスマートコントラクトをデプロイして NFT を発行します。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.blockchainengineer.tokyo/entry/2021-issue-nft-code&quot;&gt;【2021 年版】NFT を発行してほしいという問い合わせが多いので発行方法とサンプルコードを公開します&lt;/a&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;a href=&quot;https://zenn.dev/razokulover/articles/7db2340f14c2cd&quot;&gt;NFT 完全に理解した！！になるために独自コントラクトで NFT を発行してみる方法の解説&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;ジェネラティブ NFT&lt;/h2&gt;
&lt;p&gt;画像を組み合わせてユニークな画像を 10,000 枚使った NFT の作り方の紹介です。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://note.com/standenglish/n/nf6931087b3bb&quot;&gt;（保存版）10,000 種類のジェネレイティブ NFT の作り方&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;Loot&lt;/h2&gt;
&lt;p&gt;Loot は画像の代わりに文字情報を持った NFT です。
発行する NFT の Token ID ごとに異なるパラメータを持たせることができます。
創造力次第で可能性が広がる NFT ですね。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://ethereumnavi.com/2021/11/10/how-to-create-loot-nft/&quot;&gt;【Solidity】Loot 型の NFT をつくってみよう！&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;フルオンチェーン（SVG）&lt;/h2&gt;
&lt;p&gt;フルオンチェーンは名前のとおり、データをオンチェーンに載せています。&lt;/p&gt;
&lt;p&gt;PNG や JPEG などの画像を使った NFT の場合は、画像ファイルをチェーンには載せない方法が一般的です。
理由は、オンチェーンにこれらの画像データを載せるとストレージコストが高いためです。&lt;/p&gt;
&lt;p&gt;SVG というフォーマットの画像を動的に生成する特性を活かしてスマートコントラクトで SVG を生成します。
その結果、外部のファイルを使うことなくすべてのデータをオンチェーンに載せたフルオンチェーン NFT となります。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://note.com/standenglish/n/ne2f5f684faae&quot;&gt;【保存版】フルオンチェーン NFT の作り方_完全版（入門レベル）&lt;/a&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;a href=&quot;https://note.com/standenglish/n/nc2b326cd07ba&quot;&gt;【保存版】SVG 徹底解説！アニメーション・フルオンチェーン NFT を作ろう！&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;フルオンチェーン（Bitmap）&lt;/h2&gt;
&lt;p&gt;Bitmap は画像の 1 ドットごとに色情報を持つ原始的な画像フォーマットです。
高精細な画像の場合はデータが大きくなりますが、あえて Bitmap で画素数の少ないドット絵を表現しています。
原始的な手法ゆえに、いかに容量を節約したり表現を豊かにしたりするかプログラマの腕の見せ所です。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://qiita.com/h2ueno/items/4a51d95ed3712a2ec639&quot;&gt;full-on-chain pixel art NFT&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;フルオンチェーン（オリジナル）&lt;/h2&gt;
&lt;p&gt;最後にスマートコントラクトの特徴を活かした遊び心のある NFT の記事を紹介します。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://nawoo.hateblo.jp/entry/2021/10/05/121859&quot;&gt;おみくじ NFT を作りました&lt;/a&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;a href=&quot;https://nawoo.hateblo.jp/entry/die-after-100hrs&quot;&gt;100 時間後に死ぬ NFT を作りました&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;ノーコード(おまけ)&lt;/h2&gt;
&lt;p&gt;thirdweb を使うと ERC20, ERC721, ERC1155 など汎用的なスマートコントラクトをノーコードでデプロイできます。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://thirdweb.com/&quot;&gt;thirdweb&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;ここで紹介しているページは、プロの自分から見た信頼できる技術者の情報を選んでいます。&lt;/p&gt;
&lt;p&gt;素晴らしい記事を作成してくださったエンジニア著者の皆さまに敬意と感謝の気持ちを込めて&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ICP プログラミング入門: Rust ではじめてのキャニスター開発]]></title><description><![CDATA[このページはこんな人におすすめ Rust を勉強したい DFINITY(ICP) の開発に興味がある このページは、以下の DFINITY(Internet Computer) の Rust のチュートリアルを日本語で解説しています。 Hello, World! Rust CDK…]]></description><link>https://smacon.dev/posts/hello-icp-rust</link><guid isPermaLink="false">https://smacon.dev/posts/hello-icp-rust</guid><pubDate>Sun, 24 Apr 2022 19:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rust を勉強したい&lt;/li&gt;
&lt;li&gt;DFINITY(ICP) の開発に興味がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このページは、以下の DFINITY(Internet Computer) の Rust のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/rust/rust-quickstart&quot;&gt;Hello, World! Rust CDK Quick Start&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このページで実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/rust-tutorial/tree/main/rust_hello&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;rustup: 1.24.3&lt;/li&gt;
&lt;li&gt;rustc: 1.57.0&lt;/li&gt;
&lt;li&gt;cargo: 1.57.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;インストール&lt;/h1&gt;
&lt;h2&gt;dfx のインストール&lt;/h2&gt;
&lt;p&gt;dfx コマンドは DFINITY のキャニスターをビルドしたりデプロイしたりするためのツールです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/setup/install/&quot;&gt;dfx のインストールガイド&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下のコマンドで dfx をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sh -ci &quot;$(curl -fsSL https://sdk.dfinity.org/install.sh)&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;rustup (Rust Toolchain)&lt;/h2&gt;
&lt;p&gt;以下のコマンドによって Rust 系のツールをまとめてインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl --proto &apos;=https&apos; --tlsv1.2 https://sh.rustup.rs -sSf | sh&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;rustc: Rust コンパイラ&lt;/li&gt;
&lt;li&gt;cargo: Rust のパッケージマネージャ&lt;/li&gt;
&lt;li&gt;rustup: Rust のビルドツール全体を管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;CMake のインストール&lt;/h2&gt;
&lt;p&gt;以下のコマンドで cmake をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;brew install cmake&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;DFINITY のデフォルトの開発言語は Motoko です。
&lt;code class=&quot;language-text&quot;&gt;--type=rust&lt;/code&gt;をつけて Rust 用のプロジェクトを作成します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new --type=rust rust_hello
cd rust_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;dfx.json というファイルを見てみましょう。
dfx コマンドでビルドするときにはこのファイルの設定が使われます。&lt;/p&gt;
&lt;h3&gt;dfx.json&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;canisters&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;rust_hello&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;candid&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src/rust_hello/rust_hello.did&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;package&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rust_hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rust&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;rust_hello_assets&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;rust_hello&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;frontend&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;entrypoint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src/rust_hello_assets/src/index.html&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;src/rust_hello_assets/assets&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;dist/rust_hello_assets/&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assets&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;defaults&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;packtool&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;networks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;bind&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1:8000&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ephemeral&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;キャニスター(スマートコントラクト)の作成&lt;/h1&gt;
&lt;h2&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;cargo は Rust のビルドに使うツールです。
Cargo.toml には、cargo で使う設定が書かれています。
rust_hello プロジェクトには、2 つの Cargo.toml があります。&lt;/p&gt;
&lt;h3&gt;Cargo.toml&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;toml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-toml line-numbers&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;workspace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;members&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;src/rust_hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;src/rust_hello/Cargo.toml&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;toml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-toml line-numbers&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rust_hello&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.1.0&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;edition&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lib.rs&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;crate-type&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cdylib&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;ic-cdk&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.3&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;ic-cdk-macros&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.3&quot;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;src/rust_hello/lib.rs&lt;/h3&gt;
&lt;p&gt;スマートコントラクト本体のソースコードです。
今回は greet というシンプルな関数だけが書かれています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;rust&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-rust line-numbers&quot;&gt;&lt;code class=&quot;language-rust&quot;&gt;&lt;span class=&quot;token attribute attr-name&quot;&gt;#[ic_cdk_macros::query]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token macro property&quot;&gt;format!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello, {}!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Candid&lt;/h3&gt;
&lt;p&gt;Candid はキャニスターのインターフェースの情報が書かれており、
フロントエンドからキャニスターを実行するときにはこのインターフェースの情報を利用します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;rust&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-rust line-numbers&quot;&gt;&lt;code class=&quot;language-rust&quot;&gt;service &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;greet&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; query&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この場合は、greet という query があり、引数と戻りは text です。&lt;/p&gt;
&lt;h2&gt;ビルド&amp;#x26;デプロイ&lt;/h2&gt;
&lt;p&gt;PC 上にローカル実行環境を起動します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --background&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;WASM にはいろんなフォーマットがあるため、DFINITY 用の WASM32 を追加します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rustup target add wasm32-unknown-unknown&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Rust の WASM キャニスターをビルドしてローカル実行環境にデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Creating a wallet canister on the local network.
The wallet canister on the &quot;local&quot; network for user &quot;alice_auth&quot; is &quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;
Deploying all canisters.
Creating canisters...
Creating canister &quot;rust_hello&quot;...
（中略）
Committing batch.
Deployed canisters.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;キャニスターの実行&lt;/h1&gt;
&lt;p&gt;rust_hello というキャニスターの greet()という関数に world という引数を渡して実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call rust_hello greet world&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(&quot;Hello, world!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;フロントエンドの起動&lt;/h2&gt;
&lt;p&gt;公式手順には載っていませんが、Motoko のチュートリアルと同様に
フロントエンドを起動して、フロントエンドからキャニスターを実行することもできます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install
npm start&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1365f35be257bb1d83c148a9849f7863/a4f81/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.12658227848101%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABb0lEQVR42p2RS0vDQBRG+4/dK4jgWncu3enalQvRUsSNrypuStEWiS3RJE21jWkm88iRaR5ajQUd+HJvMt+czL23Qc3KsuzHN1Ozn9WcbdTBygMHly7rZ8/cxcDNEdPdVVTnuPAZ+1gOtCBjclP3ymFvq8UIWNm/43RvF2Yh2fkmJhpW0O/V/LxhAXxzJ9xuHMJOi2C7yVpXs/8Q0u0cgha/tqZR1zuRCBSG9/4L0UkHZMpMKZrOK0/jGKU0Uspa6ALQmLz11+1rLi8uuH/sE4qIZqvFTbuNiiY89h/o9XoMBoPlwLx/OTCOY4QQGK1RqSRJEhIhkNpgCp/WenHiRWx8nep/V8mwqm44Go3wPI/xeDzPfc9DSM00MUTCEBXRzkxJSRAEhGFYVVWVrJTCyvd9HMfBdV2Gw+E8n74neG8Cv1AwEaRSMZvFc4/1pmk6L7/kVMC6sq1Ra4VWhbTiq9+qfK+A9g+l7CDy+Jn/VR9LeqEyrirTTgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Rust&quot;
        title=&quot;&quot;
        src=&quot;/static/1365f35be257bb1d83c148a9849f7863/f058b/1.png&quot;
        srcset=&quot;/static/1365f35be257bb1d83c148a9849f7863/c26ae/1.png 158w,
/static/1365f35be257bb1d83c148a9849f7863/6bdcf/1.png 315w,
/static/1365f35be257bb1d83c148a9849f7863/f058b/1.png 630w,
/static/1365f35be257bb1d83c148a9849f7863/40601/1.png 945w,
/static/1365f35be257bb1d83c148a9849f7863/78612/1.png 1260w,
/static/1365f35be257bb1d83c148a9849f7863/a4f81/1.png 1508w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;停止&lt;/h2&gt;
&lt;p&gt;ローカル実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Rust エンジニアへの第一歩を踏み出しました！
ソースコードを変えていろんなキャニスターを作ってみましょう。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ウォレットいらずのスマートコントラクト開発 | はじめてのイーサリアム開発]]></title><description><![CDATA[このページはこんな人におすすめ スマートコントラクト開発を始める ブロックチェーン開発に興味がある Dapps や Web3 に興味がある ブロックチェーンを使った開発をまったくやったことがない方に向けて書いています。
npm という JavaScript…]]></description><link>https://smacon.dev/posts/first-smart-contract</link><guid isPermaLink="false">https://smacon.dev/posts/first-smart-contract</guid><pubDate>Wed, 20 Apr 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スマートコントラクト開発を始める&lt;/li&gt;
&lt;li&gt;ブロックチェーン開発に興味がある&lt;/li&gt;
&lt;li&gt;Dapps や Web3 に興味がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ブロックチェーンを使った開発をまったくやったことがない方に向けて書いています。
npm という JavaScript のパッケージ管理ツールさえあれば実行できます。&lt;/p&gt;
&lt;h1&gt;本記事で学べること&lt;/h1&gt;
&lt;p&gt;Solidity という言語を使って Hello World のスマートコントラクトを作ります。
ローカル実行環境に作るところから始めましょう。
ローカル実行環境には Hardhat という開発ツールを使います。&lt;/p&gt;
&lt;p&gt;スマートコントラクトの開発は、ブロックチェーンと開発言語を選ぶことになります。
2022 年現在、もっとも開発が活発に進んでいるのは Ethereum です。&lt;/p&gt;
&lt;p&gt;Ethereum のスマートコントラクトは EVM（Ethereum Virtual Machine）で実行されます。&lt;/p&gt;
&lt;h2&gt;EVM と WASM&lt;/h2&gt;
&lt;p&gt;スマートコントラクトの実行形式は大まかに EVM と WASM(WebAssembly)の２つに分類できます。&lt;/p&gt;
&lt;p&gt;EVM のスマートコントラクトの開発言語は Solidity です。&lt;/p&gt;
&lt;p&gt;EVM 対応のブロックチェーンは互換性があり、別のチェーンでも同じソースコードを使えます。
例えば、Ethereum 用のスマートコントラクトのソースコードを Polygon でそのまま使うことができます。&lt;/p&gt;
&lt;p&gt;WASM 対応のブロックチェーンは、チェーンごとにそれぞれの特徴があるので、スマートコントラクトのソースコードを使い回すことはできません。&lt;/p&gt;
&lt;p&gt;現在は WASM にコンパイルする開発言語は Rust が主流ですが、技術的には WASM にコンパイルできればどんな言語も使えます。&lt;/p&gt;
&lt;h2&gt;必要なもの&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;npm &amp;#x26; npx コマンド&lt;/li&gt;
&lt;li&gt;好みのテキストエディタ&lt;/li&gt;
&lt;li&gt;好みのターミナルソフト&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;新しい Hardhat プロジェクトを作る&lt;/h1&gt;
&lt;p&gt;hello というディレクトリを作り
npm パッケージの hardhat をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir hello
cd hello
npm init -y
npm i --save-dev hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hardhat のサンプルプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Create a sample project&lt;/code&gt;を選択して、すべて Yes で回答します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What do you want to do? …
❯ Create a sample project
  Create an empty hardhat.config.js
  Quit&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで hardhat.config.js の初期設定や ether.js などプラグインを追加した状態になります。&lt;/p&gt;
&lt;h1&gt;コーディング&lt;/h1&gt;
&lt;p&gt;contracts/Greeter.sol を以下のように編集します。&lt;/p&gt;
&lt;h3&gt;contracts/Greeter.sol&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// compiler version must be greater than or equal to 0.8.10 and less than 0.9.0&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.8.9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Greeter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; greet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;external&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; greet&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;コンパイル&lt;/h1&gt;
&lt;p&gt;Solidity のソースコードを Hardhat のコンパイラでコンパイルします。
以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat compile&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Compiling 1 file with 0.8.9
Compilation finished successfully&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;デプロイ&lt;/h1&gt;
&lt;p&gt;script/sample-script.js を以下のように編集します。&lt;/p&gt;
&lt;h3&gt;script/sample-script.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hre &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hardhat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Greeter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Greeter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; greeter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Greeter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; greeter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deployed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Greeter deployed to:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; greeter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; greeter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ret&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このスクリプトでは、ローカル実行環境にデプロイしたあとにスマートコントラクトの hello()という関数を実行します。&lt;/p&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;p&gt;以下のコマンドで実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; % npx hardhat run scripts/sample-script.js&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Greeter deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3
Hello World!&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;hello()関数を実行して、受け取った文字列&lt;code class=&quot;language-text&quot;&gt;Hello World!&lt;/code&gt;をログに表示できました。&lt;/p&gt;
&lt;p&gt;これでスマートコントラクトエンジニアです！&lt;/p&gt;
&lt;p&gt;次はスマートコントラクトをブロックチェーンにデプロイして実行してみよう。&lt;/p&gt;
&lt;p&gt;スマートコントラクトをテストネットやメインネットにデプロイする方法を 2 つ紹介します。
自分にあったやり方を見つけてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けのスマートコントラクト開発&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/remix-tutorial&quot;&gt;Remix の使い方: Metamask でスマートコントラクトをデプロイ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[はじめての Solana: Rust で Hello World!]]></title><description><![CDATA[このページはこんな人におすすめ Rust で簡単なスマートコントラクトを実装してみたい Solana に興味がある このページは、Solana の Hello World を日本語で解説します。 https://docs.solana.com/developing/on…]]></description><link>https://smacon.dev/posts/solana-hello</link><guid isPermaLink="false">https://smacon.dev/posts/solana-hello</guid><pubDate>Tue, 19 Apr 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rust で簡単なスマートコントラクトを実装してみたい&lt;/li&gt;
&lt;li&gt;Solana に興味がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このページは、Solana の Hello World を日本語で解説します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.solana.com/developing/on-chain-programs/examples&quot;&gt;https://docs.solana.com/developing/on-chain-programs/examples&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;はじめにドキュメント通りの手順を一通り行ったあとで、後半では必要最小限のコードだけを抽出して、ラップされているビルドやデプロイのコマンドを紹介しています。&lt;/p&gt;
&lt;h2&gt;事前準備&lt;/h2&gt;
&lt;p&gt;Solana の devnet または testnet を使います。devnet や testnet のトークンが必要ですが無料で取得できます。
はじめての方はこちらのページをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/solana-config&quot;&gt;Solana 開発のための環境構築&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;macOS 11.5.2&lt;/li&gt;
&lt;li&gt;npm 8.5.1&lt;/li&gt;
&lt;li&gt;solana-cli 1.8.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ドキュメントの手順を一通りやってみる&lt;/h2&gt;
&lt;p&gt;まずはドキュメントの通りに一通りやってみましょう。
Solana Labs の example-helloworld というプロジェクトがあります。
これを git clone します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% git clone https://github.com/solana-labs/example-helloworld.git
% cd example-helloworld&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/solana-labs/example-helloworld&quot;&gt;README&lt;/a&gt; に書かれているように、npm でライブラリをインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% npm install&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;README では localhost でテスト用の環境を作って deploy していますが、筆者の M1 Mac では localhost でうまく動かないので、testnet にデプロイします。&lt;/p&gt;
&lt;p&gt;筆者の solana-cli の config では以下のように設定しています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% solana config get
Config File: /Users/sakanosita/.config/solana/cli/config.yml
RPC URL: https://api.testnet.solana.com
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: /Users/sakanosita/.config/solana/Kagetoki.json
Commitment: confirmed&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;プロジェクトに最初から用意されている、Rust のコードをビルドします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% npm run build:program-rust&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;devnet にデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% solana program deploy dist/program/helloworld.so
Program Id: HLBxKXnRMaoBxWs3GxUMR78k9if1if7UPqWUJqGGAhCw&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実行してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% npm run start

&gt; helloworld@0.0.1 start
&gt; ts-node src/client/main.ts

Let&apos;s say hello to a Solana account...
Connection to cluster established: https://api.testnet.solana.com { &apos;feature-set&apos;: 1122441720, &apos;solana-core&apos;: &apos;1.10.8&apos; }
Using account 9HTsYGKHNBjHDnChwVBtdn6f61gWFnSuc5yYfixL1Wfp containing 0.1551188 SOL to pay for fees
Using program HLBxKXnRMaoBxWs3GxUMR78k9if1if7UPqWUJqGGAhCw
Creating account CFWdJJs3ixaLZevwirLHQCpRLKuhB9oDfqryBneA2YX8 to say hello to
Saying hello to CFWdJJs3ixaLZevwirLHQCpRLKuhB9oDfqryBneA2YX8
CFWdJJs3ixaLZevwirLHQCpRLKuhB9oDfqryBneA2YX8 has been greeted 1 time(s)
Success
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで testnet にデプロイした helloworld というスマートコントラクトを正常に実行できました。
Testnet のエクスプローラで Program Id を検索するとログを見ることができます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://explorer.solana.com/address/HLBxKXnRMaoBxWs3GxUMR78k9if1if7UPqWUJqGGAhCw?cluster=testnet&quot;&gt;https://explorer.solana.com/address/HLBxKXnRMaoBxWs3GxUMR78k9if1if7UPqWUJqGGAhCw?cluster=testnet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;続いて、ここまでの手順を分解してゼロからコードを作ってみましょう。&lt;/p&gt;
&lt;h1&gt;プロジェクトの作成&lt;/h1&gt;
&lt;p&gt;新しい Cargo プロジェクトを作ります。&lt;/p&gt;
&lt;p&gt;Solana Labs の example では C 言語と Rust 言語の両方のソースコードが入っていましたが、
今回は Rust だけのプロジェクトを作りましょう！&lt;/p&gt;
&lt;p&gt;プロジェクト名は rust-hello-world にします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% cargo new rust-hello-world
% cd rust-hello-world&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のようなファイルが作られています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── Cargo.toml
└── src
    └── main.rs&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;コーディング&lt;/h1&gt;
&lt;h2&gt;Cargo.toml&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;toml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-toml line-numbers&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rust-hello-world&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.0.1&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;description&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Example template program written in Rust&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;authors&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Solana Maintainers &amp;lt;maintainers@solana.com&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/smacon-dev/solana&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;license&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Apache-2.0&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;homepage&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://smacon.dev/&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;edition&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2022&quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;features&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;no-entrypoint&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;borsh&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.9.3&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;borsh-derive&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.9.1&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;solana-program&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~1.8.14&quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;dev-dependencies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;solana-program-test&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~1.8.14&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;solana-sdk&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~1.8.14&quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;helloworld&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;crate-type&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cdylib&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lib&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;src/lib.rs&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;rust&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-rust line-numbers&quot;&gt;&lt;code class=&quot;language-rust&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;borsh&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;BorshDeserialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BorshSerialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;solana_program&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token namespace&quot;&gt;account_info&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;next_account_info&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AccountInfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    entrypoint&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token namespace&quot;&gt;entrypoint&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ProgramResult&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    msg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token namespace&quot;&gt;program_error&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ProgramError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token namespace&quot;&gt;pubkey&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Pubkey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/// Define the type of state stored in accounts&lt;/span&gt;
&lt;span class=&quot;token attribute attr-name&quot;&gt;#[derive(BorshSerialize, BorshDeserialize, Debug)]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token type-definition class-name&quot;&gt;GreetingAccount&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// number of greetings&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;pub&lt;/span&gt; counter&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;u32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Declare and export the program&apos;s entrypoint&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;entrypoint!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process_instruction&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Program entrypoint&apos;s implementation&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;process_instruction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    program_id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Pubkey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Public key of the account the hello world program was loaded into&lt;/span&gt;
    accounts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;AccountInfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// The account to say hello to&lt;/span&gt;
    _instruction_data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Ignored, all helloworld instructions are hellos&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ProgramResult&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token macro property&quot;&gt;msg!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello World Rust program entrypoint&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Iterating accounts is safer than indexing&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; accounts_iter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; accounts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;iter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Get the account to say hello to&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; account &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;next_account_info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;accounts_iter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// The account must be owned by the program in order to modify its data&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;owner &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; program_id &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;msg!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Greeted account does not have the correct program id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ProgramError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;IncorrectProgramId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Increment and store the number of times the account has been greeted&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; greeting_account &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GreetingAccount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;try_from_slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;borrow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    greeting_account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;counter &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    greeting_account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;serialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;borrow_mut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token macro property&quot;&gt;msg!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Greeted {} time(s)!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; greeting_account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;counter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token class-name&quot;&gt;Ok&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Sanity tests&lt;/span&gt;
&lt;span class=&quot;token attribute attr-name&quot;&gt;#[cfg(test)]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;mod&lt;/span&gt; &lt;span class=&quot;token module-declaration namespace&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;solana_program&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;clock&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Epoch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;std&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;mem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token attribute attr-name&quot;&gt;#[test]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;test_sanity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; program_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Pubkey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; key &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Pubkey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; lamports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token macro property&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;mem&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size_of&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;u32&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; owner &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Pubkey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; account &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AccountInfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; lamports&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;owner&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token class-name&quot;&gt;Epoch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; instruction_data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; accounts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token macro property&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;account&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token macro property&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token class-name&quot;&gt;GreetingAccount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;try_from_slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;accounts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;borrow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unwrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;counter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;process_instruction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;program_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;accounts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;instruction_data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unwrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token class-name&quot;&gt;GreetingAccount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;try_from_slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;accounts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;borrow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unwrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;counter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;process_instruction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;program_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;accounts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;instruction_data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unwrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token class-name&quot;&gt;GreetingAccount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;try_from_slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;accounts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;borrow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unwrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;counter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;ビルド＆デプロイ&lt;/h1&gt;
&lt;p&gt;先程は、npm でラップしてビルドしていましたが、実際にビルドで使われているのは Rust の 開発ツールの cargo コマンドです。&lt;/p&gt;
&lt;p&gt;cargo のマニフェスト Cargo.toml はカレントディレクトリにある場合は、指定する必要はありません。
出力先のディレクトリだけ指定しましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% cargo build-bpf --bpf-out-dir=dist/program&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;solana-cli で devnet または testnet にデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% solana program deploy dist/program/helloworld.so&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;クライアント用ディレクトリの作成&lt;/h1&gt;
&lt;p&gt;Solana のスマートコントラクトは TypeScript(JavaScript)から実行します。&lt;/p&gt;
&lt;p&gt;先ほどの Cargo プロジェクトの中にクライアントプログラム用のディレクトリを作成します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% mkdir client
% cd client&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;npm ライブラリのインストール&lt;/h1&gt;
&lt;p&gt;以下のコマンドを実行してライブラリをインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% npm install -D typescript ts-node @types/mz
% npm install @solana/web3.js yaml&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;すると以下のように package.json ができます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-json line-numbers&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;devDependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;@types/mz&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^2.7.4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;ts-node&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^10.7.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;typescript&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^4.6.3&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;@solana/web3.js&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^1.39.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;yaml&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^2.0.1&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;コーディング（クライアント）&lt;/h1&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;client/src&lt;/code&gt;ディレクトリの中に３つの TypeScript ファイルを作ります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;main.ts&lt;/li&gt;
&lt;li&gt;hello_world.ts&lt;/li&gt;
&lt;li&gt;utils.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solana Labs の &lt;a href=&quot;https://github.com/solana-labs/example-helloworld/tree/master/src/client&quot;&gt;example&lt;/a&gt; をコピーしましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;client % tree src
src
├── hello_world.ts
├── main.ts
└── utils.ts&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;実行&lt;/h1&gt;
&lt;p&gt;カレントディレクトリが client ディレクトリの状態で npx コマンドを使って ts-node を実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; % npx ts-node src/main.ts
Let&apos;s say hello to a Solana account...
Connection to cluster established: https://api.testnet.solana.com { &apos;feature-set&apos;: 1122441720, &apos;solana-core&apos;: &apos;1.10.8&apos; }
Using account 9HTsYGKHNBjHDnChwVBtdn6f61gWFnSuc5yYfixL1Wfp containing 1.61226932 SOL to pay for fees
Using program 52cSCaoULTpw1HrUHUnjAYHq6jTeVWLoWWj3MvazCbSs
Saying hello to Aw6Pwy8mQQBBaK4UcMUgF4UzZGFWqUKUfDLdR3jjYXZm
Aw6Pwy8mQQBBaK4UcMUgF4UzZGFWqUK&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで実行完了です。&lt;/p&gt;
&lt;p&gt;この記事で使った実際のコードは&lt;a href=&quot;https://github.com/smacon-dev/solana/tree/main/rust-hello-world&quot;&gt;GitHub&lt;/a&gt;で公開しています。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[NEAR Protocol: はじめてのスマートコントラクト in Rust]]></title><description><![CDATA[このページはこんな人におすすめ Rust で簡単なスマートコントラクトを実装してみたい NEAR Protocol に興味がある このページは、NEAR Protocol の Rust のチュートリアルを日本語で解説しています。 Building a Smart Contract…]]></description><link>https://smacon.dev/posts/near-first-contract</link><guid isPermaLink="false">https://smacon.dev/posts/near-first-contract</guid><pubDate>Mon, 18 Apr 2022 19:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rust で簡単なスマートコントラクトを実装してみたい&lt;/li&gt;
&lt;li&gt;NEAR Protocol に興味がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このページは、NEAR Protocol の Rust のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.near.org/docs/develop/contracts/rust/intro&quot;&gt;Building a Smart Contract in Rust&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;事前準備&lt;/h2&gt;
&lt;p&gt;NEAR のテストネット用のアカウントとテストネットの NEAR トークンが必要です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wallet.testnet.near.org/&quot;&gt;https://wallet.testnet.near.org/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;macOS 11.5.2&lt;/li&gt;
&lt;li&gt;npm 8.5.1&lt;/li&gt;
&lt;li&gt;rustup: 1.24.3&lt;/li&gt;
&lt;li&gt;rustc: 1.60.0&lt;/li&gt;
&lt;li&gt;cargo: 1.60.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;near-cli のインストール&lt;/h2&gt;
&lt;p&gt;開発用の Mac へ NEAR の開発ツール near-cli をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ npm install -g near-cli&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;成功すると以下のように near コマンドを実行できるようになります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ near --version
3.2.0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;新しいプロジェクトの作成&lt;/h2&gt;
&lt;p&gt;cargo コマンドで新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ cargo new rust-counter-tutorial
$ cd rust-counter-tutorial&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のようなファイルが作られます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── Cargo.toml
└── src
   └── main.rs&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;自動生成されたファイルから以下のようにファイルを作り変えます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── Cargo.toml
└── src
   └── lib.rs&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Cargo.toml&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;toml&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-toml line-numbers&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rust-counter-tutorial&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.1.0&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;authors&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;NEAR Inc &amp;lt;hello@near.org&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;edition&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018&quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;crate-type&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cdylib&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rlib&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;near-sdk&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3.1.0&quot;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;profile.release&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;codegen-units&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Tell `rustc` to optimize for small code size.&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;opt-level&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;z&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;lto&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;panic&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;abort&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Opt into extra safety checks on arithmetic operations https://stackoverflow.com/a/64136471/249801&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;overflow-checks&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;src/lib.rs&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;rust&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-rust line-numbers&quot;&gt;&lt;code class=&quot;language-rust&quot;&gt;
&lt;span class=&quot;token comment&quot;&gt;//! This contract implements simple counter backed by storage on blockchain.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//!&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//! The contract provides methods to [increment] / [decrement] counter and&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//! [get it&apos;s current value][get_num] or [reset].&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//!&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//! [increment]: struct.Counter.html#method.increment&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//! [decrement]: struct.Counter.html#method.decrement&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//! [get_num]: struct.Counter.html#method.get_num&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//! [reset]: struct.Counter.html#method.reset&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;near_sdk&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;borsh&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BorshDeserialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;BorshSerialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;near_sdk&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; near_bindgen&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token namespace&quot;&gt;near_sdk&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token macro property&quot;&gt;setup_alloc!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// add the following attributes to prepare your code for serialization and invocation on the blockchain&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// More built-in Rust attributes here: https://doc.rust-lang.org/reference/attributes.html#built-in-attributes-index&lt;/span&gt;
&lt;span class=&quot;token attribute attr-name&quot;&gt;#[near_bindgen]&lt;/span&gt;
&lt;span class=&quot;token attribute attr-name&quot;&gt;#[derive(Default, BorshDeserialize, BorshSerialize)]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token type-definition class-name&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// See more data types at https://doc.rust-lang.org/book/ch03-02-data-types.html&lt;/span&gt;
    val&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;i8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// i8 is signed. unsigned integers are also available: u8, u16, u32, u64, u128&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token attribute attr-name&quot;&gt;#[near_bindgen]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;impl&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// Returns 8-bit signed integer of the counter value.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// This must match the type from our struct&apos;s &apos;val&apos; defined above.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// Note, the parameter is `&amp;amp;self` (without being mutable) meaning it doesn&apos;t modify state.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// In the frontend (/src/main.js) this is added to the &quot;viewMethods&quot; array&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// using near-cli we can call this by:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// ```bash&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// near view counter.YOU.testnet get_num&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// ```&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;get_num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;i8&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/// Increment the counter.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// Note, the parameter is &quot;&amp;amp;mut self&quot; as this function modifies state.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// In the frontend (/src/main.js) this is added to the &quot;changeMethods&quot; array&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// using near-cli we can call this by:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// ```bash&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// near call counter.YOU.testnet increment --accountId donation.YOU.testnet&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// ```&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// note: adding one like this is an easy way to accidentally overflow&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// real smart contracts will want to have safety checks&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// e.g. self.val = i8::wrapping_add(self.val, 1);&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// https://doc.rust-lang.org/std/primitive.i8.html#method.wrapping_add&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; log_message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token macro property&quot;&gt;format!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Increased number to {}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token namespace&quot;&gt;env&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;log_message&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;as_bytes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;after_counter_change&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/// Decrement (subtract from) the counter.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// In (/src/main.js) this is also added to the &quot;changeMethods&quot; array&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// using near-cli we can call this by:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;///&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// ```bash&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// near call counter.YOU.testnet decrement --accountId donation.YOU.testnet&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/// ```&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;decrement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// note: subtracting one like this is an easy way to accidentally overflow&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// real smart contracts will want to have safety checks&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// e.g. self.val = i8::wrapping_sub(self.val, 1);&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// https://doc.rust-lang.org/std/primitive.i8.html#method.wrapping_sub&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; log_message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token macro property&quot;&gt;format!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Decreased number to {}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token namespace&quot;&gt;env&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;log_message&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;as_bytes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;after_counter_change&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/// Reset to zero.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;val &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Another way to log is to cast a string into bytes, hence &quot;b&quot; below:&lt;/span&gt;
        &lt;span class=&quot;token namespace&quot;&gt;env&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;b&quot;Reset counter to zero&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// unlike the struct&apos;s functions above, this function cannot use attributes #[derive(…)] or #[near_bindgen]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// any attempts will throw helpful warnings upon &apos;cargo build&apos;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// while this function cannot be invoked directly on the blockchain, it can be called from an invoked function&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;after_counter_change&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// show helpful warning that i8 (8-bit signed integer) will overflow above 127 or below -128&lt;/span&gt;
    &lt;span class=&quot;token namespace&quot;&gt;env&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Make sure you don&apos;t overflow, my friend.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;as_bytes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*
 * the rest of this file sets up unit tests
 * to run these, the command will be:
 * cargo test --package rust-counter-tutorial -- --nocapture
 * Note: &apos;rust-counter-tutorial&apos; comes from cargo.toml&apos;s &apos;name&apos; key
 */&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// use the attribute below for unit tests&lt;/span&gt;
&lt;span class=&quot;token attribute attr-name&quot;&gt;#[cfg(test)]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;mod&lt;/span&gt; &lt;span class=&quot;token module-declaration namespace&quot;&gt;tests&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;near_sdk&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;MockedBlockchain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token namespace&quot;&gt;near_sdk&lt;span class=&quot;token punctuation&quot;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;testing_env&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;VMContext&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// part of writing unit tests is setting up a mock context&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// in this example, this is only needed for env::log in the contract&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// this is also a useful list to peek at when wondering what&apos;s available in env::*&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;get_context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; is_view&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&gt;&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;VMContext&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token class-name&quot;&gt;VMContext&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            current_account_id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;alice.testnet&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            signer_account_id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;robert.testnet&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            signer_account_pk&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token macro property&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            predecessor_account_id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;jane.testnet&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            input&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            block_index&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            block_timestamp&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            account_balance&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            account_locked_balance&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            storage_usage&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            attached_deposit&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            prepaid_gas&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10u64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            random_seed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token macro property&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            is_view&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            output_data_receivers&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token macro property&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            epoch_height&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// mark individual unit tests with #[test] for them to be registered and fired&lt;/span&gt;
    &lt;span class=&quot;token attribute attr-name&quot;&gt;#[test]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// set up the mock context into the testing environment&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; context &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token macro property&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;testing_env!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// instantiate a contract variable with the counter at zero&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;println!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Value after increment: {}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// confirm that we received 1 when calling get_num&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token attribute attr-name&quot;&gt;#[test]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;decrement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; context &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token macro property&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;testing_env!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;decrement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;println!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Value after decrement: {}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// confirm that we received -1 when calling get_num&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token attribute attr-name&quot;&gt;#[test]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;increment_and_reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; context &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_context&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token macro property&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;testing_env!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;mut&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;println!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Value after reset: {}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// confirm that we received -1 when calling get_num&lt;/span&gt;
        &lt;span class=&quot;token macro property&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;テストとビルド&lt;/h2&gt;
&lt;p&gt;以下のコマンドでプログラムのテストを実行できます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ cargo test -- --nocapture&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のコマンドでソースコードから WASM モジュールをコンパイルします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ cargo build --target wasm32-unknown-unknown --release&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;NEAR テストネットへのデプロイ&lt;/h2&gt;
&lt;p&gt;テストネットにログインします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ near login&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ビルドした WASM のスマートコントラクトを NEAR テストネットにデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ near deploy --wasmFile target/wasm32-unknown-unknown/release/rust_counter_tutorial.wasm --accountId YOUR_ACCOUNT_HERE&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;例として sakanosita.testnet を指定する場合&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;e.g.
$ near deploy --wasmFile target/wasm32-unknown-unknown/release/rust_counter_tutorial.wasm --accountId sakanosita.testnet&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;p&gt;デプロイしたスマートコントラクトを実行してみましょう。
get_mum を実行すると現在のカウンタの値を表示して、increment を call するとカウンタを+1 します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ near view YOUR_ACCOUNT_HERE get_num --accountId YOUR_ACCOUNT_HERE
$ near call YOUR_ACCOUNT_HERE increment --accountId YOUR_ACCOUNT_HERE&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;例として increment の実行前後に get_num を実行すると以下のようになります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;e.g.
$ near view sakanosita.testnet get_num --accountId sakanosita.testnet
View call: sakanosita.testnet.get_num()
5

$ near call sakanosita.testnet increment --accountId sakanosita.testnet
Scheduling a call: sakanosita.testnet.increment()
Doing account.functionCall()
Receipt: FrzjQZfPNiHAZCcf9oGUWMG6NKDZRZLktS8LFYZAzjtW
        Log [sakanosita.testnet]: Increased number to 6
        Log [sakanosita.testnet]: Make sure you don&apos;t overflow, my friend.
Transaction Id 7dkK3Gmf1ANubsgK4vVsifnVqNqDdcFuC97i9VucyUtE
To see the transaction in the transaction explorer, please open this url in your browser
https://explorer.testnet.near.org/transactions/7dkK3Gmf1ANubsgK4vVsifnVqNqDdcFuC97i9VucyUtE
&apos;&apos;

$ near view sakanosita.testnet get_num --accountId sakanosita.
View call: sakanosita.testnet.get_num()
6
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Solidity 入門: Merkle Proof（マークルツリーと Keccak256）]]></title><description><![CDATA[このページはこんな人におすすめ Solidity を学びたい マークルツリーについて知りたい Keccak256 ハッシュ関数ってなに？ Solidity by Example のサンプルコードを使ってスマートコントラクトを作る方法を解説します。 Merkle Tree…]]></description><link>https://smacon.dev/posts/merkle-tree</link><guid isPermaLink="false">https://smacon.dev/posts/merkle-tree</guid><pubDate>Mon, 18 Apr 2022 08:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/60cb915d3d66f0e59734d1c0e5717cab/5f4af/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.39240506329114%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABmElEQVR42nVSi24TQQzcO5o05WgaCISAikrLQ22lFoGnTWaLsIH//ydkny+cUohkZdfnGXtmXcp/fkIrUq2Aj+I9aADtC2iXoC1R7Ry0r6C9DPA/QEXqz3J/t/HzGrS5VG2zwVPQzkB7m3GMah0YpCc9OGNHFoRa7jbqZyd4A9pnoa2d+NEAIyX7hFNQ27g/fI9CeVD/n7scoS1AnaJakwTNPvn44pPcgnYhtJnUH0UYE06/UQu2XqMeLagTqdr0OXsN2gfQnowIo/AopZ0K7cLPUnXh07j8gXATTdSbfwTtk1AXoB0NskcTavqhLWp0PUPVTjIfpA7aqp+noL0CbSXULnGxFV48Ae0g/LqBd2/C+O3vMsiQwfjaN5YAa/qnLe5/7fIOWmW4jOcI4y0BIeeFxGMFYZMTuYJD9xk1vq1A7RzzV2ZPeopqS59Mqs6GXet90gSr+3wltJOQXnXZL7iuUXU2fuXj3uggKundszS/26t75xPmY05yqdd+3+1hejkffMs48O3Pb0Pu0HdylPMBbkC79of6A1wdpZ2ruwBpAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Merkle Tree&quot;
        title=&quot;&quot;
        src=&quot;/static/60cb915d3d66f0e59734d1c0e5717cab/f058b/2.png&quot;
        srcset=&quot;/static/60cb915d3d66f0e59734d1c0e5717cab/c26ae/2.png 158w,
/static/60cb915d3d66f0e59734d1c0e5717cab/6bdcf/2.png 315w,
/static/60cb915d3d66f0e59734d1c0e5717cab/f058b/2.png 630w,
/static/60cb915d3d66f0e59734d1c0e5717cab/5f4af/2.png 665w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solidity を学びたい&lt;/li&gt;
&lt;li&gt;マークルツリーについて知りたい&lt;/li&gt;
&lt;li&gt;Keccak256 ハッシュ関数ってなに？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solidity by Example のサンプルコードを使ってスマートコントラクトを作る方法を解説します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://solidity-by-example.org/app/merkle-tree/&quot;&gt;Merkle Tree (Solidity by Example)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下のページでほかのサンプルコードも解説しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/first-app&quot;&gt;はじめてのイーサリアム Dapps 開発&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/erc721&quot;&gt;NFT プログラミング (ERC721)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/price-oracle&quot;&gt;オラクルの基本的な使い方（Chainlink Data Feeds)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/merkle-tree&quot;&gt;Merkle Proof（マークルツリーと Keccak256）&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/solidity-events&quot;&gt;定義したイベントを発行してブロックチェーンに記録&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardhat を使ったことがない方は以下の記事も合わせてご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けのスマートコントラクト開発&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;新しいプロジェクトを作る&lt;/h1&gt;
&lt;p&gt;merkle-tree というディレクトリを作り
npm パッケージの hardhat をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir merkle-tree
cd merkle-tree
npm init -y
npm i --save-dev hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hardhat のサンプルプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Create a sample project&lt;/code&gt;を選択して、すべて Yes で回答します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What do you want to do? …
❯ Create a sample project
  Create an empty hardhat.config.js
  Quit&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで hardhat.config.js の初期設定や ether.js などプラグインを追加した状態になります。&lt;/p&gt;
&lt;h1&gt;コーディング&lt;/h1&gt;
&lt;p&gt;contracts/MerkleTree.sol と hardhat.config.js を編集します。
2 つの Solidity バージョンが一致するようにしましょう。&lt;/p&gt;
&lt;h3&gt;contracts/MerkleTree.sol&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.8.9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MerkleProof&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;bytes32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;memory&lt;/span&gt; proof&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;bytes32&lt;/span&gt; root&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;bytes32&lt;/span&gt; leaf&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; index
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;pure&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;bytes32&lt;/span&gt; hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; leaf&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; proof&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;bytes32&lt;/span&gt; proofElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; proof&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;index &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;keccak256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;abi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encodePacked&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hash&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; proofElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;keccak256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;abi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encodePacked&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;proofElement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; hash&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

            index &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; index &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hash &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; root&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;TestMerkleProof&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; MerkleProof &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;bytes32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; hashes&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;memory&lt;/span&gt; transactions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;alice -&gt; bob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;bob -&gt; dave&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;carol -&gt; alice&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;dave -&gt; bob&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; transactions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            hashes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;keccak256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;abi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encodePacked&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;transactions&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; transactions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; offset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                hashes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                    &lt;span class=&quot;token function&quot;&gt;keccak256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                        abi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encodePacked&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                            hashes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;offset &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                            hashes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;offset &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            offset &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getRoot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;bytes32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hashes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;hashes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/* verify
    3rd leaf
    0x1bbd78ae6188015c4a6772eb1526292b5985fc3272ead4c65002240fb9ae5d13

    root
    0x074b43252ffb4a469154df5fb7fe4ecce30953ba8b7095fe1e006185f017ad10

    index
    2

    proof
    0x948f90037b4ea787c14540d9feb1034d4a5bc251b9b5f8e57d81e4b470027af8
    0x63ac1b92046d474f84be3aa0ee04ffe5600862228c81803cce07ac40484aee43
    */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;hardhat.config.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nomiclabs/hardhat-waffle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * @type import(&apos;hardhat/config&apos;).HardhatUserConfig
 */&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.8.9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Keccak256 のハッシュを検証しよう&lt;/h1&gt;
&lt;p&gt;今回は、Hardhat のテスト機能で verify()関数を実行してハッシュの値を検証しながら、マークル木を理解していきましょう。
test/merkleTree.js を以下のように編集します。&lt;/p&gt;
&lt;h3&gt;test/merkleTree.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; expect &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chai&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ethers &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hardhat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;MerkleProof.verify()&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Should return true&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; MerkleProofFactory &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;MerkleProof&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; merkleProof &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; MerkleProofFactory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; merkleProof&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deployed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; merkleProof&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&quot;0x948f90037b4ea787c14540d9feb1034d4a5bc251b9b5f8e57d81e4b470027af8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&quot;0x63ac1b92046d474f84be3aa0ee04ffe5600862228c81803cce07ac40484aee43&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;0x074b43252ffb4a469154df5fb7fe4ecce30953ba8b7095fe1e006185f017ad10&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;0x1bbd78ae6188015c4a6772eb1526292b5985fc3272ead4c65002240fb9ae5d13&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のコマンドでテストを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat test&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;（出力）
  MerkleProof.verify()
    ✓ Should return true (396ms)

  1 passing (397ms)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上のように&lt;code class=&quot;language-text&quot;&gt;1 passing&lt;/code&gt;と表示されれば、テストが期待通りであることがわかります。&lt;/p&gt;
&lt;h1&gt;Merkle Proof の解説&lt;/h1&gt;
&lt;p&gt;このプログラムでは Keccak256 とマークル木いう 2 つのアルゴリズムを使います。&lt;/p&gt;
&lt;h2&gt;Keccak256&lt;/h2&gt;
&lt;p&gt;Keccak256 はハッシュ関数です。&lt;/p&gt;
&lt;p&gt;Keccak256 のほかによく使われるハッシュ関数は SHA-1 や MD5 などがあり、ファイル破損をチェックするときに使ったりします。&lt;/p&gt;
&lt;p&gt;ブロックチェーンで使う Keccak256 は、スーパーコンピュータ並の計算能力を使っても任意のハッシュ値からもとの値を計算できない特徴があります。&lt;/p&gt;
&lt;h2&gt;マークル木&lt;/h2&gt;
&lt;p&gt;マークル木はデータ構造を表しています。
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f643a8c42b63f2a48313eaa25e00e3d4/cab43/4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.0126582278481%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABCklEQVR42mWRiW6DMBBE+f+vq5oSjqRRA+EwBB9gI8w11W5LpbYrWbLWy5vZIQCAfd9x1HGflwVCNJBSQSqNbdu4XwuBOEkRJSnKsoIxPaI44TtVcAC6TqJtn7/AfT/g9e2Ml1MIpTX3p2liiDYG1jnM88yi1tov4AEoygpZ/kAnJS7XG05hhE4qTN7D+xnruqJpnwjPMc+SQNO0/7YLSIEOFa3l3IhaNLhnOUzfc5+A9NYPAz7uGapaYLCWRf5WoJTGOI7w3rN1gjjnUJQlx2CtYyckECcXiG9X5DKMEmhtkD8KZFnOcfDKlB2FSj/hcEWPVV3/ZEfg9PrOwGVZeP30euN5+p5nlcYnp7TKm6ycFQoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Merkle Tree&quot;
        title=&quot;&quot;
        src=&quot;/static/f643a8c42b63f2a48313eaa25e00e3d4/f058b/4.png&quot;
        srcset=&quot;/static/f643a8c42b63f2a48313eaa25e00e3d4/c26ae/4.png 158w,
/static/f643a8c42b63f2a48313eaa25e00e3d4/6bdcf/4.png 315w,
/static/f643a8c42b63f2a48313eaa25e00e3d4/f058b/4.png 630w,
/static/f643a8c42b63f2a48313eaa25e00e3d4/cab43/4.png 755w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;根(root)が上、葉(leaf)が下にあるので、実際の木とは上下が反対です。&lt;/p&gt;
&lt;h2&gt;verify()関数&lt;/h2&gt;
&lt;p&gt;このページで作る MerkleProof コントラクトの verify() 関数の目的は、keccak256 によって leaf と proof から計算した root のハッシュ値が引数と一致することです。
一致すれば true 一致しなければ false を返します。&lt;/p&gt;
&lt;p&gt;verify()関数には、4 つの引数を渡します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bytes32[] memory proof,&lt;/li&gt;
&lt;li&gt;bytes32 root,&lt;/li&gt;
&lt;li&gt;bytes32 leaf,&lt;/li&gt;
&lt;li&gt;uint256 index&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先頭の proof は配列なので、可変個の値を渡すことができます。&lt;/p&gt;
&lt;p&gt;テストコードではそれぞれ以下の値を渡します。
上図のマークル木は leaf が 4 つあり、その中の node3 という leaf をここで使います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;proof:
&lt;ul&gt;
&lt;li&gt;[“0x948f…”, “0x63ac…“]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;root:
&lt;ul&gt;
&lt;li&gt;“0x074b…”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;leaf:
&lt;ul&gt;
&lt;li&gt;“0x1bbd…”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;index:
&lt;ul&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;index は leaf が左から何番目かを表します。一番左の node1 は 0 なので、node3 は 2 です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;index&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;node1&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;node2&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;node3&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;ハッシュ関数の計算のもとになる値&lt;/h2&gt;
&lt;p&gt;今回は 2 つのハッシュ値をつなげて新しいハッシュ値を計算しています。
以下の流れで 2 回のハッシュ計算を行うと、root を計算できます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;node3 と node4 をつなげて node6 を計算する&lt;/li&gt;
&lt;li&gt;node5 と node6 をつなげて root を計算する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;引数で渡した proof[0]が node4、proof[1]が node5 です。&lt;/p&gt;
&lt;p&gt;2 つのハッシュ値をつなげるときに、index が奇数が偶数かによって左右が決まります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;            if (index % 2 == 0) {&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;式を眺めたり頭で考えてもよくわかりませんが、8 つぐらいの Leaf を使って実際に計算してみてください。
Leaf の index を 2 で割りながら root に向かっていくとうまくいくことがわかります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;index&lt;/th&gt;
&lt;th&gt;1 回目の剰余&lt;/th&gt;
&lt;th&gt;2 回目の剰余&lt;/th&gt;
&lt;th&gt;3 回目の剰余&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;2 回目以降は、前回の商を 2 で割った余りが奇数か偶数かを判断します。
剰余が 0 のときは、leaf を左に、1 のときは leaf を右につなげます。&lt;/p&gt;
&lt;h2&gt;Keccak256 Online&lt;/h2&gt;
&lt;p&gt;Keccak256 のハッシュはブラウザで計算することができるので実際にコピペしてみると、Solidity で計算した Keccak256 と一致することがわかります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://emn178.github.io/online-tools/keccak_256.html&quot;&gt;https://emn178.github.io/online-tools/keccak_256.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ハッシュ値の先頭の &lt;code class=&quot;language-text&quot;&gt;0x&lt;/code&gt; は 16 進数を表すプレフィクスなので値を計算するときには外します。&lt;/p&gt;
&lt;h3&gt;1. “1bbd…” と　“948f…” をつなげて node6 のハッシュ”90ed…”を計算&lt;/h3&gt;
&lt;!--
- IN
  - `1bbd78ae6188015c4a6772eb1526292b5985fc3272ead4c65002240fb9ae5d13948f90037b4ea787c14540d9feb1034d4a5bc251b9b5f8e57d81e4b470027af8`
- OUT:
  - `90ed7ad0524bf73e077fe6d49abe1fb1629f9843ca60d89ebf0ca88601a19bca` --&gt;
&lt;h3&gt;2. “63ac…”と 1 で計算した”90ed…”をつなげて root のハッシュを計算&lt;/h3&gt;
&lt;!-- - IN
  - `63ac1b92046d474f84be3aa0ee04ffe5600862228c81803cce07ac40484aee4390ed7ad0524bf73e077fe6d49abe1fb1629f9843ca60d89ebf0ca88601a19bca`
- OUT
  - `074b43252ffb4a469154df5fb7fe4ecce30953ba8b7095fe1e006185f017ad10` --&gt;
&lt;p&gt;node5 と node6 から計算した”074b…”が root のハッシュ値です。&lt;/p&gt;
&lt;p&gt;Solidity の keccak256() と&lt;a href=&quot;https://emn178.github.io/online-tools/keccak_256.html&quot;&gt;Keccak256 Online&lt;/a&gt;
で計算したハッシュ値が一致していることを確認できました。&lt;/p&gt;
&lt;p&gt;このページで実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/solidity-example/tree/main/merkle-tree&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Solidity 入門: オラクルの基本的な使い方（Chainlink Data Feeds)]]></title><description><![CDATA[このページはこんな人におすすめ イーサリアム上で価格情報を使いたい スマートコントラクトのオラクルについて知りたい Chainlink の Ethereum Data Feed を使いたい Solidity by Example…]]></description><link>https://smacon.dev/posts/price-oracle</link><guid isPermaLink="false">https://smacon.dev/posts/price-oracle</guid><pubDate>Sun, 27 Feb 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;イーサリアム上で価格情報を使いたい&lt;/li&gt;
&lt;li&gt;スマートコントラクトのオラクルについて知りたい&lt;/li&gt;
&lt;li&gt;Chainlink の Ethereum Data Feed を使いたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solidity by Example のサンプルコードを使ってスマートコントラクトを作る方法を解説します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://solidity-by-example.org/defi/chainlink-price-oracle/&quot;&gt;Price Oracle (Solidity by Example)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このページで実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/solidity-example/tree/main/price-oracle&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;h1&gt;オラクルと Chainlink について&lt;/h1&gt;
&lt;p&gt;オラクルは、オンチェーンのスマートコントラクトがオフチェーンの情報を利用するときに使います。&lt;/p&gt;
&lt;p&gt;一般的な Web サービスの場合、API を呼び出しますが、EVM のスマートコントラクトは、ダイレクトにオフチェーンの API を実行することはできません。&lt;/p&gt;
&lt;p&gt;そこで Chainlink では以下のようなしくみで、オフチェーンのデータをオンチェーンで使えるようにしています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/oracle&quot;&gt;イーサリアム入門: オラクルのしくみ&lt;/a&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 503px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 93.67088607594937%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAADLUlEQVR42lVUZ3PaUBCUO26422AbCfWGGiDAQoBwSexk4pn4c+L8/1+xmT1GTPLhRk/ibndv7x6KoijY3t6G7TjoDwYYDnNMpyXy0QieHyCKYmRZH+VshjhO0Isi+RaEITzfh2lZEjzv7OxAIaCqavj6+oas34cfBMiyTEAfiila7VtYtoNFtYSqdXF335HoqBpcz0cvimFatpwJLIB5nuOhKHB7ewvHcZCmKVRVxaKqMC1nmC8q5KMxUlE6l298UnWaZaiqSsiDIIRimiZGo5F8KIoChmnCdT2U5QyD4VCYqdBxPYwnD1g+PuHX70+UZQlNVRHHMTRNk1oSCWCaZjBtejjE49MzytkCYS9CVzcEaJiPMK+WopC+Ui0toC3VcilRTEvBUYgeJ4n4YFoODMuG1tUFjIzFdArfD6AbBoIgwHyxwI/3dximDcf14QehBDuh/8rNzY0ksi0vCEWRYVrSXpKkcF0XvV4PnueJv61WSyZKD1VNX9uxAgxXQ+nqurRCVVrXgG6YkshWh3kOXddxd3cH3/cFeLGoEMWJTN12vDUgOxXA4+NjRHEsviVpJkG/OCh69fn5Bz8/PvD27TueX75g8lAgTlLJYfBMgrOzMyjKxgZRsbe3h8PDQzSbTVxcXODq6koSOh1V1uLy8lLi6OgIzeaJBNvnqt3f3+P8/BwbKywFdezu7krSycmJgBJA01S0221sbW2t8zY3N+X3/UYDhmFgPB6LINYpVMSrRwb6xEICcQAcCAtZNJ/PxUsWdbtdvL6+yjOKItlF/sYOZQ8tyxKwWgEVTSYTuUG8Mfv7+3JPCUx1dR69Z8uMTqezUsg9tG1bXrhC9I2KCXp9fS2eUXWtnOT8RlUEIRlvyenpqZwVKmAS26MinplIVq4J7zX3lO8kHgwG4jMB67vPOu6qTLn2ikBsiSD0k2xhGEoifWLLHNrBwcF/LdNH2sYn62TKbIdsTGBRPXES1B0wOE2aT6UvLy+ST2v6/b7k8329Nhw7GeglVVI11ROUntHfRqMh5FRPP9k6/6loA3Nlyv/uIZO5JmTl1Okll5ZL/u906yAwyQjE4DD/AhMyDWRotDd4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;chainlink&quot;
        title=&quot;&quot;
        src=&quot;/static/1e3469cdb25e08cf22fd2bec39103e1c/a4078/2.png&quot;
        srcset=&quot;/static/1e3469cdb25e08cf22fd2bec39103e1c/c26ae/2.png 158w,
/static/1e3469cdb25e08cf22fd2bec39103e1c/6bdcf/2.png 315w,
/static/1e3469cdb25e08cf22fd2bec39103e1c/a4078/2.png 503w&quot;
        sizes=&quot;(max-width: 503px) 100vw, 503px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;上図の Consumer がこのページで作るスマートコントラクトです。&lt;/p&gt;
&lt;p&gt;Proxy や Aggregator は Chainlink がデプロイしたスマートコントラクトです。&lt;/p&gt;
&lt;p&gt;Consumer は Proxy の latestRoundData() という関数を実行して、Aggregator コントラクトが保持している state を参照します。&lt;/p&gt;
&lt;h1&gt;新しいプロジェクトを作る&lt;/h1&gt;
&lt;p&gt;price-oracle というディレクトリを作り
npm パッケージの hardhat をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir price-oracle
cd price-oracle
npm init -y
npm i --save-dev hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hardhat のサンプルプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Create a sample project&lt;/code&gt;を選択して、すべて Yes で回答します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What do you want to do? …
❯ Create a sample project
  Create an empty hardhat.config.js
  Quit&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで hardhat.config.js の初期設定や ether.js などプラグインを追加した状態になります。&lt;/p&gt;
&lt;h1&gt;コーディング&lt;/h1&gt;
&lt;p&gt;以下のファイルを作ります。&lt;/p&gt;
&lt;h3&gt;contracts/ChainlinkPriceFeed.sol&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.8.10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// import &quot;@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol&quot;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ChainlinkPriceOracle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    AggregatorV3Interface &lt;span class=&quot;token keyword&quot;&gt;internal&lt;/span&gt; priceFeed&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// ETH / USD&lt;/span&gt;
        priceFeed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;AggregatorV3Interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token number&quot;&gt;0x8A753747A1Fa494EC906cE90E9f37563A8AF630e&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getLatestPrice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;uint80&lt;/span&gt; roundID&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;int256&lt;/span&gt; price&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; startedAt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; timeStamp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;uint80&lt;/span&gt; answeredInRound
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; priceFeed&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;latestRoundData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// for ETH / USD price is scaled up by 10 ** 8&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; price &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1e8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AggregatorV3Interface&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;latestRoundData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;external&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;view&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;uint80&lt;/span&gt; roundId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;int256&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; startedAt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; updatedAt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token builtin&quot;&gt;uint80&lt;/span&gt; answeredInRound
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Solidity by Example のコードをベースに PriceFeed のコントラクトアドレスを Rinkeby のアドレスに置換しています。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://docs.chain.link/docs/ethereum-addresses/&quot;&gt;Ethereum Data Feed&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Rinkeby Testnet (ETH / USD)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0x8A753747A1Fa494EC906cE90E9f37563A8AF630e&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;デプロイ (Rinkeby テストネット)&lt;/h1&gt;
&lt;p&gt;必要なもの&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rinkeby のアカウント（秘密鍵）&lt;/li&gt;
&lt;li&gt;Rinkeby の RPC エンドポイント（Alchemy を利用）&lt;/li&gt;
&lt;li&gt;Rinkeby の ETH 少量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardhat でデプロイする方法の詳細は&lt;a href=&quot;/posts/hardhat&quot;&gt;こちら&lt;/a&gt;に書かれています。
参照先はテストネットが Ropsten になっているので、Rinkeby に読み替えてください。&lt;/p&gt;
&lt;h3&gt;環境変数&lt;/h3&gt;
&lt;p&gt;以下の環境変数を設定します。デプロイのコマンドを実行するターミナルで実行するかログインシェル用の設定ファイルに追加してください。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;RINKEBY_PRIVATE_KEY=&amp;lt;Rinkebyのアカウント秘密鍵&gt;
RINKEBY_RPC_URL=&amp;lt;RinkebyのRPCエンドポイント&gt;
export RINKEBY_PRIVATE_KEY RINKEBY_RPC_URL&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;hardhat.config.js&lt;/h3&gt;
&lt;p&gt;Hardhat の設定ファイルを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nomiclabs/hardhat-waffle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * @type import(&apos;hardhat/config&apos;).HardhatUserConfig
 */&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.8.10&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;rinkeby&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;accounts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;scripts/deploy.js&lt;/h3&gt;
&lt;p&gt;デプロイスクリプトを用意します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hre &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hardhat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Factory &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ChainlinkPriceOracle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Factory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deployed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Contract deployed to:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のコマンドを実行してコンパイルします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat compile&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のコマンドを実行して、rinkeby テストネットにデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat run scripts/deploy.js --network rinkeby&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Contract deployed to: 0xc701F8eaeF74f3DE1FEe8613855884d02CfE9517&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デプロイが成功すると上記のようにコントラクトアドレスが表示されます。&lt;/p&gt;
&lt;h1&gt;実行&lt;/h1&gt;
&lt;p&gt;Rinkeby の Etherscan を使って getLatestPrice 関数を実行してみましょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rinkeby の Etherscan を開く
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://rinkeby.etherscan.io&quot;&gt;https://rinkeby.etherscan.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自分がデプロイしたコントラクトアドレスを検索する&lt;/li&gt;
&lt;li&gt;Contract タブの Read Contract をクリック&lt;/li&gt;
&lt;li&gt;getLatestPrice 関数をクリック&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ee2657d57b034ed8238509a2e2bd08eb/38bc0/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.93670886075949%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABW0lEQVR42nWSy44UMQxF6/9/h09ArEBiN2KF2MwIdXc98n7YyYGkulGDhpKOYiWxHd9by/cfr7y+XYgp87+vlELOhVqFXAopZ5wPhBjnXlfh6isfvlmWwxmutxXjPNaFuR7WYayfSWkUEiWXSqky4yoy47H3oJSKirDsh2Hbj3vCyUgYiCjaGqKKtW6etd4REVSF3vuE3lHVOeWSnkaVWpHWZtyf0A63beewdp4ZF7maQChCSAWblVTPxkuICXNbWd9+4oyhhIiEQHWe6hzVB8QHaogU75EyJmjkOmSQk7sUQ4YlxcTL5y98/fiJEAJ67DAwB6w32FbYN/AerAHVd41rndloGcJfLlecc6i2ObKOws6i3qExolWQod3U6hztwdBuvM6mSkiVZQg5dBziDgN0CL9ttHWl7RvqPZrzLKT3Amf8N721+Qsto8vDrck/hvzh+c47TFN/m/ILsTS/b+POt0AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Etherscan&quot;
        title=&quot;&quot;
        src=&quot;/static/ee2657d57b034ed8238509a2e2bd08eb/f058b/1.png&quot;
        srcset=&quot;/static/ee2657d57b034ed8238509a2e2bd08eb/c26ae/1.png 158w,
/static/ee2657d57b034ed8238509a2e2bd08eb/6bdcf/1.png 315w,
/static/ee2657d57b034ed8238509a2e2bd08eb/f058b/1.png 630w,
/static/ee2657d57b034ed8238509a2e2bd08eb/40601/1.png 945w,
/static/ee2657d57b034ed8238509a2e2bd08eb/78612/1.png 1260w,
/static/ee2657d57b034ed8238509a2e2bd08eb/38bc0/1.png 2834w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;現在の Chainlink の PriceFeed コントラクト(ETH/USD)から取得した値が表示されます。&lt;/p&gt;
&lt;p&gt;もし、自分のコントラクトがうまくいかない場合は、筆者がデプロイしたコントラクトで試してみましょう。
&lt;a href=&quot;https://rinkeby.etherscan.io/address/0xc701F8eaeF74f3DE1FEe8613855884d02CfE9517&quot;&gt;https://rinkeby.etherscan.io/address/0xc701F8eaeF74f3DE1FEe8613855884d02CfE9517&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;解説&lt;/h2&gt;
&lt;p&gt;デプロイしたコントラクトの中では Chainlink の PriceFeed のコントラクトを実行しています。
そのコントラクトは同じネットワーク(Rinkeby)上にデプロイされたコントラクトです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rinkeby.etherscan.io/address/0x8A753747A1Fa494EC906cE90E9f37563A8AF630e&quot;&gt;https://rinkeby.etherscan.io/address/0x8A753747A1Fa494EC906cE90E9f37563A8AF630e&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PriceFeed コントラクトの latestRoundData()は手動でも実行できます。&lt;/p&gt;
&lt;p&gt;この関数の戻り値の中の 2 番目の answer が ETH/USD の価格を表しています。&lt;/p&gt;
&lt;p&gt;ただし、以下の 2 つの結果は単位が違います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PriceFeed コントラクトの latestRoundData(): 321770736905&lt;/li&gt;
&lt;li&gt;自分が作ったコントラクトの getLatestPrice(): 3217&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回デプロイしたコードは以下のようになっています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;        ) = priceFeed.latestRoundData();
        // for ETH / USD price is scaled up by 10 ** 8
        return price / 1e8;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;PriceFeed コントラクトの結果を 10 の 8 乗で除しています。
getLatestPrice()の戻り値は、int256 型なので小数点以下は切り捨てられます。&lt;/p&gt;
&lt;p&gt;321,770,736,905 / 100,000,000 = 3,217(int256)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DFINITY ROADMAP]]></title><description><![CDATA[Internet Computer Roadmap IC Roadmap Milestones for 2022 (Sneak Preview) Chromium (end of Q1) ICOS Boundary Nodes Long Term R&D: Boundary…]]></description><link>https://smacon.dev/posts/dfinity-roadmap</link><guid isPermaLink="false">https://smacon.dev/posts/dfinity-roadmap</guid><pubDate>Sat, 29 Jan 2022 23:38:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;a href=&quot;https://internetcomputer.org/roadmap&quot;&gt;Internet Computer Roadmap&lt;/a&gt;&lt;/h1&gt;
&lt;h3&gt;&lt;a href=&quot;https://forum.dfinity.org/t/ic-roadmap-milestones-for-2022-sneak-preview/10527&quot;&gt;IC Roadmap Milestones for 2022 (Sneak Preview)&lt;/a&gt;&lt;/h3&gt;
&lt;h2&gt;Chromium (end of Q1)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;ICOS Boundary Nodes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/long-term-r-d-boundary-nodes-proposal/9401&quot;&gt;Long Term R&amp;#x26;D: Boundary Nodes (proposal)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Threshold ECDSA signatures: System Integration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Threshold ECDSA signatures&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/threshold-ecdsa-signatures/6152&quot;&gt;Threshold ECDSA Signatures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nodes Can be Reassigned to a Different Subnet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decentralized Node Addition&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable HTTP Requests from Canisters&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/enable-canisters-to-make-http-s-requests/9670/30&quot;&gt;Enable canisters to make HTTP(S) requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/long-term-r-d-general-integration-proposal/9383&quot;&gt;Long Term R&amp;#x26;D: General Integration (Proposal)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Network Performance with Larger Network: State Sync, Certification, and XNet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bitcoin Integration to Enable Bitcoin Smart Contracts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/direct-integration-with-bitcoin/6147&quot;&gt;Direct Integration with Bitcoin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=MxBIvPhPzzc&quot;&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/dfinity/motion-proposal-to-integrate-bitcoin-with-the-internet-computer-is-approved-95b00e1dcc9c&quot;&gt;Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dashboard.internetcomputer.org/proposal/20586&quot;&gt;Proposal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Governance for Internet Services&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom Subdomains&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deterministic Time Slicing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Community Fund&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Titanium (mid Q1 2022)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Titanium Example Dapps&lt;/li&gt;
&lt;li&gt;Bitcoin Integration Developer Preview
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/direct-integration-with-bitcoin/6147&quot;&gt;Direct Integration with Bitcoin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Merge Neurons&lt;/li&gt;
&lt;li&gt;Simple APIs for Ledger Transactions&lt;/li&gt;
&lt;li&gt;Ledger Canister Fit for Dapps&lt;/li&gt;
&lt;li&gt;People Parties for Validating Personhood&lt;/li&gt;
&lt;li&gt;Verify Candid and Motoko Stable Variable Type Safety of Canister&lt;/li&gt;
&lt;li&gt;Enable Canisters to Hold ICPs
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.dfinity.org/t/enable-canisters-to-hold-icp/6153&quot;&gt;Enable Canisters to Hold ICP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NNS Managed Node Provider Remuneration&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Medium&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/dfinity/the-internet-computer-community-adopts-25-proposals-for-future-crypto-innovation-7465984c5ad1&quot;&gt;The Internet Computer Community Adopts 25 Proposals for Future Crypto Innovation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/dfinity/the-internet-computers-long-term-r-d-plans-motion-proposals-guide-dce6fdcd697d&quot;&gt;Internet Computer Roadmap Guide: 25 Motion Proposals Outlining New Areas for Crypto Innovation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/dfinity/announcing-internet-computer-mainnet-and-a-20-year-roadmap-790e56cbe04a&quot;&gt;Announcing the Internet Computer “Mainnet” and a 20-Year Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href=&quot;https://dfinity.org/roadmap/&quot;&gt;Roadmap&lt;/a&gt;&lt;/h2&gt;
&lt;h2&gt;In-site Pages&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-overview&quot;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/inside-icp&quot;&gt;Technology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-coding&quot;&gt;Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-roadmap&quot;&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Solana Program Library: SPL Token]]></title><description><![CDATA[SPL Token Tutorial https://spl.solana.com/token このページの作業に必要なもの solana-keygen コマンド spl-token コマンド Devnet のアカウント 2 つ Phantom ウォレット Solana…]]></description><link>https://smacon.dev/posts/spl-token</link><guid isPermaLink="false">https://smacon.dev/posts/spl-token</guid><pubDate>Sat, 22 Jan 2022 21:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;SPL Token Tutorial&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://spl.solana.com/token&quot;&gt;https://spl.solana.com/token&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;このページの作業に必要なもの&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;solana-keygen コマンド&lt;/li&gt;
&lt;li&gt;spl-token コマンド&lt;/li&gt;
&lt;li&gt;Devnet のアカウント 2 つ&lt;/li&gt;
&lt;li&gt;Phantom ウォレット&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a href=&quot;/posts/solana-config&quot;&gt;Solana 開発のための環境構築&lt;/a&gt;&lt;/h3&gt;
&lt;h1&gt;独自トークンの作成&lt;/h1&gt;
&lt;p&gt;はじめに Devnet 用の SOL トークンを入手します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;solana airdrop 1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alice の keypair を設定しているので、Alice のアドレスに 1SOL 届きます。&lt;/p&gt;
&lt;p&gt;Alice アカウントで Fungible Token を作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;spl-token create-token&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Creating token 35ax2anmDCqjMYRiPNRLMW6WYMCYFosr378XLNu4V1eD

Signature: 5ZovHirScb1uSAi5p7PsiDp24gmXga2ATAVrVkXbtHXHzhFYUEVCU6pbegUY5F5Z1t2uuzacB5fZZcLnBRjKJfCf&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;現在のトークン供給量を表示させてみます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% spl-token supply 35ax2anmDCqjMYRiPNRLMW6WYMCYFosr378XLNu4V1eD
0&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;初期値は 0 です。&lt;/p&gt;
&lt;p&gt;トークンアカウントを作ります。Solana ではトークンごとにアカウントを作る必要があります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; % spl-token create-account 35ax2anmDCqjMYRiPNRLMW6WYMCYFosr378XLNu4V1eD
Creating account EfK3cT3Yp6xbTED5PLHa9hHsLXeSMXxuK6X3poP4gGc4

Signature: 4nJXjot5JnuPf1MjPtfsSGmKQPR5Tm34ZXxunsKUyfpwqwKKcn7HoGUJa4qhErvZT39DC4oBfnEXXV7eLu4AdvEC&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;100 トークンを mint します。つまり生成します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; % spl-token mint  35ax2anmDCqjMYRiPNRLMW6WYMCYFosr378XLNu4V1eD 100
Minting 100 tokens
  Token: 35ax2anmDCqjMYRiPNRLMW6WYMCYFosr378XLNu4V1eD
  Recipient: EfK3cT3Yp6xbTED5PLHa9hHsLXeSMXxuK6X3poP4gGc4

Signature: 4V5zgPht8E6BpQGdCA9JjsAFpxKhZwdE5NifFTCghksr9AaHYADFvmR9GARWj5LKZL3Ktxk5QpAYcCGvfULzL6UM&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Phantom ウォレットを使って 100 トークンのうち、20 を Bob に送ってみましょう。&lt;/p&gt;
&lt;p&gt;supply, balance, acounts サブコマンドでトークンの Address を表示すると現在の状態がわかります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;subgraphs % spl-token supply 35ax2anmDCqjMYRiPNRLMW6WYMCYFosr378XLNu4V1eD
100

subgraphs % spl-token balance 35ax2anmDCqjMYRiPNRLMW6WYMCYFosr378XLNu4V1eD
80

subgraphs % spl-token accounts
Token                                         Balance
---------------------------------------------------------------
35ax2anmDCqjMYRiPNRLMW6WYMCYFosr378XLNu4V1eD  80
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Devnet Explorer&lt;/h2&gt;
&lt;p&gt;Explorer でトークンのアドレスを入力して、バランスを見てみましょう。
2 つのアカウントが 80 対 20 になっているはずです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://explorer.solana.com/&quot;&gt;https://explorer.solana.com/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;NFT (Non Fungible Token)の発行&lt;/h1&gt;
&lt;p&gt;Solana では spl-token コマンドで NFT を作ることができます。&lt;/p&gt;
&lt;p&gt;NFT といってもアートや画像を表示するものではなく、代替不可能なトークンという本来の意味のトークンです。&lt;/p&gt;
&lt;p&gt;まず、小数点以下の桁数を 0 のトークンを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% spl-token create-token --decimals 0
Creating token FoGRhV7Lh3anC64NSjgV4XSQd5CfXhAihEWG6Diz3EbP

Signature: 3Byg1HmyM7xj47iEcmfB2PnrDDB15oimg7azG8igaZbGnQNeSTC3tC8t74bE5TqjKLQFk7snXSyzHnqNznjwwp3j&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;つぎにトークンアカウントを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% spl-token create-account FoGRhV7Lh3anC64NSjgV4XSQd5CfXhAihEWG6Diz3EbP
Creating account HBL76s564iGVk2TMPrSEQJWpyjdZxER7QpmSbdM2GUBk

Signature: 3x6eTSb1Fi4vL5TfYMexWN6Vzzeo1h5J9cghZLAFKLAUNKFTNTXz2vMTDcLSbJt2SMsknchppXiPfnYb9waNLnnN&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;トークンを 1 単位だけ mint します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; % spl-token mint FoGRhV7Lh3anC64NSjgV4XSQd5CfXhAihEWG6Diz3EbP 1
Minting 1 tokens
  Token: FoGRhV7Lh3anC64NSjgV4XSQd5CfXhAihEWG6Diz3EbP
  Recipient: HBL76s564iGVk2TMPrSEQJWpyjdZxER7QpmSbdM2GUBk

Signature: 23LTonVsL8ntNyXasENeit2V3eZ61Gnta6gvAJSaeSKQ5LrSdTM9v4iqcEY8T4PyWttbs88CiNazyf3he8UQ5LrC&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通常のトークンは、1 だけ発行しても、0.1 や 0.2 を送ることができますが、このトークンは decimals が 0 なので送信できるのは 1 単位です。&lt;/p&gt;
&lt;p&gt;つぎに、このトークンアドレスでこれ以上トークンを mint できないようにします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;% spl-token authorize FoGRhV7Lh3anC64NSjgV4XSQd5CfXhAihEWG6Diz3EbP mint --disable
Updating FoGRhV7Lh3anC64NSjgV4XSQd5CfXhAihEWG6Diz3EbP
  Current mint authority: 6MJgewZBJyzJseZnwWZX11RUwydLVYoVJevJDCHenKaY
  New mint authority: disabled

Signature: FZv8x2MNEjvcphb2jb3B4zYGeP8PGpmAvWey9NXE7j5HkqkiB9AXjgFZi5TCbZoirdQCYNnmbyqdd5mFouGcypN&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このトークンは 1 つしかなく、新たに mint して増やすこともできないので、Non-fungible です。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Solana 開発のための環境構築]]></title><description><![CDATA[CLI のインストール 以下のようなコマンドをインストールします。 solana solana-keygen spl-token Solana Tool Suite https://docs.solana.com/cli/install-solana-cli-tools SPL…]]></description><link>https://smacon.dev/posts/solana-config</link><guid isPermaLink="false">https://smacon.dev/posts/solana-config</guid><pubDate>Sat, 22 Jan 2022 20:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;CLI のインストール&lt;/h1&gt;
&lt;p&gt;以下のようなコマンドをインストールします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;solana&lt;/li&gt;
&lt;li&gt;solana-keygen&lt;/li&gt;
&lt;li&gt;spl-token&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Solana Tool Suite&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.solana.com/cli/install-solana-cli-tools&quot;&gt;https://docs.solana.com/cli/install-solana-cli-tools&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;SPL Token CLI&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://spl.solana.com/token&quot;&gt;https://spl.solana.com/token&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;テスト用のキーペアを用意する&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.solana.com/cli/conventions#keypair-conventions&quot;&gt;Solana Docmentation - Keypair conventions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;検証用にアカウントを用意します。目的に応じて 2 つまたは 3 つあると便利です。&lt;/p&gt;
&lt;p&gt;わかりやすいように、キーペアに好きな名前をつけます。
例：Alice, Bob, Carol など&lt;/p&gt;
&lt;p&gt;以下のコマンドを入力すると新しいキーペアを作ることができます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;solana-keygen new&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;solana-keygen を実行するときにリカバリフレーズが表示されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Save this seed phrase and your BIP39 passphrase to recover your new keypair:
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;検証用のアカウントとして使い捨てるなら不要ですが、あとで復旧することがあるなら保管しましょう。&lt;/p&gt;
&lt;p&gt;新しいキーペアはホームディレクトリ配下に id.json という名前でファイルが作成されます。
それぞれファイル名を変更します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;solana-keygen new
mv ~/.config/solana/id.json ~/.config/solana/alice.json

solana-keygen new
mv ~/.config/solana/id.json ~/.config/solana/bob.json

solana-keygen new
mv ~/.config/solana/id.json ~/.config/solana/carol.json
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Phantom ウォレットのインポート&lt;/h2&gt;
&lt;p&gt;3 つのアカウントを Phantom ウォレットにインポートします。&lt;/p&gt;
&lt;p&gt;pbcopy コマンドを使うとファイルの中身をクリップボードにコピーできるので、ウォレットのインポート画面でペーストすればインポートできます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pbcopy &amp;lt; ~/.config/solana/alice.json
pbcopy &amp;lt; ~/.config/solana/bob.json
pbcopy &amp;lt; ~/.config/solana/carol.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Config 設定&lt;/h1&gt;
&lt;h3&gt;API (Devnet)&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;solana config set --url https://api.devnet.solana.com&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Alice/Bob/Carol の Key を設定&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;solana config set --keypair ${HOME}/.config/solana/alice.json
solana config set --keypair ${HOME}/.config/solana/bob.json
solana config set --keypair ${HOME}/.config/solana/carol.json&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;SOL を入手&lt;/h1&gt;
&lt;p&gt;Config 設定で Devnet と Alice が設定されていれば、Devnet の Alice のウォレットに 1SOL 入ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;solana airdrop 1&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[web3.js を使ってスマートコントラクトを実行する3つの方法【Solidity 入門】]]></title><description><![CDATA[このページはこんな人におすすめ 自分で作ったスマートコントラクトを実行したい JavaScript からスマコンを実行する方法がわからない Node.js のモジュールを使ってシンプルにスマコンを実行したい web3.js…]]></description><link>https://smacon.dev/posts/web3js</link><guid isPermaLink="false">https://smacon.dev/posts/web3js</guid><pubDate>Sat, 22 Jan 2022 10:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自分で作ったスマートコントラクトを実行したい&lt;/li&gt;
&lt;li&gt;JavaScript からスマコンを実行する方法がわからない&lt;/li&gt;
&lt;li&gt;Node.js のモジュールを使ってシンプルにスマコンを実行したい&lt;/li&gt;
&lt;li&gt;web3.js の使い方がわからない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このページでは、ブロックチェーン上にデプロイしたスマートコントラクトを web3.js を使って実行する方法を３つ紹介します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML と JavaScript だけのシンプルな web3.js&lt;/li&gt;
&lt;li&gt;Next.js を使った web3.js（Chrome のコンソールに表示）&lt;/li&gt;
&lt;li&gt;Next.js を使った web3.js（HTML に表示）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回実行するスマートコントラクトは、以下の記事で作った Hello World プログラムです。&lt;/p&gt;
&lt;h1&gt;必要なもの&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;live-server&lt;/li&gt;
&lt;li&gt;Next.js アプリケーション&lt;/li&gt;
&lt;li&gt;npm の web3.js&lt;/li&gt;
&lt;li&gt;スマートコントラクトのアドレス&lt;/li&gt;
&lt;li&gt;スマートコントラクトの ABI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;live-server&lt;/h2&gt;
&lt;p&gt;３つの確認方法のうち、&lt;/p&gt;
&lt;p&gt;HTML と JavaScript ファイルだけの web3.js の実行方法
1 番目では live-server を使います。live-server は npm を使ってインストールできます。
live-server はローカル PC 上で利用できる軽量な HTTP サーバです。
PC 上の HTML ファイルをブラウザを通してアクセスできます。&lt;/p&gt;
&lt;h2&gt;Next.js アプリケーション&lt;/h2&gt;
&lt;p&gt;JavaScript を使ったアプリケーションを書く場合、React や Vue.js などいろんなフレームワークを使いますが、それらは基本的にサーバサイドの JavaScript 言語である Node.js を使っています。&lt;/p&gt;
&lt;p&gt;Node.js を使ってスマートコントラクトを実行する方法は、いろいろあります。
なるべくシンプルで汎用的に応用できることを考えて Next.js を使った 2 つ web3.js の実行方法を紹介します。&lt;/p&gt;
&lt;p&gt;Next.js の新しいプロジェクトを用意してください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nextjs.org/docs/getting-started&quot;&gt;https://nextjs.org/docs/getting-started&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;npm の web3.js&lt;/h2&gt;
&lt;p&gt;Next.js のプロジェクトに npm を使って web3.js をインストールします。&lt;/p&gt;
&lt;p&gt;プロジェクトのトップディレクトリ（package.json ファイルのある場所）で以下のコマンドを実行しましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install web3 --save&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;スマートコントラクトのアドレス&lt;/h2&gt;
&lt;p&gt;スマートコントラクトを実行する場合にコントラクトアドレスを指定します。
今回使うスマートコントラクトのアドレスを調べましょう。&lt;/p&gt;
&lt;p&gt;Truffle を使って Ganache にコントラクトをデプロイした場合は、build ディレクトリの下に helloWorld.json というファイルが作られて、中にコントラクトアドレスがかかれています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;  &lt;span class=&quot;token string-property property&quot;&gt;&quot;networks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;5777&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;events&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;links&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;address&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0x0cb51E4BF025C8F5Df16B3f523249C58e1361B73&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;transactionHash&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0xbd6c7a8de462e0c35b5c696aab5b02a64775aa7a6c3a4545ce0820d1457bd920&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;スマートコントラクトの ABI&lt;/h2&gt;
&lt;p&gt;スマートコントラクトを実行する場合、そのコントラクトがどんなファンクションを持っているのかやどんな型の情報を返すのかといったインターフェースの情報が必要になります。
それが ABI（Application Binary Interface）です。&lt;/p&gt;
&lt;p&gt;Truffle でデプロイした場合は、コントラクトアドレスと同じく build ディレクトリ配下の helloWorld.json に書かれています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;  &lt;span class=&quot;token string-property property&quot;&gt;&quot;abi&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;constant&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;inputs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;outputs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token string-property property&quot;&gt;&quot;internalType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token string-property property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;payable&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;stateMutability&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pure&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;HTML と JavaScript だけのシンプルな web3.js&lt;/h1&gt;
&lt;h2&gt;コード&lt;/h2&gt;
&lt;p&gt;３つのファイルを作って同じディレクトリに置きましょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;index.html&lt;/li&gt;
&lt;li&gt;app.js&lt;/li&gt;
&lt;li&gt;helloWorld.js&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;index.html&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-html line-numbers&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ja&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Ðapps - Hello World&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;app.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;contract-result&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;loading...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;app.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; helloWorld &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./helloWorld.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onload&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;helloWorld&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;helloWorld.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; abi &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;constant&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;outputs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;payable&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;stateMutability&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pure&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0x5B0A7974Aeab510BB344e7f27e607841b4EC4C9f&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// コントラクトアドレス&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; web3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Web3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Web3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;givenProvider &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ws://localhost:7545&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;web3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;eth&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Contract&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;abi&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methods&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;contract-result&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;確認手順&lt;/h2&gt;
&lt;p&gt;配置したディレクトリで live-server を実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;live-server .&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;live-server を実行すると、自動でブラウザが開いて index.html を表示します。&lt;/p&gt;
&lt;h2&gt;解説&lt;/h2&gt;
&lt;p&gt;HTML と JavaScript を使った一番シンプルなやり方です。&lt;/p&gt;
&lt;p&gt;ここではインターネット上の web3.js を CDN からダウンロードして使っています。あとから紹介する Next.js を使う 2 つのやり方では、Node.js ライブラリの web3.js を使います。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-html line-numbers&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;どのブロックチェーンに繋ぐかどうかは、helloWorld.js の以下の行で指定しています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; web3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Web3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Web3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;givenProvider &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ws://localhost:7545&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ブラウザに Metamask などがある場合は、Web3.givenProvider を指定すると Metamask が接続しているブロックチェーンのエンドポイントをもとに web3 オブジェクトが作られます。&lt;/p&gt;
&lt;p&gt;Web3.givenProvider で取得できない場合は、”ws://localhost:7545″に接続するように書いています。
これは Ganache に接続するときの WebSocket のエンドポイントです。&lt;/p&gt;
&lt;h1&gt;Next.js を使った web3.js（Chrome のコンソールに表示）&lt;/h1&gt;
&lt;h2&gt;コード&lt;/h2&gt;
&lt;p&gt;Next.js アプリケーションの pages ディレクトリの下に hello1.js というファイルを作って、以下のコードを貼り付けます。&lt;/p&gt;
&lt;p&gt;コントラクトアドレスや ABI は自分の使うコントラクトに置き換えましょう。&lt;/p&gt;
&lt;h3&gt;pages/hello1.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Web3 &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;web3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; abi &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;constant&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;outputs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;payable&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;stateMutability&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pure&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0x5B0A7974Aeab510BB344e7f27e607841b4EC4C9f&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// コントラクトアドレス&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Hello1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; web3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Web3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Web3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;givenProvider &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ws://localhost:7545&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;web3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;eth&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Contract&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;abi&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methods&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ret: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; ret&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Hello1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;確認手順&lt;/h2&gt;
&lt;p&gt;Next.js のドキュメントに従って Next.js を起動します。インストール方法によって起動コマンドは変わります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yarn dev&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Chrome ブラウザから以下の URL にアクセスします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://localhost:3000/hello1&quot;&gt;http://localhost:3000/hello1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Chrome の Developer Tools のコンソールタブを開きます。Mac なら「command」＋「option」+「I（アイ）｝で開きます。&lt;/p&gt;
&lt;p&gt;Console に”Hello World!”という文字が表示されています。これはスマートコントラクトから取得した文字列です。&lt;/p&gt;
&lt;p&gt;ブラウザで表示する HTML は下のようになると思います。HTML では”Hello World”を表示できていない状態です。&lt;/p&gt;
&lt;p&gt;HTML に表示させるやり方は 3 番目で紹介します。&lt;/p&gt;
&lt;h2&gt;解説&lt;/h2&gt;
&lt;p&gt;先ほどの 1 つ目の HTML を使った実行方法では、web3.js は CDN からダウンロードしてブラウザ上で JavaScript を実行しました。&lt;/p&gt;
&lt;p&gt;今回は、web3.js は Node.js のモジュールを使っています。&lt;/p&gt;
&lt;p&gt;一般的なアプリケーション開発では、Node.js を使ったやり方が主流になると思います。React や Vue を使う場合も Node.js の web3.js を使います。&lt;/p&gt;
&lt;p&gt;ブロックチェーンとの接続部分や web3 オブジェクトの使い方は 1 つ目の HTML の方法と基本的に同じです。&lt;/p&gt;
&lt;p&gt;取得した Hello World という文字列を返して、HTML に表示させようとしていますが、じつはこれはうまく動きません。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ret: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; ret&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;つぎの 3 番目の方法では、Next.js で API やスマートコントラクトなど外部から取得したデータを HTML に表示するやり方で紹介します。&lt;/p&gt;
&lt;h1&gt;Next.js を使った web3.js（HTML に表示）&lt;/h1&gt;
&lt;h2&gt;コード&lt;/h2&gt;
&lt;p&gt;Next.js アプリケーションの pages ディレクトリの下に hello2.js というファイルを作って、以下のコードを貼り付けます。&lt;/p&gt;
&lt;p&gt;コントラクトアドレスや ABI は自分の使うコントラクトに置き換えましょう。&lt;/p&gt;
&lt;h3&gt;pages/hello2.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Web3 &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;web3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Hello2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; message &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;message: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getStaticProps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hoge22&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; abi &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;constant&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;outputs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;payable&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;stateMutability&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pure&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; address &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0x5B0A7974Aeab510BB344e7f27e607841b4EC4C9f&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; web3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Web3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Web3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;givenProvider &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ws://localhost:7545&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;web3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;eth&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Contract&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;abi&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methods&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Hello2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;確認手順&lt;/h2&gt;
&lt;p&gt;Next.js のドキュメントに従って Next.js を起動します。インストール方法によって起動コマンドは変わります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yarn dev&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Chrome ブラウザから以下の URL にアクセスします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://localhost:3000/hello2&quot;&gt;http://localhost:3000/hello2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今度は HTML に”Hello World!”を表示できるはずです。&lt;/p&gt;
&lt;h2&gt;解説&lt;/h2&gt;
&lt;p&gt;2 番目と 3 番目の違いは、スマートコントラクトのように外部から取得するデータを Console に表示しているか、HTML に表示しているかの違いです。&lt;/p&gt;
&lt;p&gt;実際のアプリケーション開発に近いのはこの 3 番目のやり方ではないでしょうか。&lt;/p&gt;
&lt;p&gt;しかし、このやり方はうまく動かないときに、何が原因でうごかないのか見分けにくいというデメリットがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScritpt の非同期による問題&lt;/li&gt;
&lt;li&gt;Next.js の記述方法の問題&lt;/li&gt;
&lt;li&gt;スマートコントラクトの実行方法の問題&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そういう時に、1 番目や 2 番目のやり方を合わせて使うことで、どこがうまく動いて、どこが動いていないのかを見分けることができます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Solidity 入門: 定義したイベントを発行してブロックチェーンに記録]]></title><description><![CDATA[このページはこんな人におすすめ Solidity を学びたい 簡単なスマートコントラクトの作り方を知りたい EVM の Event のことを知りたい Solidity by Example…]]></description><link>https://smacon.dev/posts/solidity-events</link><guid isPermaLink="false">https://smacon.dev/posts/solidity-events</guid><pubDate>Fri, 21 Jan 2022 19:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページはこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solidity を学びたい&lt;/li&gt;
&lt;li&gt;簡単なスマートコントラクトの作り方を知りたい&lt;/li&gt;
&lt;li&gt;EVM の Event のことを知りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solidity by Example の&lt;a href=&quot;https://solidity-by-example.org/events/&quot;&gt;サンプルコード&lt;/a&gt;を使ってスマートコントラクトを作る方法を解説します。&lt;/p&gt;
&lt;p&gt;以下のページでほかのサンプルコードも解説しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/first-app&quot;&gt;はじめてのイーサリアム Dapps 開発&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/erc721&quot;&gt;NFT プログラミング (ERC721)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/price-oracle&quot;&gt;オラクルの基本的な使い方（Chainlink Data Feeds)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/merkle-tree&quot;&gt;Merkle Proof（マークルツリーと Keccak256）&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/solidity-events&quot;&gt;定義したイベントを発行してブロックチェーンに記録&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardhat を使ったことがない方は以下の記事も合わせてご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けのスマートコントラクト開発&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;新しいプロジェクトを作る&lt;/h1&gt;
&lt;p&gt;events というディレクトリを作り
npm パッケージの hardhat をインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir events
cd events
npm init -y
npm i --save-dev hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hardhat のサンプルプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Create a sample project&lt;/code&gt;を選択して、すべて Yes で回答します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;? What do you want to do? …
❯ Create a sample project
  Create an empty hardhat.config.js
  Quit&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで hardhat.config.js の初期設定や ether.js などプラグインを追加した状態になります。&lt;/p&gt;
&lt;h1&gt;コーディング&lt;/h1&gt;
&lt;p&gt;以下のファイルを作ります。&lt;/p&gt;
&lt;h3&gt;contracts/Events.sol&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.8.9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Event&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Event declaration&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Up to 3 parameters can be indexed.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Indexed parameters helps you filter the logs by the indexed parameter&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;address&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;indexed&lt;/span&gt; sender&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;AnotherLog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;emit&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sender&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;emit&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sender&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello EVM!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;emit&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;AnotherLog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Log()と AnotherLog()という 2 つのイベントを定義して、test()関数を実行したときにそのイベントを発行しています。
ブロックチェーンにイベントを記録するときには、emit を付けます。&lt;/p&gt;
&lt;p&gt;イベントにはパラメータを渡すことができ、3 つまで indexed することができます。
indexed をつけたパラメータでログをフィルタリングすることができます。&lt;/p&gt;
&lt;p&gt;今回は Rinkeby というテストネットにデプロイするので、デプロイ用の設定も書いています。&lt;/p&gt;
&lt;h3&gt;hardhat.config.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@nomiclabs/hardhat-waffle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// This is a sample Hardhat task. To learn how to create your own go to&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// https://hardhat.org/guides/create-task.html&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;accounts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Prints the list of accounts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;taskArgs&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; hre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; accounts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSigners&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; account &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; accounts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;account&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * @type import(&apos;hardhat/config&apos;).HardhatUserConfig
 */&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;solidity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.8.9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;rinkeby&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_RPC_URL&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;accounts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RINKEBY_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;デプロイ&lt;/h1&gt;
&lt;p&gt;テストネットへのデプロイには以下の 2 つの環境変数が必要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RINKEBY_PRIVATE_KEY&lt;/li&gt;
&lt;li&gt;RINKEBY_RPC_URL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;詳細は&lt;a href=&quot;/posts/hardhat&quot;&gt;こちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;デプロイ用にスクリプトを用意します。&lt;/p&gt;
&lt;h3&gt;scripts/deploy.js&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-js line-numbers&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hre &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hardhat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Factory &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; hre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ethers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContractFactory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Event&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; contract &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Factory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deployed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Contract deployed to:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contract&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;環境変数を export した端末で以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npx hardhat run scripts/deploy.js --network rinkeby&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;（出力）
Contract deployed to: 0xc5BeE3DDcD7F58380Aa0CA3D01dA63a34a9C3c09&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このときに出力するコントラクトアドレスを書き留めてください。&lt;/p&gt;
&lt;h1&gt;イベントの発行&lt;/h1&gt;
&lt;p&gt;コントラクトをデプロイしただけでは、まだイベントを発行していません。
イベントを発行するためには、test()関数を実行する必要があります。
スマートコントラクトの実行方法はいろいろありますが、ここでは Etherscan を使ってみましょう。&lt;/p&gt;
&lt;h2&gt;Function の実行準備&lt;/h2&gt;
&lt;p&gt;Rinkeby の Explorer(Etherscan)を開き、デプロイしたコントラクトアドレスを検索しましょう。
デプロイの直後はすぐに表示されないかもしれません。2, 3 分待てば表示されます。&lt;/p&gt;
&lt;p&gt;作ったコントラクトの Function を Etherscan で実行するためにソースコードの 「Verify and Publish」を行ってください。
この作業は慣れれば 1 分で終わります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://note.com/standenglish/n/n7680bdb2beaf&quot;&gt;コントラクトを Etherscan で最適化しよう。&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Function の実行&lt;/h2&gt;
&lt;p&gt;関数の実行には Rinkeby の ETH が少量必要です。
テストネットの ETH は無料で入手できます。&lt;/p&gt;
&lt;p&gt;Rinkeby の Etherscan を開いて自分のコントラクトを検索します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rinkeby.etherscan.io/address/0xc5bee3ddcd7f58380aa0ca3d01da63a34a9c3c09#writeContract&quot;&gt;https://rinkeby.etherscan.io/address/0xc5bee3ddcd7f58380aa0ca3d01da63a34a9c3c09#writeContract&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[Contract]タブの[Write Contract]を表示&lt;/li&gt;
&lt;li&gt;[Connect to Web3]をクリックすると Metamask を接続&lt;/li&gt;
&lt;li&gt;[test]の[Write]をクリックして test()関数を実行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ee730ff392f542d4a317e13a37f4dccc/20a65/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.36708860759494%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABlUlEQVR42p2Ry27bMBBF9f//04X3RdBlYdePun7FkB0rlmw9SYnk8BSknDQoiiwq4GA4VxjMnZlku0vJipJaGz77xDkapbGnZ/r5d4b1gn45Ra0X6M0KZwziPUlWFmTbDdXmJ+1hR3PY0R73tMcDzXFPd9yj6prQTvoBe79jr1fcy4l+vaKrKrpOoXQfSfKqJNvtqLe/0OkRtV3TLWao+ZRuPkUvZ+jlAnMvo8NQbMUzOMF5oivr3DtJ27QMzsWxPDBoDSEXAe/HWFegNU2nKIoCCRrQtG3UxIcSiY2SYNMMA0ZrrLGY8CNg3UjoHFyIp2k78uIWRwt62WryuqdShqpVlMqQtKqnrRvy2YxsNuV2PuPE/wNB3g4UHImPE3nvo2MJuQiJqhuqU0pX5KyenphOJjD04CyYAYwZsfbPe/igP9b1trLk8u0r88kXrssfo3grkFOK5FfkNUMuLyNBD/H6ilzOSHYZKcvoXNzoMtHpM8M5HfdnAw7j3CPK+H7P/9LtA2PjvpXSJPLhwvGq/8NYHff5G1UnBetyKI0QAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Etherscan&quot;
        title=&quot;&quot;
        src=&quot;/static/ee730ff392f542d4a317e13a37f4dccc/f058b/1.png&quot;
        srcset=&quot;/static/ee730ff392f542d4a317e13a37f4dccc/c26ae/1.png 158w,
/static/ee730ff392f542d4a317e13a37f4dccc/6bdcf/1.png 315w,
/static/ee730ff392f542d4a317e13a37f4dccc/f058b/1.png 630w,
/static/ee730ff392f542d4a317e13a37f4dccc/40601/1.png 945w,
/static/ee730ff392f542d4a317e13a37f4dccc/78612/1.png 1260w,
/static/ee730ff392f542d4a317e13a37f4dccc/20a65/1.png 2490w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Event の確認&lt;/h2&gt;
&lt;p&gt;test()を実行したらトランザクションが完了するまで待ちましょう。
トランザクションが Success になったら Events タブを開くと、イベントのログを見ることができます。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b849e1dadae41b9d5548e534016f9df0/36909/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.46835443037975%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABPUlEQVR42nWSWY6EMBBDuf8154ct+75UPKpAM0LqQXoimMSyS1lCTHDew4eIVCryTSkVtTaMAQx84aOPSwmF8KMzFmETDpsRCyGmAqEMfCyQLiPmOrWQytT4HSKv87NOpaE2QuuE1joW6ROEL2g00FqD1gY0BipvIEKnjt47qNNMw9BNY53+9N4Jy2kjdptQb0NjLWKMOI4Du5IQUkCcB5zWcD7AOgfnPEKI+DxXbVyGPCei/vrBWogRWmlIqaCUhpASQojJKQSMMc+Zx5AIS6dxpbsrcT029N7j4MPnCXGekEJAKTWRUsI595i9EgqXsNs8Z8hGWmuklK5E1kIbA60UvHXgG8FVmZjSy5A978oV1N+V+crwrI59x7Zt2PYd67ZhXdcHTvm18ufjHb0j5zzTMjyvWVfrC6X+rfwLNrq9WRwwczQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Etherscan&quot;
        title=&quot;&quot;
        src=&quot;/static/b849e1dadae41b9d5548e534016f9df0/f058b/2.png&quot;
        srcset=&quot;/static/b849e1dadae41b9d5548e534016f9df0/c26ae/2.png 158w,
/static/b849e1dadae41b9d5548e534016f9df0/6bdcf/2.png 315w,
/static/b849e1dadae41b9d5548e534016f9df0/f058b/2.png 630w,
/static/b849e1dadae41b9d5548e534016f9df0/40601/2.png 945w,
/static/b849e1dadae41b9d5548e534016f9df0/78612/2.png 1260w,
/static/b849e1dadae41b9d5548e534016f9df0/36909/2.png 2772w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;このページで&lt;a href=&quot;https://github.com/smacon-dev/solidity-example/tree/main/events&quot;&gt;実際に使ったソースコード&lt;/a&gt;を GitHub からダウンロードできます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing Rust free learning sites]]></title><description><![CDATA[Learn Rust https://www.rust-lang.org/learn The Book Playground Introduction to Rust https://serokell.io/blog/rust-guide Tour of Rust https…]]></description><link>https://smacon.dev/posts/rust-learning</link><guid isPermaLink="false">https://smacon.dev/posts/rust-learning</guid><pubDate>Tue, 04 Jan 2022 19:38:00 GMT</pubDate><content:encoded>&lt;h1&gt;Learn Rust&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.rust-lang.org/learn&quot;&gt;https://www.rust-lang.org/learn&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://doc.rust-lang.org/book/&quot;&gt;The Book&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://play.rust-lang.org/&quot;&gt;Playground&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Introduction to Rust&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://serokell.io/blog/rust-guide&quot;&gt;https://serokell.io/blog/rust-guide&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Tour of Rust&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://tourofrust.com/&quot;&gt;https://tourofrust.com/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Rust by Example&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://doc.rust-lang.org/rust-by-example/index.html&quot;&gt;https://doc.rust-lang.org/rust-by-example/index.html&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;rustlings&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rust-lang/rustlings/&quot;&gt;https://github.com/rust-lang/rustlings/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;exercism&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://exercism.org/tracks/rust&quot;&gt;https://exercism.org/tracks/rust&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;A half-hour to learn Rust&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://fasterthanli.me/articles/a-half-hour-to-learn-rust&quot;&gt;https://fasterthanli.me/articles/a-half-hour-to-learn-rust&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you for your &lt;a href=&quot;https://twitter.com/ocrybit/status/1478206583993774081&quot;&gt;nice tweet&lt;/a&gt;, @ocrybit&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: CYCLE ウォレットとキャニスター]]></title><description><![CDATA[このページは、DFINITY のチュートリアルを日本語で解説しています。 Accept cycles from a wallet 実際に使ったソースコードはGitHubからダウンロードできます。 実行環境 dfx: 0.8.4 macOS: 11.5.2 npm version…]]></description><link>https://smacon.dev/posts/cycles-hello</link><guid isPermaLink="false">https://smacon.dev/posts/cycles-hello</guid><pubDate>Mon, 03 Jan 2022 20:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページは、DFINITY のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/simple-cycles&quot;&gt;Accept cycles from a wallet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/cycles_hello&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;li&gt;任意のターミナル&lt;/li&gt;
&lt;li&gt;任意のテキストエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;dfx について知りたい方はこちらをどうぞ&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ターミナルは、なんでもよいので Mac 標準のターミナルで大丈夫です。
テキストエディタは Visual Studio Code を筆者は使っています。&lt;/p&gt;
&lt;h1&gt;手順&lt;/h1&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new cycles_hello
cd cycles_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コーディング&lt;/h2&gt;
&lt;h3&gt;src/cycles_hello/main.mo&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Nat64 &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/Nat64&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Cycles &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/ExperimentalCycles&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; actor &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HelloCycles&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
   capacity&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; balance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Return the current cycle balance&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;wallet_balance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Nat &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; balance&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Return the cycles received up to the capacity allowed&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;wallet_receive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; async &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; accepted&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat64 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; amount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Cycles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;available&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; limit &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; capacity &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; balance&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; accepted &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;amount &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; limit&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; amount
      &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; limit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; deposit &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Cycles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;accepted&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;deposit &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; accepted&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    balance &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; accepted&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; accepted &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Nat64&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromNat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;accepted&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Return the greeting&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello, &quot;&lt;/span&gt; # name # &lt;span class=&quot;token string&quot;&gt;&quot;!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Return the principal of the caller/user identity&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Principal &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; currentOwner &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;caller&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; currentOwner&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;起動＆デプロイ&lt;/h2&gt;
&lt;p&gt;ローカル実行環境を起動&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --clean --background&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;キャニスターのビルド＆デプロイ&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy --argument &apos;(360000000000)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
cycles_hello % dfx deploy --argument &apos;(360000000000)&apos;
Creating a wallet canister on the local network.
The wallet canister on the &quot;local&quot; network for user &quot;default&quot; is &quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;
Deploying all canisters.
Creating canisters...
Creating canister &quot;cycles_hello&quot;...
&quot;cycles_hello&quot; canister created with canister id: &quot;rrkah-fqaaa-aaaaa-aaaaq-cai&quot;
Creating canister &quot;cycles_hello_assets&quot;...
&quot;cycles_hello_assets&quot; canister created with canister id: &quot;ryjl3-tyaaa-aaaaa-aaaba-cai&quot;
Building canisters...
（中略）
Committing batch.
Deployed canisters.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;キャニスターの owner の Principal ID を表示させます&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call cycles_hello owner&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(principal &quot;zr2yi-7hrww-jgne7-j4gbs-2xu5a-ms3wg-ixp3t-4azyp-ifmeb-yxym6-sqe&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この Principal ID はデプロイした Identity の Principal ID で以下のコマンドの結果と一致します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity get-principal&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;動作確認&lt;/h1&gt;
&lt;h2&gt;CYCLES の確認&lt;/h2&gt;
&lt;p&gt;CYCLE は Wallet キャニスターが管理しています。
このプロジェクトに登場するウォレットは 2 つあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dfx の実行ユーザー用のウォレット&lt;/li&gt;
&lt;li&gt;cycles_hello キャニスター用のウォレット&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cycles_hello キャニスターのウォレットの初期残高を表示&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call cycles_hello wallet_balance
(0 : nat)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;dfx の実行ユーザーのウォレットから cycles_hello キャニスターのウォレットに 256,000,000,000CYCLE を移動&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call rwlgt-iiaaa-aaaaa-aaaaa-cai wallet_send &apos;(record { canister = principal &quot;rrkah-fqaaa-aaaaa-aaaaq-cai&quot;; amount = (256000000000:nat64); } )&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(variant { 17_724 })&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;cycles_hello キャニスターのウォレットの残高を表示&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call cycles_hello wallet_balance
(256_000_000_000 : nat)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;dfx 実行ユーザーの wallet 残高を表示&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call rwlgt-iiaaa-aaaaa-aaaaa-cai wallet_balance&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(record { 3_573_748_184 = 91_744_000_000_000 : nat64 })&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;キャニスターを実行したらどのウォレットから CYCLE が消費されるか&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call cycles_hello greet &apos;(&quot;from DFINITY&quot;)&apos;
(&quot;Hello, from DFINITY!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call rwlgt-iiaaa-aaaaa-aaaaa-cai wallet_balance&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(record { 3_573_748_184 = 91_744_000_000_000 : nat64 })&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;DFINITY の Document では、このときに dfx 実行ユーザーの wallet の CYCLE 残高が減少してますが
筆者の環境では、どちらのウォレットの CYCLE も減りませんでした。&lt;/p&gt;
&lt;p&gt;詳しく調べて、また後日、更新したいと思います。&lt;/p&gt;
&lt;h2&gt;停止&lt;/h2&gt;
&lt;p&gt;dfx.json があるディレクトリで以下のコマンドを実行して、実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;2023-05-14 追記&lt;/h2&gt;
&lt;p&gt;当記事の内容は古くなっている可能性があります。
記事の趣旨は少し変わりますが、新しいキャニスターの記事がこちらにあります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://smacon.dev/posts/ledger-cycle-wallet/&quot;&gt;Cycle Wallet キャニスター図解&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: ID とアクセス管理]]></title><description><![CDATA[このページでは DFINITY(Internet Computer)の Motoko Language のチュートリアルを日本語で解説しています。 Add access control with identities 実際に使ったソースコードはGitHub…]]></description><link>https://smacon.dev/posts/access-hello</link><guid isPermaLink="false">https://smacon.dev/posts/access-hello</guid><pubDate>Sun, 02 Jan 2022 20:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページでは DFINITY(Internet Computer)の Motoko Language のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/access-control&quot;&gt;Add access control with identities&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/access_hello&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方はこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;li&gt;任意のターミナル&lt;/li&gt;
&lt;li&gt;任意のテキストエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ターミナルとテキストエディタは好きなソフトウェアを使えば大丈夫です。&lt;/p&gt;
&lt;p&gt;はじめは Mac 標準のターミナルでよいと思います。テキストエディタは筆者は Visual Studio Code を使っています。&lt;/p&gt;
&lt;h1&gt;本プロジェクトで学ぶこと&lt;/h1&gt;
&lt;p&gt;ユーザーごとに権限を割り当てて、処理を変える方法を実現します。
いろんなユースケースで使える実用的なチュートリアルです。&lt;/p&gt;
&lt;p&gt;dfx コマンドラインツールには identity という概念があり、
複数の identity を作ったり切り替えてアクセスすることができます。&lt;/p&gt;
&lt;p&gt;identity は、秘密鍵と Principal ID のペアです。&lt;/p&gt;
&lt;p&gt;秘密鍵は dfx コマンドを実行するローカル側に持ちます。
キャニスター側では、Principal ID で識別します。&lt;/p&gt;
&lt;h1&gt;手順&lt;/h1&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new access_hello
cd access_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コーディング&lt;/h2&gt;
&lt;p&gt;エディタを使って、&lt;code class=&quot;language-text&quot;&gt;src/access_hello/main.mo&lt;/code&gt; を編集します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Import base modules&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; AssocList &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/AssocList&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Error &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/Error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; List &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/List&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; initializer &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; actor &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Establish role-based greetings to display&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;has_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;caller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #assign_role&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello, &quot;&lt;/span&gt; # name # &lt;span class=&quot;token string&quot;&gt;&quot;. You have a role with administrative privileges.&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;has_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;caller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #lowest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Welcome, &quot;&lt;/span&gt; # name # &lt;span class=&quot;token string&quot;&gt;&quot;. You have an authorized account. Would you like to play a game?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Greetings, &quot;&lt;/span&gt; # name # &lt;span class=&quot;token string&quot;&gt;&quot;. Nice to meet you!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Define custom types&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Role&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        #owner&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        #admin&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        #authorized&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Permission&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        #assign_role&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        #lowest&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; roles&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; AssocList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AssocList&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Role&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; role_requests&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; AssocList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AssocList&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Role&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    func &lt;span class=&quot;token function&quot;&gt;principal_eq&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Principal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bool &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    func &lt;span class=&quot;token function&quot;&gt;get_role&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pal&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Principal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;Role &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pal &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; initializer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;#owner&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            AssocList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Role&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;roles&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; principal_eq&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Determine if a principal has a role with permissions&lt;/span&gt;
    func &lt;span class=&quot;token function&quot;&gt;has_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pal&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; perm &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Permission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bool &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; role &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_role&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;role&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; perm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;#owner or &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;#admin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;#authorized&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #lowest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Reject unauthorized user identities&lt;/span&gt;
    func &lt;span class=&quot;token function&quot;&gt;require_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pal&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; perm&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Permission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;has_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; perm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; Error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unauthorized&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Assign a new role to a principal&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;assign_role&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; assignee&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; new_role&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;Role &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; caller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #assign_role &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; new_role &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;#owner&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; Error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Cannot assign anyone to be the owner&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;assignee &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; initializer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; Error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Cannot assign a role to the canister owner&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        roles &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; AssocList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Role&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;roles&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; assignee&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; principal_eq&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; new_role&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        role_requests &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; AssocList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Role&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;role_requests&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; assignee&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; principal_eq&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;request_role&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; role&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Role &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Principal &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        role_requests &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; AssocList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Role&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;role_requests&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; caller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; principal_eq&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;role&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; caller&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Return the principal of the message caller/user identity&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;callerPrincipal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Principal &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; caller&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Return the role of the message caller/user identity&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;my_role&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; async &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;Role &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_role&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;caller&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;my_role_request&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; async &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;Role &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        AssocList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Role&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;role_requests&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; caller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; principal_eq&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;get_role_requests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;List&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;Role&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; caller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #assign_role &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; role_requests&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; caller &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;get_roles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;List&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Principal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;Role&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require_permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; caller&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #assign_role &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; roles&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;デプロイ&lt;/h2&gt;
&lt;p&gt;ローカルの実行環境を起動します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --background&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--background&lt;/code&gt;オプションをつけることで、後続のコマンドを同じウィンドウで実行できます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy access_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Deploying: access_hello
Creating canisters...
Creating canister &quot;access_hello&quot;...
&quot;access_hello&quot; canister created with canister id: &quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;
Building canisters...
Installing canisters...
Installing code for canister access_hello, with canister_id rwlgt-iiaaa-aaaaa-aaaaa-cai
Deployed canisters.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;実行&lt;/h1&gt;
&lt;p&gt;これから 4 つの identity を使ってキャニスターの動作を検証します。
各 identity はそれぞれ別の role を割り当てます。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;identity&lt;/th&gt;
&lt;th&gt;role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;default&lt;/td&gt;
&lt;td&gt;owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ic_admin&lt;/td&gt;
&lt;td&gt;admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alice_auth&lt;/td&gt;
&lt;td&gt;authorized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bob_standard&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;キャニスターをデプロイした identity は owner&lt;/h2&gt;
&lt;p&gt;dfx が使っている現在の identity を確認&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;access_hello % dfx identity whoami
default&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Principal ID を確認&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;access_hello % dfx identity get-principal
zr2yi-7hrww-jgne7-j4gbs-2xu5a-ms3wg-ixp3t-4azyp-ifmeb-yxym6-sqe&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;my_role 関数で実行者の Principal ID に紐づく role を表示させてみます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister --wallet=$(dfx identity get-wallet) call access_hello my_role&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(opt variant { owner })&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このキャニスターをデプロイした&lt;code class=&quot;language-text&quot;&gt;default&lt;/code&gt;の identity は&lt;code class=&quot;language-text&quot;&gt;owner&lt;/code&gt;ロールになっています。&lt;/p&gt;
&lt;h2&gt;ic_admin&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;という新しい identity を作ります。
新しい秘密鍵と Principal ID のペアが作られます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity new ic_admin&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Creating identity: &quot;ic_admin&quot;.
Created identity: &quot;ic_admin&quot;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;を使って my_role 関数を実行してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx --identity ic_admin canister call access_hello my_role&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(null)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;さっきまでは—identity オプションで指定していましたが、
dfx の identity を&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;に切り替えます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;access_hello % dfx identity use ic_admin &amp;amp;&amp;amp; dfx identity get-principal
Using identity: &quot;ic_admin&quot;.
ptgej-o2oox-uin5n-64lps-ouln7-e677b-jwi75-ije6c-x3awj-o6yw7-mae&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;切り替えた identity で&lt;code class=&quot;language-text&quot;&gt;access_hello&lt;/code&gt;キャニスターを call して、Principal を確認します&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;access_hello % dfx canister call access_hello callerPrincipal
(principal &quot;ptgej-o2oox-uin5n-64lps-ouln7-e677b-jwi75-ije6c-x3awj-o6yw7-mae&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;の Principal ID でキャニスターを実行していることが確認できました。&lt;/p&gt;
&lt;h2&gt;ロールのアサイン&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;に&lt;code class=&quot;language-text&quot;&gt;admin&lt;/code&gt;ロールをアサインするために、いったん&lt;code class=&quot;language-text&quot;&gt;owner&lt;/code&gt;である&lt;code class=&quot;language-text&quot;&gt;default&lt;/code&gt;に戻しましょう&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity use default&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;default&lt;/code&gt;の権限を使って&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;に&lt;code class=&quot;language-text&quot;&gt;admin&lt;/code&gt;ロールをアサインします。
アサインするときは、先ほど表示させた&lt;code class=&quot;language-text&quot;&gt;admin&lt;/code&gt;の Principal ID を渡します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister --wallet=$(dfx identity get-wallet) call access_hello assign_role &apos;((principal &quot;ptgej-o2oox-uin5n-64lps-ouln7-e677b-jwi75-ije6c-x3awj-o6yw7-mae&quot;),opt variant{admin})&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;再び&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;の identity で my_role を実行してみます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx --identity ic_admin canister call access_hello my_role&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(opt variant { admin })&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;で実行した my_role 関数の結果、&lt;code class=&quot;language-text&quot;&gt;admin&lt;/code&gt;になりました。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;を使って greet 関数を実行してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx --identity ic_admin canister call access_hello greet &quot;Internet Computer Admin&quot;
(
  &quot;Hello, Internet Computer Admin. You have a role with administrative privileges.&quot;,
)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;greet 関数はロールによってメッセージが変わります。興味があれば main.mo を見てみましょう！&lt;/p&gt;
&lt;h2&gt;alice_auth に authorized ロールをアサイン&lt;/h2&gt;
&lt;p&gt;新しく&lt;code class=&quot;language-text&quot;&gt;alice_auth&lt;/code&gt;という identity を作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity new alice_auth&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Creating identity: &quot;alice_auth&quot;.
Created identity: &quot;alice_auth&quot;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;alice_auth&lt;/code&gt;に切り替えます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity use alice_auth&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;alice_auth&lt;/code&gt;の Principal ID を&lt;code class=&quot;language-text&quot;&gt;ALICE_ID&lt;/code&gt;という環境変数に入れます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ALICE_ID=$(dfx identity get-principal)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ALICE_ID&lt;/code&gt;の中身を確認してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;echo $ALICE_ID
lwhzc-k3xsu-i222u-6guck-cszug-i6fnj-uhigp-4hjgo-2uhyv-qma73-mae&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ic_admin&lt;/code&gt;の権限で&lt;code class=&quot;language-text&quot;&gt;alice_auth&lt;/code&gt;の Principal ID に&lt;code class=&quot;language-text&quot;&gt;authorized&lt;/code&gt;というロールをアサインします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx --identity ic_admin canister call access_hello assign_role &quot;(principal \&quot;$ALICE_ID\&quot;, opt variant{authorized})&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;alice_auth&lt;/code&gt;のロールを確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx --identity alice_auth canister call access_hello my_role&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(opt variant { authorized })&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;authorized&lt;/code&gt;ロールがアサインされた&lt;code class=&quot;language-text&quot;&gt;alice_auth&lt;/code&gt;で greet 関数を call してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call access_hello greet &quot;Alice&quot;
(
  &quot;Welcome, Alice. You have an authorized account. Would you like to play a game?&quot;,
)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;bob_standard&lt;/h2&gt;
&lt;p&gt;今使っている identity がわからなくなってしまったら、whoami で表示させたり use で切り替えたりしてください。
また切り替えなくても—identity オプションで実行する identity を指定することもできるので好きに使い分けてください。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity whoami
dfx identity use &amp;lt;切り替え先&gt;
dfx --identity &amp;lt;実行者&gt; canister call ...&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;bob_standard&lt;/code&gt;を作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx identity new bob_standard
Creating identity: &quot;bob_standard&quot;.
Created identity: &quot;bob_standard&quot;.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;BOB_ID=$(dfx --identity bob_standard identity get-principal)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;作ったばかりでなにも権限を持っていない&lt;code class=&quot;language-text&quot;&gt;bob_standard&lt;/code&gt;の実行によって、bob_standard に&lt;code class=&quot;language-text&quot;&gt;authorized&lt;/code&gt;をアサインさせようと試みます。
これは失敗することを期待しています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx --identity bob_standard canister call access_hello assign_role &quot;(principal \&quot;$BOB_ID\&quot;, opt variant{authorized})&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
The Replica returned an error: code 4, message: &quot;unauthorized&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;owner 権限を持つ default の identity を使って、bob_standard に owner 権限をアサインしてみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx --identity default canister --wallet=$(dfx --identity default identity get-wallet) call access_hello assign_role &quot;(principal \&quot;$BOB_ID\&quot;, opt variant{owner})&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このコマンドは以下のようにエラーを出力します。
ユーザーを owner にすることはできません。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
An error happened during the call: 4: Cannot assign anyone to be the owner&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ロールを与えられていない&lt;code class=&quot;language-text&quot;&gt;bob_standard&lt;/code&gt;で greet 関数を実行してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx --identity bob_standard canister --no-wallet call access_hello greet &quot;Bob&quot;
(&quot;Greetings, Bob. Nice to meet you!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このように与えられたロールによって実行できる関数と実行できない関数をできました。&lt;/p&gt;
&lt;h2&gt;停止&lt;/h2&gt;
&lt;p&gt;dfx.json があるディレクトリで以下のコマンドを実行して、実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: キャニスター間の関数呼び出し]]></title><description><![CDATA[このページは、DFINITY の Motoko Language のチュートリアルを日本語で解説しています。 Make inter-canister calls 実際に使ったソースコードはGitHubからダウンロードできます。 はじめての方はこちらをご覧ください。…]]></description><link>https://smacon.dev/posts/motoko-linkedup</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-linkedup</guid><pubDate>Thu, 30 Dec 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページは、DFINITY の Motoko Language のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/intercanister-calls&quot;&gt;Make inter-canister calls&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/linkedup&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方はこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.6.22&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;dfx 0.6.22 のインストール&lt;/h2&gt;
&lt;p&gt;執筆時の dfx の最新バージョンは 0.8.4 ですが、このプログラムは 0.8.x では動作しません。
0.6.22 を指定してインストールします。チュートリアルが終わったら最新バージョンに戻しましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;DFX_VERSION=0.6.22 sh -ci &quot;$(curl -fsSL https://sdk.dfinity.org/install.sh)&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;手順&lt;/h1&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;GitHub からプロジェクトを取得します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clone https://github.com/dfinity/linkedup.git
cd linkedup&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ライブラリのインストール&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install
npm audit fix&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;実行環境の起動&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --background&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Starting webserver on port 50931 for replica at &quot;http://localhost:50931&quot;
binding to: V4(0.0.0.0:8000)
replica(s): http://localhost:50931/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;キャニスターの登録&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister create --all&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Creating canister &quot;connectd&quot;...
&quot;connectd&quot; canister created with canister id: &quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;
Creating canister &quot;linkedup&quot;...
&quot;linkedup&quot; canister created with canister id: &quot;rrkah-fqaaa-aaaaa-aaaaq-cai&quot;
Creating canister &quot;linkedup_assets&quot;...
&quot;linkedup_assets&quot; canister created with canister id: &quot;ryjl3-tyaaa-aaaaa-aaaba-cai&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ビルド(コンパイル)&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx build&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Building canisters...
Building frontend...&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;デプロイ（インストール）&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister install --all&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Installing code for canister connectd, with canister_id rwlgt-iiaaa-aaaaa-aaaaa-cai
Installing code for canister linkedup, with canister_id rrkah-fqaaa-aaaaa-aaaaq-cai
Installing code for canister linkedup_assets, with canister_id ryjl3-tyaaa-aaaaa-aaaba-cai
Uploading assets to asset canister...&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;実行&lt;/h1&gt;
&lt;h2&gt;キャニスター ID&lt;/h2&gt;
&lt;p&gt;当プロジェクトには 3 つのキャニスターを作っています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connectd&lt;/li&gt;
&lt;li&gt;linkedup&lt;/li&gt;
&lt;li&gt;linkedup_assets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;キャニスターをブラウザ経由で実行します。
ブラウザ経由で実行する時に、各キャニスターの ID を URL で指定します。&lt;/p&gt;
&lt;p&gt;キャニスター ID は、ビルドやデプロイ時に表示されます。
もし記録していなくてものファイルを見ればわかります。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;linkedup/.dfx/local/canister_ids.json&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;linkedup &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; cat &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dfx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;local&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;canister_ids&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;connectd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;linkedup&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rrkah-fqaaa-aaaaa-aaaaq-cai&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;linkedup_assets&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ryjl3-tyaaa-aaaaa-aaaba-cai&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;フロントエンドキャニスター&lt;/h2&gt;
&lt;p&gt;127.0.0.1 は自分の PC にアクセスするための IP アドレスです。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://127.0.0.1:8000/?canisterId=&amp;lt;ic-identifier-for-linkedup-assets&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;linkedup_assets のキャニスター ID に置き換えた URL をブラウザで開きます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://127.0.0.1:8000/?canisterId=ryjl3-tyaaa-aaaaa-aaaba-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Linkedin そっくりのサイトが表示されました笑
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/48b92962d30f4704c3bc20e1b1236cb2/9e9da/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.43037974683544%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAACc0lEQVR42nWSW08aURRGpyRVolahghdEQLzgBapcBpgD4wwwc2bAilpsCa2m96q9atU+tPbNh/7r1TjGVB/6sPLtnOR8yc5eSiSWoOZu8eezw6tmhvJKErEwRiEeYG06gJqeZ900yasqhmlg2zaO4yClvJOtVstLZSQ0RjS5QD63hqWtoq8tIFIR1JkgudgI6nLyv4W3uXlTBgOjDAwHCU1MUcmlMfPLiKVpislR8rEAaiqGbhrkbgrldaHjyDvpui7NZhMlFIniHxziwcMw6aUU1dUFtMVp1ESA1Uk/q/EQmiiTKxQQQmAYBpZlY9nXSMfxsrpukCuWUUITEcITEYYCDylpAq1URNdKbNYFm3WNJxs2bafBY9mgs7PNs26Xne0t2hsuarHEVHyWaGKOYHiSoZFRFJ/Ph6IoHlVd5/nePtudLufHXzn7csTF+QmnRx84OXzH2ecjLn6c8f3jAT+PP/Fyfw//wAPvb79/iL7+gatZIZFIICrCW2mzvYkjJbsbDrtugw1D0DI0nrZsGuU8HbdB77FLr1lHGjqiso5p1unr66e/z39dKG2bXq/HVrvN7m6Hd29ec3L0lu/vX7Df2fJ4293BFQV+nX7j98UvLi8vOTk+ptftcnhwgJrP8yiTRknMzpGdi3D/3vXa93w+MskJRGYGkUmyNBViNjhIanyE7HwcXZSo12uYpukdSNer3nx14WarhRKZmWc8HCI6FmAyHKSaTSHLaZxKFqmruDWBpReRtSquY+E6V9rYnia3ufFRmYzGmAoNI9JxnOIidmmZRmkFq5KlUclTrxSwTA2rpnvYdRNpN5DS/if1LcH/ApHocRju9ZD9AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Linkedup&quot;
        title=&quot;&quot;
        src=&quot;/static/48b92962d30f4704c3bc20e1b1236cb2/f058b/1.png&quot;
        srcset=&quot;/static/48b92962d30f4704c3bc20e1b1236cb2/c26ae/1.png 158w,
/static/48b92962d30f4704c3bc20e1b1236cb2/6bdcf/1.png 315w,
/static/48b92962d30f4704c3bc20e1b1236cb2/f058b/1.png 630w,
/static/48b92962d30f4704c3bc20e1b1236cb2/40601/1.png 945w,
/static/48b92962d30f4704c3bc20e1b1236cb2/78612/1.png 1260w,
/static/48b92962d30f4704c3bc20e1b1236cb2/9e9da/1.png 2482w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;自分の名前や組織名を入力して保存します。
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f9ddf2fd28b51b71a95f34f651a9fd25/8579d/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 36.075949367088604%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABNUlEQVR42nWOT0sCQRjG9wP6OfKj5D26lAchCgo0iFSIgsxy5//szG7uWqmxi9vFkyIen9iR1pQ6/ObhHWZ+7+MRFqB1c4fb60sMe2cYUAuf6l1YgN6Tj/uHR7z4DOcXVzg6PgHlAQjbvBkQBcIDeFQYjKcZPtMvfExzJG+TLaMJ4tHYUcxxMgaXFkJFLrkMwVUIKiyYsC49FQyRZRnq9VN0ux2sVissFgssC5ZLNxes12vM53O02x0oHaHXp66VE3FT4kXDdzSbLVQqFRxUq1BKgVIK3/dBCEGapsjzHLPZrExtXretfsmcUOrIfazVDtFoNGCMwXO/D8YYKCGw1iJJEsRxXCKkBdkTlcLikDqEDiKHVBZKhy6lthDSgItgByb+lm2EwrhtDra5/Nm+bWH3+F/4Dd0I2zoxqARBAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Linkedup&quot;
        title=&quot;&quot;
        src=&quot;/static/f9ddf2fd28b51b71a95f34f651a9fd25/f058b/2.png&quot;
        srcset=&quot;/static/f9ddf2fd28b51b71a95f34f651a9fd25/c26ae/2.png 158w,
/static/f9ddf2fd28b51b71a95f34f651a9fd25/6bdcf/2.png 315w,
/static/f9ddf2fd28b51b71a95f34f651a9fd25/f058b/2.png 630w,
/static/f9ddf2fd28b51b71a95f34f651a9fd25/40601/2.png 945w,
/static/f9ddf2fd28b51b71a95f34f651a9fd25/78612/2.png 1260w,
/static/f9ddf2fd28b51b71a95f34f651a9fd25/8579d/2.png 2412w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;シークレットウィンドウでもう 1 つブラウザを開きます。
URL は先ほどと同じです。&lt;/p&gt;
&lt;p&gt;シークレットウィンドウではまた新しいユーザーを作成します。
ウィンドウごとにそれぞれの 2 つのユーザープロファイルを作成できました。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/977e5806b0792dcb08b410c62f09c86f/913b9/6.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.0379746835443%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABv0lEQVR42nWQQY/SQBiG+y/hAD9BL1644FVDYjYm3DFGY2I4Us3SZYGFUlrKdFrYQgssCNlwICQcViGS8BhmcV2zenjyvTPvzPt9M9q795/48PEzY/0lA6eM5YY4ro/jBk/odHtcNS0Mo0LZqFCt1inpX3n2/AWvXr9RZ7TLWovyRZ1OXcdpW7RsH8v2/oPEtFyumjaNpqN0w3QofTEwKg1c0UebL5bcLlfMb9dE428MownD+Oae6ET8hyieEo9mqobDMZ4f0vX6Clf00L7f3XF+fo6ul9hsNuz3e/b7nyf2D+vdbsduu2W7/cHhcGAwGHB29pZ+GFOpmlxcNqk3bLRisUgymSSRSFAoFFitVozHY2azGZPJhOl0qvR6vVYNj/XIcrlU3nUYY3cC9dzjH2v5fJ5UKkU6nSaXyyGlpFQqYRiGQtd1VV3XVd5oNGKxWDBfLFRo0B9gORK74yu0Vsskm82SyWSo1aqE4TW2bSNEFyEErtvB8wSWZWGaJr0gIIoi9eRoOETIPu1jmHsK9P0engzwpM9RC08i/eC0FyAfefe+T1dIhRCSzinoYcL2o3F/67bjq65PcP6+/C9+Af9WYE3R1SxmAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Linkedup&quot;
        title=&quot;&quot;
        src=&quot;/static/977e5806b0792dcb08b410c62f09c86f/f058b/6.png&quot;
        srcset=&quot;/static/977e5806b0792dcb08b410c62f09c86f/c26ae/6.png 158w,
/static/977e5806b0792dcb08b410c62f09c86f/6bdcf/6.png 315w,
/static/977e5806b0792dcb08b410c62f09c86f/f058b/6.png 630w,
/static/977e5806b0792dcb08b410c62f09c86f/40601/6.png 945w,
/static/977e5806b0792dcb08b410c62f09c86f/78612/6.png 1260w,
/static/977e5806b0792dcb08b410c62f09c86f/913b9/6.png 1822w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;それぞれの Window で相手を検索したり、CONNECT をクリックしたり、自由に試してみましょう。
どんな操作もだいたい 2~3 秒遅れて反応すると思います。&lt;/p&gt;
&lt;h1&gt;実行環境の停止&lt;/h1&gt;
&lt;p&gt;終わったらローカル PC 上の実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: 複数のアクター&キャニスター]]></title><description><![CDATA[このページは、DFINITY の Motoko Language のチュートリアルを日本語で解説しています。 Use multiple actors 実際に使ったソースコードはGitHubからダウンロードできます。 はじめての方は先にこちらをご覧ください。…]]></description><link>https://smacon.dev/posts/motoko-multiple-actors</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-multiple-actors</guid><pubDate>Thu, 30 Dec 2021 15:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページは、DFINITY の Motoko Language のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/multiple-actors&quot;&gt;Use multiple actors&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/multiple_actors&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方は先にこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;li&gt;任意のターミナル&lt;/li&gt;
&lt;li&gt;任意のテキストエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ターミナルとテキストエディタは好きなソフトウェアを使えば大丈夫です。&lt;/p&gt;
&lt;p&gt;はじめは Mac 標準のターミナルでよいと思います。テキストエディタは筆者は Visual Studio Code を使っています。&lt;/p&gt;
&lt;h1&gt;本プロジェクトで学ぶこと&lt;/h1&gt;
&lt;p&gt;本プロジェクトでは、&lt;code class=&quot;language-text&quot;&gt;assistant&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;rock_paper_scissors&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;daemon&lt;/code&gt;の 3 つのキャニスターを作ります。
それぞれのキャニスターの処理に関連性はありません。&lt;/p&gt;
&lt;h1&gt;手順&lt;/h1&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new multiple_actors
cd multiple_actors&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;dfx.json の編集&lt;/h2&gt;
&lt;p&gt;当プロジェクトでは、3 つのキャニスターを作ります。
dfx.json を以下のように書き換えます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;canisters&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src/assistant/main.mo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;motoko&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;rock_paper_scissors&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src/rock_paper_scissors/main.mo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;motoko&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;daemon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src/daemon/main.mo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;motoko&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;defaults&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;packtool&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;dfx&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.8.4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;networks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;bind&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1:8000&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ephemeral&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;dfx.json に書いたパスに Motoko のソースファイルをコピーします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cp -r src/multiple_actors/ src/assistant/
cp -r src/assistant/ src/rock_paper_scissors/
cp -r src/assistant/ src/daemon/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コーディング&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/assistant/motoko.mo&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/Array&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Nat &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/Nat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Define the actor&lt;/span&gt;
actor Assistant &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; todos &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ToDo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; nextId &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Define to-do item properties&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ToDo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    id &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    description &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    completed &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bool&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Add to-do item utility&lt;/span&gt;
  func &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todos &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ToDo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; description &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ToDo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; todo &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ToDo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      description &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; description&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      completed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todos&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;todo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Show to-do item utility&lt;/span&gt;
  func &lt;span class=&quot;token function&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todos &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ToDo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; output &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;\n___TO-DOs___&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ToDo &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; todos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;vals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      output #&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;\n(&quot;&lt;/span&gt; # Nat&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; # &lt;span class=&quot;token string&quot;&gt;&quot;) &quot;&lt;/span&gt; # todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;description&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;completed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; output #&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; ✔&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    output
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;addTodo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;description &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    todos &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todos&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; description&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nextId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    nextId &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; query func &lt;span class=&quot;token function&quot;&gt;showTodos&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todos&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/rock_paper_scissors/motoko.mo&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;I&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/Iter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

actor RockPaperScissors &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; alice_score &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; bob_score &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; alice_last &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Choice &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; #scissors&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; bob_last &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Choice &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; #rock&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Choice&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    #rock&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    #paper&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    #scissors&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;contest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;I&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;99&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;battle_round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; winner &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The contest was a draw&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;alice_score &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; bob_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; winner &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Alice won&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;alice_score &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; bob_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; winner &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bob won&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;winner&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  func &lt;span class=&quot;token function&quot;&gt;battle_round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;alice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bob_last&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;alice_last&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#rock&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #scissors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; alice_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#rock&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #paper&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; bob_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#paper&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #scissors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; alice_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#paper&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #rock&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; bob_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#scissors&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #paper&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; alice_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#scissors&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #rock&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; bob_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#rock&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #rock&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; alice_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#paper&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #paper&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; bob_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#scissors&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #scissors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; alice_score &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    alice_last &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    bob_last &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Hard-coded players and choices&lt;/span&gt;
  func &lt;span class=&quot;token function&quot;&gt;bob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;last &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Choice&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Choice &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; #paper&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  func &lt;span class=&quot;token function&quot;&gt;alice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;last &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Choice&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Choice &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; #rock&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/daemon/main.mo&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;actor Daemon &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; running &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;launch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    running &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    debug_show &lt;span class=&quot;token string&quot;&gt;&quot;The daemon process is running&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;stop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    running &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    debug_show &lt;span class=&quot;token string&quot;&gt;&quot;The daemon is stopped&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;assistant&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;rock_paper_scissors&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;daemon&lt;/code&gt;の 3 つのキャニスターを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call assistant addTodo &apos;(&quot;Schedule monthly demos&quot;)&apos;
dfx canister call assistant showTodos
(&quot;
___TO-DOs___
(1) Schedule monthly demos&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call rock_paper_scissors contest
(&quot;Bob won&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call daemon launch
(&quot;&quot;The daemon process is running&quot;&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ローカル実行環境の停止&lt;/h2&gt;
&lt;p&gt;終わったらローカル PC 上の実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: ライブラリを使って簡単な電話帳アプリを作ろう]]></title><description><![CDATA[このページでは DFINITY の Motoko Language のチュートリアルを日本語で解説しています。 Import library modules 実際に使ったソースコードはGitHubからダウンロードできます。 はじめての方は先にこちらをご覧ください。…]]></description><link>https://smacon.dev/posts/motoko-phonebook</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-phonebook</guid><pubDate>Thu, 30 Dec 2021 06:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページでは DFINITY の Motoko Language のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/phonebook&quot;&gt;Import library modules&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/phonebook&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方は先にこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;li&gt;任意のターミナル&lt;/li&gt;
&lt;li&gt;任意のテキストエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ターミナルとテキストエディタは好きなソフトウェアを使えば大丈夫です。&lt;/p&gt;
&lt;p&gt;はじめは Mac 標準のターミナルでよいと思います。テキストエディタは筆者は Visual Studio Code を使っています。&lt;/p&gt;
&lt;h1&gt;本プロジェクトで学ぶこと&lt;/h1&gt;
&lt;p&gt;phonebook というプロジェクトで phonebook というキャニスターを作ります。
phonebook では以下の機能を実装します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;insert&lt;/code&gt;関数では、&lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt;と&lt;code class=&quot;language-text&quot;&gt;phone&lt;/code&gt;を Key-Value として&lt;code class=&quot;language-text&quot;&gt;book&lt;/code&gt;変数に格納します。&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;lookup&lt;/code&gt;関数は、指定された&lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt;キーを入力として、関連する&lt;code class=&quot;language-text&quot;&gt;phone&lt;/code&gt;を検索します。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;手順&lt;/h1&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new phonebook
cd phonebook&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コーディング&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Import standard library functions for lists&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/List&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/AssocList&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// The PhoneBook actor.&lt;/span&gt;
actor &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Type aliases make the rest of the code easier to read.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Phone&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// The actor maps names to phone numbers.&lt;/span&gt;
    flexible &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; book&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AssocList&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// An auxiliary function checks whether two names are equal.&lt;/span&gt;
    func &lt;span class=&quot;token function&quot;&gt;nameEq&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;l&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; r&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bool &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; l &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// A shared invokable function that inserts a new entry&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// into the phone book or replaces the previous one.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; phone&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Phone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newBook&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nameEq&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;phone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        book &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newBook&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// A shared read-only query function that returns the (optional)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// phone number corresponding to the person with the given name.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; query func &lt;span class=&quot;token function&quot;&gt;lookup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; async &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;Phone &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nameEq&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コード解説&lt;/h2&gt;
&lt;p&gt;本チュートリアルのタイトルにもあるようにこのプロジェクトではライブラリを使っています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/List&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/AssocList&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Name&lt;/code&gt;や&lt;code class=&quot;language-text&quot;&gt;Phone&lt;/code&gt;というオリジナルの型を定義しています。
&lt;code class=&quot;language-text&quot;&gt;Text&lt;/code&gt;型の別名として考えることもできます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Phone&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Motoko のチュートリアルで最初にここで躓く人は多いかもしれません。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;    flexible &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; book&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AssocList&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この 1 行には、これまで登場しなかった要素がいくつも登場します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;flexible var&lt;/li&gt;
&lt;li&gt;A.AssocList&lt;/li&gt;
&lt;li&gt;&amp;#x3C;Name, Phone&gt;&lt;/li&gt;
&lt;li&gt;L.nil&amp;#x3C;(Name, Phone)&gt;()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1 つずつ見ていきましょう！&lt;/p&gt;
&lt;h2&gt;flexible var&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;var&lt;/code&gt;宣言では&lt;code class=&quot;language-text&quot;&gt;flexible&lt;/code&gt;がデフォルトなので単に&lt;code class=&quot;language-text&quot;&gt;var&lt;/code&gt;と書いたのと同じ意味になります。&lt;/p&gt;
&lt;h2&gt;AssocList&lt;/h2&gt;
&lt;p&gt;AssocList は Association List の略で連想配列です。&lt;/p&gt;
&lt;p&gt;電話帳をイメージしてください。名前と電話番号がペアで、たくさんの件数が電話帳に入ります。&lt;/p&gt;
&lt;p&gt;Key-Value が複数入るようなデータ構造が連想配列です。&lt;/p&gt;
&lt;h2&gt;&amp;#x3C;Name, Phone&gt;&lt;/h2&gt;
&lt;p&gt;この記法はジェネリクスと呼ばれます。TypeScript や C++でも使われています。&lt;/p&gt;
&lt;p&gt;詳しく知りたい場合は TypeScript や C++のジェネリクスに関する解説などを参考にしてください。&lt;/p&gt;
&lt;p&gt;Name や Phone というオリジナルの型で AssocList を利用するため、このように書きます。&lt;/p&gt;
&lt;h2&gt;L.nil&amp;#x3C;(Name, Phone)&gt;()&lt;/h2&gt;
&lt;p&gt;ここでもジェネリクスが使われています。&lt;/p&gt;
&lt;p&gt;nil が予約語のように思えるかもしれませんが、これは List 型の関数名です。&lt;/p&gt;
&lt;p&gt;nil()は空のリストを返します。この例では要素の型が&amp;#x3C;Name, Phone&gt;という連想配列です。&lt;/p&gt;
&lt;h2&gt;デプロイ&lt;/h2&gt;
&lt;p&gt;ローカル実行環境を起動します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --clean&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通常は stop しても過去に作ったキャニスターは残っています。
起動時に&lt;code class=&quot;language-text&quot;&gt;--clean&lt;/code&gt;オプションを付けることで過去に作成したキャニスターは削除した状態で起動します。&lt;/p&gt;
&lt;p&gt;ビルドしてキャニスターをデプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy phonebook&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;p&gt;2 件の名前と電話番号情報を&lt;code class=&quot;language-text&quot;&gt;insert&lt;/code&gt;します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call phonebook insert &apos;(&quot;Chris Lynn&quot;, &quot;01 415 792 1333&quot;)&apos;
dfx canister call phonebook insert &apos;(&quot;Maya Garcia&quot;, &quot;01 408 395 7276&quot;)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Chris Lynn&lt;/code&gt;のデータを連想配列&lt;code class=&quot;language-text&quot;&gt;book&lt;/code&gt;の中から検索します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;phonebook % dfx canister call phonebook lookup &apos;(&quot;Chris Lynn&quot;)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(opt &quot;01 415 792 1333&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;電話番号で逆引きするとどうなるでしょうか？&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call phonebook lookup &apos;(&quot;01 408 395 7276&quot;)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;null を返します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(null)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2 人の名前を渡すとどうなるでしょうか？&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;phonebook % dfx canister call phonebook lookup &apos;(&quot;Maya Garcia&quot;,&quot;Chris Lynn&quot;)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最初に渡した名前の電話番号だけを返す実装になっています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(opt &quot;01 408 395 7276&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Candid UI&lt;/h2&gt;
&lt;p&gt;Candid UI の使い方は、当ブログのほかの記事で解説しているので割愛します。&lt;/p&gt;
&lt;h2&gt;ローカル実行環境の停止&lt;/h2&gt;
&lt;p&gt;終わったらローカル PC 上の実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;拡張&lt;/h2&gt;
&lt;p&gt;このプロジェクトでは、連想配列を DB のように扱うのでいろいろ改造してみると勉強になると思います。&lt;/p&gt;
&lt;p&gt;下記の例では Email というフィールドを追加してみました。
&lt;code class=&quot;language-text&quot;&gt;src/phonebook/main2.mo&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Import standard library functions for lists&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/List&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/AssocList&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// The PhoneBook actor.&lt;/span&gt;
actor &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Type aliases make the rest of the code easier to read.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Phone&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Email&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// The actor maps names to phone numbers.&lt;/span&gt;
    flexible &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; book&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AssocList&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    flexible &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; addressBook&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AssocList&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Email&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Email&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// An auxiliary function checks whether two names are equal.&lt;/span&gt;
    func &lt;span class=&quot;token function&quot;&gt;nameEq&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;l&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; r&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Bool &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; l &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// A shared invokable function that inserts a new entry&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// into the phone book or replaces the previous one.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; phone&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Phone&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; email&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Email&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newBook&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nameEq&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;phone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        book &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newBook&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newAddressBook&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Email&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;addressBook&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nameEq&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        addressBook &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newAddressBook&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// A shared read-only query function that returns the (optional)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// phone number corresponding to the person with the given name.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; query func &lt;span class=&quot;token function&quot;&gt;lookupPhone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; async &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;Phone &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Phone&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nameEq&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; query func &lt;span class=&quot;token function&quot;&gt;lookupEmail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; async &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;Email &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Email&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;addressBook&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nameEq&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: 簡単な数値計算をやってみよう]]></title><description><![CDATA[このページは、DFINITY の Motoko Language のチュートリアルを日本語で解説しています。 Use integers in calculator functions 実際に使ったソースコードはGitHub…]]></description><link>https://smacon.dev/posts/motoko-calc</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-calc</guid><pubDate>Wed, 29 Dec 2021 22:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページは、DFINITY の Motoko Language のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/calculator&quot;&gt;Use integers in calculator functions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/calc&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方は先にこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;li&gt;任意のターミナル&lt;/li&gt;
&lt;li&gt;任意のテキストエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ターミナルとテキストエディタは好きなソフトウェアを使えば大丈夫です。&lt;/p&gt;
&lt;p&gt;はじめは Mac 標準のターミナルでよいと思います。テキストエディタは筆者は Visual Studio Code を使っています。&lt;/p&gt;
&lt;h1&gt;本プロジェクトで学ぶこと&lt;/h1&gt;
&lt;p&gt;calc というプロジェクトで calc キャニスターを作ります。
calc キャニスターは以下の関数を持ち、四則演算を実行します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;sub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;mul&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;div&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;clearall&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;clearall&lt;/code&gt;では結果のリセットを行います。&lt;/p&gt;
&lt;h1&gt;手順&lt;/h1&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new calc
cd calc&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;プロジェクトの構成変更&lt;/h2&gt;
&lt;p&gt;dfx.json にあるソースコードのファイル名を&lt;code class=&quot;language-text&quot;&gt;src/calc/calc_main.mo&lt;/code&gt;に変更します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&quot;main&quot;: &quot;src/calc/calc_main.mo&quot;,&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デフォルトの&lt;code class=&quot;language-text&quot;&gt;src/calc/main.mo&lt;/code&gt;を&lt;code class=&quot;language-text&quot;&gt;src/calc/calc_main.mo&lt;/code&gt;にコピーします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cp src/calc/main.mo src/calc/calc_main.mo&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/calc/calc_main.mo&lt;/code&gt;を以下のように編集して保存します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// This single-cell calculator defines one calculator instruction per&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// public entry point (add, sub, mul, div).&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Create a simple Calc actor.&lt;/span&gt;
actor Calc &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; cell &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Int &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Define functions to add, subtract, multiply, and divide&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;Int&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Int &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; cell &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; cell &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;Int&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Int &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; cell &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; cell &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;mul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;Int&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Int &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; cell &lt;span class=&quot;token operator&quot;&gt;*=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; cell &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;Int&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; async &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;Int &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// null indicates div-by-zero error&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      cell &lt;span class=&quot;token operator&quot;&gt;/=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;cell
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Clear the calculator and reset to zero&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;clearall&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Int &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cell &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Int &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      cell &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; cell&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; cell
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;デプロイ&lt;/h1&gt;
&lt;p&gt;ローカルの実行環境を起動します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
Creating a wallet canister on the local network.
The wallet canister on the &quot;local&quot; network for user &quot;default&quot; is &quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;

&amp;lt;中略&gt;

Committing batch.
Deployed canisters.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;実行&lt;/h1&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;add&lt;/code&gt;関数に 10 を渡して実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;calc % dfx canister call calc add &apos;(10)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(10 : int)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mul&lt;/code&gt;関数に 3 を渡して実行します。(10 x 3)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call calc mul &apos;(3)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(30 : int)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;sub&lt;/code&gt;関数に 5 を渡して実行します。(30 - 5)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call calc sub &apos;(5)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(25 : int)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;div&lt;/code&gt;関数に 5 を渡して実行します。(25 / 5)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call calc div &apos;(5)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(opt (5 : int))&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mul&lt;/code&gt;関数に-4 を渡して実行します。(5 x -4)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;calc % dfx canister call calc mul &apos;(-4)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(-20 : int)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;clearall&lt;/code&gt;関数を実行してリセットします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call calc clearall&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(0 : int)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Candid UI を使った実行&lt;/h1&gt;
&lt;p&gt;ローカル実行環境の Candid キャニスター ID を確認します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister id __Candid_UI&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
r7inp-6aaaa-aaaaa-aaabq-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もし、実行環境が停止中なら起動します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --background&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;先程のキャニスター ID に置き換えて、以下の URL にブラウザでアクセスします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://127.0.0.1:8000/?canisterId=&amp;lt;CANDID-UI-CANISTER-IDENTIFIER&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://127.0.0.1:8000/?canisterId=r7inp-6aaaa-aaaaa-aaabq-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;calc&lt;/code&gt;キャニスターの ID を取得して、ブラウザの&lt;code class=&quot;language-text&quot;&gt;Provide a canister ID&lt;/code&gt;に入力します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;calc % dfx canister id calc&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のような画面が表示されます。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d1de890c7bae0593aa1bd086d7b051c1/06868/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 77.21518987341771%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABYlAAAWJQFJUiTwAAABN0lEQVR42qVTa0vDQBDMD1cI+EXxv6k0te2XQExaPKGQ5nWX543Mtletik3Thcnljs3ezOzGa5oGDlVVIcsylGWJYRgmwUvTFEmyRrJeY7vdgmGtFcBaSepHFmvbFt67Ugjmr1iuVniLYxhjBGRLdF2HsdH3AzytDfI8h9ZapBJFUSDLcmR5DmPqPcu+Pwte7tV1LYzoId/5scj9Fs6C/3CUTEZKfcjG3cL1xMsRwTwpOJsFuLn1EYYh4jgWpu5GWc/B5TmGfBAs5KS7synwOCpPzy/Y7XbgCH111eKSOEpeLJa4f3gUuUopORzThL+b0u0lswlONkGWkyXTN22MjAwHmfufXT4HxmAPTeFQJ0ly+DO0sCN9V3CEe6ceBsEcvn+HKIqw2Wzk8BJ2vz08+EVm13jnPPwE0IGVJD6t5F8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Candid UI&quot;
        title=&quot;&quot;
        src=&quot;/static/d1de890c7bae0593aa1bd086d7b051c1/f058b/2.png&quot;
        srcset=&quot;/static/d1de890c7bae0593aa1bd086d7b051c1/c26ae/2.png 158w,
/static/d1de890c7bae0593aa1bd086d7b051c1/6bdcf/2.png 315w,
/static/d1de890c7bae0593aa1bd086d7b051c1/f058b/2.png 630w,
/static/d1de890c7bae0593aa1bd086d7b051c1/40601/2.png 945w,
/static/d1de890c7bae0593aa1bd086d7b051c1/78612/2.png 1260w,
/static/d1de890c7bae0593aa1bd086d7b051c1/06868/2.png 1974w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;それぞれの関数をいろいろ試してみましょう！&lt;/p&gt;
&lt;h1&gt;実行環境の停止&lt;/h1&gt;
&lt;p&gt;終わったらローカル PC 上の実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: Candid UI を使ってキャニスターを実行する]]></title><description><![CDATA[このページは、DFINITY(Internet Computer) の Motoko Language のチュートリアルを日本語で解説しています。 Increment a natural number 実際に使ったソースコードはGitHub…]]></description><link>https://smacon.dev/posts/motoko-my-counter</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-my-counter</guid><pubDate>Wed, 29 Dec 2021 21:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページは、DFINITY(Internet Computer) の Motoko Language のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/counter-tutorial&quot;&gt;Increment a natural number&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/my_counter&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方は先にこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;li&gt;任意のターミナル&lt;/li&gt;
&lt;li&gt;任意のテキストエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ターミナルとテキストエディタは好きなソフトウェアを使えば大丈夫です。&lt;/p&gt;
&lt;p&gt;はじめは Mac 標準のターミナルでよいと思います。テキストエディタは筆者は Visual Studio Code を使っています。&lt;/p&gt;
&lt;h1&gt;手順&lt;/h1&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new my_counter
cd my_counter&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ソースファイル名の変更&lt;/h2&gt;
&lt;p&gt;今回は&lt;code class=&quot;language-text&quot;&gt;main.mo&lt;/code&gt;というソースファイルの名前を変えます。
&lt;code class=&quot;language-text&quot;&gt;dfx.json&lt;/code&gt;の以下の行を変更します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;変更前
&quot;main&quot;: &quot;src/my_counter/main.mo&quot;,
変更後
&quot;main&quot;: &quot;src/my_counter/increment_counter.mo&quot;,&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;そして以下のコマンドでファイル名を変更します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mv src/my_counter/main.mo src/my_counter/increment_counter.mo&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コーディング&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/my_counter/increment_counter.mo&lt;/code&gt;を以下のように編集して保存します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Create a simple Counter actor.&lt;/span&gt;
actor Counter &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  stable &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; currentValue &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Increment the counter with the increment function.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    currentValue &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Read the counter value with a get function.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; query func &lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Nat &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    currentValue
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Write an arbitrary value with a set function.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Nat&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    currentValue &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Counter&lt;/code&gt;という actor に 3 つの関数を定義しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;increment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;set&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;increment&lt;/code&gt;は&lt;code class=&quot;language-text&quot;&gt;currentValue&lt;/code&gt;を+1 します。&lt;/p&gt;
&lt;h2&gt;起動&lt;/h2&gt;
&lt;p&gt;以下のどちらかのコマンドでローカル PC で実行環境を起動します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;オプションをつけない場合、Ctrl+C で IC を停止するまで他のコマンドを実行できません。
そのため別のターミナルウィンドウで他のコマンドを実行する必要があります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --background&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--background&lt;/code&gt;をつけると起動後も同じウィンドウで他のコマンドを実行できます。&lt;/p&gt;
&lt;h2&gt;ビルド＆デプロイ&lt;/h2&gt;
&lt;p&gt;以下のコマンドでビルド&amp;#x26;デプロイを実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy&lt;/code&gt;では以下の 3 つの処理を一気に実行できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;dfx build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コンパイルされていなければコンパイルしてからデプロイをしてくれます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;my_counter % dfx deploy
Creating a wallet canister on the local network.
The wallet canister on the &quot;local&quot; network for user &quot;default&quot; is &quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;
Deploying all canisters.

&amp;lt;中略&gt;

Committing batch.
Deployed canisters.&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;get&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;increment&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;set&lt;/code&gt; の 3 つの関数を使って実行します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call my_counter get&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(0 : nat)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;初期値は 0 です。
&lt;code class=&quot;language-text&quot;&gt;increment&lt;/code&gt;を実行してキャニスターが持つ&lt;code class=&quot;language-text&quot;&gt;currentValue&lt;/code&gt;を+1 します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call my_counter increment&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call my_counter get&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(1 : nat)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;結果が 1 になっています。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;set&lt;/code&gt;を使って(987)を設定します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call my_counter set &apos;(987)&apos;
dfx canister call my_counter get&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;increment&lt;/code&gt;で+1 します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call my_counter increment
dfx canister call my_counter get&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;currentValue&lt;/code&gt;は 988 になっています。&lt;/p&gt;
&lt;h2&gt;ブラウザから実行 (Candid UI)&lt;/h2&gt;
&lt;p&gt;このプロジェクトには、Candid UI というテスト用のキャニスターがデプロイされています。
Candid UI のキャニスター ID を確認してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister id __Candid_UI&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;r7inp-6aaaa-aaaaa-aaabq-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ローカル IC にデプロイされたキャニスターの一覧は以下のファイルに保存されています。
上のコマンドで表示された__Candid_UI というキャニスターもあります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;my_counter &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; cat &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dfx&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;local&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;canister_ids&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;__Candid_UI&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;r7inp-6aaaa-aaaaa-aaabq-cai&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;my_counter&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rrkah-fqaaa-aaaaa-aaaaq-cai&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&quot;my_counter_assets&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;local&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ryjl3-tyaaa-aaaaa-aaaba-cai&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もし、dfx stop で IC を停止していたら起動しましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --background&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ブラウザを使って以下の URL にアクセスします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://127.0.0.1:8000/?canisterId=&amp;lt;CANDID-UI-CANISTER-IDENTIFIER&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;自分の環境の__Candid_UI のキャニスター ID に置き換えます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://127.0.0.1:8000/?canisterId=r7inp-6aaaa-aaaaa-aaabq-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;my_counter % dfx canister id my_counter
rrkah-fqaaa-aaaaa-aaaaq-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下のように Canister ID を入力する画面が表示されるはずです。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1b8f1558167790bcc18a67d314f510e2/e4900/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.77215189873418%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA6UlEQVR42p2Qza6CMBCFeTFzF76CcXGfjLg3vgcJL0BYiBtdiFSkQIiFlr9jZryaJhcTdZLTTtrON3PqDMMAIc5IhEB8OuGcpmiaBl3XvVTf99Ba804xjuNTDi0EtWVMi7ZtOe//zqjYhtI91U4C7YtH0ARlWbKKokBVVbgqBaUU6rqG1gbGGG5mQxkoZQ6Z50gSgWMc806FQRDA8zz4vo8wDLE/HFjbKEIm5dP+JDBNL/cHlkWakqahP6Xctkui3LbLQJpksfzF7GeOaLfjbg8b78Q/IHVZrzdw3RWyTE4++kTOVEfge+ANGLNrq90JMc8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Candid UI&quot;
        title=&quot;&quot;
        src=&quot;/static/1b8f1558167790bcc18a67d314f510e2/f058b/1.png&quot;
        srcset=&quot;/static/1b8f1558167790bcc18a67d314f510e2/c26ae/1.png 158w,
/static/1b8f1558167790bcc18a67d314f510e2/6bdcf/1.png 315w,
/static/1b8f1558167790bcc18a67d314f510e2/f058b/1.png 630w,
/static/1b8f1558167790bcc18a67d314f510e2/40601/1.png 945w,
/static/1b8f1558167790bcc18a67d314f510e2/e4900/1.png 988w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ここに my_counter のキャニスター ID を入力します。
キャニスター ID はさっき確認した&lt;code class=&quot;language-text&quot;&gt;.dfx/local/canister_ids.json&lt;/code&gt;にも書かれていますが、以下のコマンドでも表示できます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;my_counter % dfx canister id my_counter&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rrkah-fqaaa-aaaaa-aaaaq-cai&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;この ID をブラウザのフォームの&lt;code class=&quot;language-text&quot;&gt;Provide a canister ID:&lt;/code&gt;に入力します。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/728c631ec4ca08c2deddf611b0040c23/27b7a/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.93670886075949%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABTklEQVR42p1R207CQBDt3xifTPTF/9P4oPE7iN/AC2rApxob0i7QQgvt0nKRS0tv9HLMjMEniZFJTnZm9uxczipZniOKIsRxgt1ux36WZVguP2FZFobDIcPzJGzbhuu6GI/HmEwmkFIiz3MkSYKqqkCmUOBJCT8I4Hoepr7PhNVqBSEETNOEpmno9/vodruc03UdhiHgOA72+z3SNEVd198FccQOhL+sLEsGTUhvFHKKouAEdSuIUFVMIhkWiwVmsxnm8zl838d6vUYYRQySiJDx2inXUOjCdhxem09PYjSyEQQBN1BVFc1mE+12G61WC0L0oBsCg4EJg32DJSItueCxFcqyYtJ2u8Vms+EzDEPEccx5An0e4RDzyh+ahpvbO9w/PELK6b/0+013pdF4wtn5BS6vrqGq7z9T0uUpUEj055dXdDpvLPCh06kFvwAvNatpdmNUigAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Candid UI&quot;
        title=&quot;&quot;
        src=&quot;/static/728c631ec4ca08c2deddf611b0040c23/f058b/2.png&quot;
        srcset=&quot;/static/728c631ec4ca08c2deddf611b0040c23/c26ae/2.png 158w,
/static/728c631ec4ca08c2deddf611b0040c23/6bdcf/2.png 315w,
/static/728c631ec4ca08c2deddf611b0040c23/f058b/2.png 630w,
/static/728c631ec4ca08c2deddf611b0040c23/27b7a/2.png 804w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;GO をクリックすると以下のような画面表示に変わります。
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/05b477ec5bb08adb49cf82e37bd2c00c/0faf1/4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.9873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABD0lEQVR42qVTy07DMBD0N8OBG1DEr7VBQEHlDsHJiTbgxM7bdgbtohQBRXLSlUaW9jCemd0VdV2jLEuG1hp5nsMYA+89hmGYDFFVFfK8QFEUTNT3PYMIRzjngmCtg3h+iXF7d4/1wyPiVwnnPKy1jJE4tFghqSJ1BLL7oRSUUvxm2TtHMUUlW6bsuq4D5UnNQz+HgFyJKLrByekZNpsnJEnCOVLNGQoTksK37RbGlKywbdv9YOZAaG0gZcJZNU0za1V+KFytIlwurtlumqac5ZTc/hCSKhrKsVb3lr8upWK71BjHf5RCGsx30x1cnZBiwuUywvnFFeI4hpSSMyTiKWvjf6/NLsvYMiH0Iv67lE9TIEU9UPTf3AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Candid UI&quot;
        title=&quot;&quot;
        src=&quot;/static/05b477ec5bb08adb49cf82e37bd2c00c/f058b/4.png&quot;
        srcset=&quot;/static/05b477ec5bb08adb49cf82e37bd2c00c/c26ae/4.png 158w,
/static/05b477ec5bb08adb49cf82e37bd2c00c/6bdcf/4.png 315w,
/static/05b477ec5bb08adb49cf82e37bd2c00c/f058b/4.png 630w,
/static/05b477ec5bb08adb49cf82e37bd2c00c/40601/4.png 945w,
/static/05b477ec5bb08adb49cf82e37bd2c00c/78612/4.png 1260w,
/static/05b477ec5bb08adb49cf82e37bd2c00c/0faf1/4.png 1956w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;QUERY&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;CALL&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;RANDOM&lt;/code&gt; をクリックして自由に試してみましょう！&lt;/p&gt;
&lt;h2&gt;ローカル実行環境の停止&lt;/h2&gt;
&lt;p&gt;終わったらローカル PC 上の実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: パラメータを渡してキャニスターを実行する]]></title><description><![CDATA[このページは、DFINITY の Motoko Language のチュートリアルを日本語で解説しています。 Pass text arguments 実際に使ったソースコードはGitHubからダウンロードできます。 はじめての方は先にこちらをご覧ください。…]]></description><link>https://smacon.dev/posts/motoko-location-hello</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-location-hello</guid><pubDate>Wed, 29 Dec 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このページは、DFINITY の Motoko Language のチュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/hello-location&quot;&gt;Pass text arguments&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/location_hello&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方は先にこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;li&gt;任意のターミナル&lt;/li&gt;
&lt;li&gt;任意のテキストエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ターミナルとテキストエディタは好きなソフトウェアを使えば大丈夫です。&lt;/p&gt;
&lt;p&gt;はじめは Mac 標準のターミナルでよいと思います。テキストエディタは筆者は Visual Studio Code を使っています。&lt;/p&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new location_hello
cd location_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コーディング&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/location_hello/main.mo&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;actor &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; func &lt;span class=&quot;token function&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;city &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; Text &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello, &quot;&lt;/span&gt; # city # &lt;span class=&quot;token string&quot;&gt;&quot;!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;location()という関数を定義します。
location()は city という Text の引数を取り、Text を返します。&lt;/p&gt;
&lt;h2&gt;実行環境の起動&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ビルド＆デプロイ&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx deploy&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call location_hello location &quot;San Francisco&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(&quot;Hello, San Francisco!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call location_hello location Paris&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(&quot;Hello, Paris!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call location_hello location &apos;(&quot;San Francisco and Paris&quot;)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(&quot;Hello, San Francisco and Paris!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;location_hello の location 関数に、複数の都市名を渡してみましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call location_hello location &apos;(&quot;San Francisco&quot;,&quot;Paris&quot;,&quot;Rome&quot;)&apos;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;複数の都市名を渡しても、この location()関数は、city1 つしか受け取らないので、最初の引数だけが使われます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力
(&quot;Hello, San Francisco!&quot;)&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;実行環境の停止&lt;/h2&gt;
&lt;p&gt;終わったらローカル PC 上の実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Motoko プログラミング入門: はじめてのアクター]]></title><description><![CDATA[このページは、DFINITY(Internet Computer) の Motoko Language チュートリアルを日本語で解説しています。 Query using an actor 実際に使ったソースコードはGitHub…]]></description><link>https://smacon.dev/posts/motoko-actor-hello</link><guid isPermaLink="false">https://smacon.dev/posts/motoko-actor-hello</guid><pubDate>Wed, 29 Dec 2021 20:38:00 GMT</pubDate><content:encoded>&lt;p&gt;このページは、DFINITY(Internet Computer) の Motoko Language チュートリアルを日本語で解説しています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/docs/current/developer-docs/backend/motoko/define-an-actor/&quot;&gt;Query using an actor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際に使ったソースコードは&lt;a href=&quot;https://github.com/smacon-dev/motoko-tutorial/tree/main/actor_hello&quot;&gt;GitHub&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;はじめての方は先にこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hello-motoko&quot;&gt;5 ステップではじめる Motoko プログラミング入門&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;実行環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;dfx: 0.8.4&lt;/li&gt;
&lt;li&gt;macOS: 11.5.2&lt;/li&gt;
&lt;li&gt;npm version: 8.1.3&lt;/li&gt;
&lt;li&gt;任意のターミナル&lt;/li&gt;
&lt;li&gt;任意のテキストエディタ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ターミナルとテキストエディタは好きなソフトウェアを使えば大丈夫です。&lt;/p&gt;
&lt;p&gt;はじめは Mac 標準のターミナルでよいと思います。テキストエディタは筆者は Visual Studio Code を使っています。&lt;/p&gt;
&lt;h2&gt;プロジェクトの作成&lt;/h2&gt;
&lt;p&gt;新しいプロジェクトを作ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx new actor_hello
cd actor_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;不要なコードの削除&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;src/actor_hello_assets&lt;/code&gt;を丸ごと削除します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;actor_hello % rm -r src/actor_hello_assets&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;dfx.json&lt;/code&gt;から以下の部分を削除します&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;    &lt;span class=&quot;token string-property property&quot;&gt;&quot;actor_hello_assets&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;actor_hello&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;frontend&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;entrypoint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src/actor_hello_assets/src/index.html&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;src/actor_hello_assets/assets&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;dist/actor_hello_assets/&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assets&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;コーディング&lt;/h2&gt;
&lt;p&gt;エディタを使って、&lt;code class=&quot;language-text&quot;&gt;src/actor_hello/main.mo&lt;/code&gt; を編集します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Debug &lt;span class=&quot;token string&quot;&gt;&quot;mo:base/Debug&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
actor HelloActor &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; query func &lt;span class=&quot;token function&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      Debug&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello, World from DFINITY \n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;ビルド前のチェック&lt;/h2&gt;
&lt;p&gt;ビルド前にチェックしてみます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;actor_hello % dfx build --check
Building canisters to check they build ok. Canister IDs might be hard coded.
Building canisters...&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;もしエラーが出た場合は、以下のような原因が考えられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dfx.json から&lt;code class=&quot;language-text&quot;&gt;actor_hello_assets&lt;/code&gt;の部分を削除していない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--check&lt;/code&gt; オプションを付けると、一時的な Canister ID を使ってローカル環境でコンパイルを実行します。&lt;/p&gt;
&lt;p&gt;コンパイルされた WASM ファイルは&lt;code class=&quot;language-text&quot;&gt;.dfx/local/canisters&lt;/code&gt;配下に作られています。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;actor_hello % tree .dfx/local/canisters
.dfx/local/canisters
├── actor_hello
│   ├── actor_hello.did
│   ├── actor_hello.did.d.ts
│   ├── actor_hello.did.js
│   ├── actor_hello.wasm
│   └── index.js
└── idl
&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;デプロイ&lt;/h2&gt;
&lt;p&gt;ローカルの実行環境を起動します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx start --background&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--background&lt;/code&gt;オプションをつけることで、後続のコマンドを同じウィンドウで実行できます。&lt;/p&gt;
&lt;p&gt;キャニスターを登録します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister create actor_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;出力結果
Creating a wallet canister on the local network.
The wallet canister on the &quot;local&quot; network for user &quot;default&quot; is &quot;rwlgt-iiaaa-aaaaa-aaaaa-cai&quot;
Creating canister &quot;actor_hello&quot;...
&quot;actor_hello&quot; canister created with canister id: &quot;rrkah-fqaaa-aaaaa-aaaaq-cai&quot;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ビルドします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx build&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デプロイします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister install actor_hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;実行&lt;/h2&gt;
&lt;p&gt;デプロイしたキャニスターを実行しましょう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx canister call actor_hello hello&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;actor_hello&lt;/code&gt;というキャニスターの&lt;code class=&quot;language-text&quot;&gt;hello()&lt;/code&gt;という関数を call しています。&lt;/p&gt;
&lt;p&gt;dfx start を実行したウィンドウでは、以下のように出力されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[Canister rrkah-fqaaa-aaaaa-aaaaq-cai] Hello, World from DFINITY&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;停止&lt;/h2&gt;
&lt;p&gt;dfx.json があるディレクトリで以下のコマンドを実行して、実行環境を停止します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dfx stop&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Inside the Internet Computer]]></title><description><![CDATA[Medium Internet Computer Technology Achieving Consensus on the Internet Computer Chain Key Cryptography: The Scientific Breakthrough Behind…]]></description><link>https://smacon.dev/posts/inside-icp</link><guid isPermaLink="false">https://smacon.dev/posts/inside-icp</guid><pubDate>Mon, 27 Dec 2021 19:38:00 GMT</pubDate><content:encoded>&lt;h1&gt;Medium&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/dfinity/https-medium-com-dfinity-technology/home&quot;&gt;Internet Computer Technology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/dfinity/achieving-consensus-on-the-internet-computer-ee9fbfbafcbc&quot;&gt;Achieving Consensus on the Internet Computer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/dfinity/chain-key-technology-one-public-key-for-the-internet-computer-6a3644901e28&quot;&gt;Chain Key Cryptography: The Scientific Breakthrough Behind the Internet Computer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;How ICP Works&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://dfinity.org/howitworks&quot;&gt;https://dfinity.org/howitworks&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Community Conversations&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://dfinity.org/conversations&quot;&gt;https://dfinity.org/conversations&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=MulbKPwv6_s&quot;&gt;Threshold ECDSA Signing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=nl5BuiWClD0&quot;&gt;Randomness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=NXPkBkzkBZo&quot;&gt;Replicated State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xxeKGqwDi_4&quot;&gt;OPTIMIZING THE MEMORY SYSTEM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Dev Forum&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.dfinity.org/&quot;&gt;https://forum.dfinity.org/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;YouTube&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=UHA7W-8My_I&quot;&gt;Execution / Akhi Singhania&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FJE1s8ZkUyg&quot;&gt;Ingress Message Lifecycle / Yavonne-anne Pignolet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=WaNJINjGleg&quot;&gt;State Synchronization / Yavonne-anne Pignolet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mZbFhRIHIiY&quot;&gt;Certified Variables / Joachim Breitner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=vGmlfLW3scA&quot;&gt;Bootstrapping / Andrea Cerulli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=c5nv6vIG3OQ&quot;&gt;Canister Lifecycle / Bogdan Warinschi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YexfeByBXlo&quot;&gt;Message Routing / David Derler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=H7HCqonSMFU&quot;&gt;Resumption / Manu Drijvers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mPjiO2bk2lI&quot;&gt;Upgrades / Stefan Kaestle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=HOQb0lKIy9I&quot;&gt;Peer-to-Peer (P2P) / Yotam Harchol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=9eUTcCP_ELM&quot;&gt;Identity and Authentication on the Internet Computer / Bjorn Tackmann&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=gKUi-2T7tdc&quot;&gt;Non-interactive Distributed Key Generation and Key Resharing / Jens Groth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=hWnsluxmRqc&quot;&gt;Network Nervous System (NNS) / Lara Schmidt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=vUcDRFC09J0&quot;&gt;Chain Key Cryptography / Jan Camenisch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=vVLRRYh3JYo&quot;&gt;Consensus Overview / Manu Drijvers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;In-site Pages&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-overview&quot;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/inside-icp&quot;&gt;Technology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-coding&quot;&gt;Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-roadmap&quot;&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Overview of DFINITY (Internet Computer)]]></title><description><![CDATA[DFINITY(ICP) https://dfinity.org/ Internet Computer Association https://internetcomputer.org/ The Internet Computer Review https://medium…]]></description><link>https://smacon.dev/posts/dfinity-overview</link><guid isPermaLink="false">https://smacon.dev/posts/dfinity-overview</guid><pubDate>Mon, 27 Dec 2021 18:38:00 GMT</pubDate><content:encoded>&lt;h1&gt;DFINITY(ICP)&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://dfinity.org/&quot;&gt;https://dfinity.org/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Internet Computer Association&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/&quot;&gt;https://internetcomputer.org/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;The Internet Computer Review&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/dfinity&quot;&gt;https://medium.com/dfinity&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Enter the ICP Ecosystem&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/ecosystem&quot;&gt;https://internetcomputer.org/ecosystem&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;A Technical Overview of the Internet Computer&lt;/h1&gt;
&lt;h2&gt;Medium&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/dfinity/a-technical-overview-of-the-internet-computer-f57c62abc20f&quot;&gt;https://medium.com/dfinity/a-technical-overview-of-the-internet-computer-f57c62abc20f&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zHl-oVPoX88&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/zHl-oVPoX88/0.jpg&quot; alt=&quot;Technical Overview&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Genesis Launch Event&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xiupEw4MfxY&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/xiupEw4MfxY/0.jpg&quot; alt=&quot;Genesis Launch Event&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Education Center&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://internetcomputer.org/education&quot;&gt;https://internetcomputer.org/education&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Dashboard&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://dashboard.internetcomputer.org/&quot;&gt;https://dashboard.internetcomputer.org/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;In-site Pages&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-overview&quot;&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/inside-icp&quot;&gt;Technology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-coding&quot;&gt;Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/dfinity-roadmap&quot;&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Dom's Foresight]]></title><description><![CDATA[Medium https://dominic-w.medium.com/ Internet Computer <> Ethereum Integration Explained May 28, 2021 Plans for ‘Endorphin,’ a Free and Open…]]></description><link>https://smacon.dev/posts/dom-foresight</link><guid isPermaLink="false">https://smacon.dev/posts/dom-foresight</guid><pubDate>Sun, 26 Dec 2021 19:38:00 GMT</pubDate><content:encoded>&lt;h2&gt;Medium&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://dominic-w.medium.com/&quot;&gt;https://dominic-w.medium.com/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://medium.com/dfinity/internet-computer-ethereum-integration-explained-6967456e35f9&quot;&gt;Internet Computer &amp;#x3C;&gt; Ethereum Integration Explained&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;May 28, 2021&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://medium.com/dfinity/plans-for-endorphin-a-free-and-open-crypto-os-for-smartphones-and-other-end-user-devices-9ebb763a711e&quot;&gt;Plans for ‘Endorphin,’ a Free and Open Crypto OS for Smartphones and Other End-User Devices&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;May 15, 2021&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://medium.com/dfinity/how-ethereum-could-be-supercharged-by-the-internet-computer-network-afc513bf15e1&quot;&gt;How Ethereum Could Be Supercharged by the Internet Computer Network&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aug 29,2020&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://medium.com/dfinity/disentangling-dfinity-and-ethereum-dfa2151ad419&quot;&gt;Disentangling DFINITY and Ethereum&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;May 10, 2019&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://medium.com/dfinity/the-decentralized-cloud-vision-of-the-dfinity-blockchain-f68449c49be2&quot;&gt;The Decentralized Cloud Vision of the DFINITY Blockchain&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jul 25, 2017&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://medium.com/dfinity/future-governance-integrating-traditional-ai-technology-into-the-blockchain-nervous-system-825ababf9d9&quot;&gt;Future Governance? Integrating Traditional AI Technology Into the Blockchain Nervous System&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mar 21, 2017&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://dominic-w.medium.com/notes-on-protocols-suitable-for-emerging-proof-of-stake-networks-9c5f67361860&quot;&gt;Notes on protocols suitable for emerging Proof of Stake networks&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dec 2, 2016&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://dominic-w.medium.com/helo-world-im-back-blogging-ae6ceacbc1d7&quot;&gt;Helo World. I’m back blogging!&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;May 16, 2016&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Remix の使い方: Metamask でスマートコントラクトをデプロイ]]></title><description><![CDATA[この記事はこんな人におすすめ メインネットにスマコンをデプロイしたい人 自分のオリジナルトークンを作りたい人 Remix の使い方を知りたい人 Solidity の本を買ったけど、次に何をするかわからない人 じつはメインネットにスマコンを作るのは、PC…]]></description><link>https://smacon.dev/posts/remix-tutorial</link><guid isPermaLink="false">https://smacon.dev/posts/remix-tutorial</guid><pubDate>Mon, 01 Nov 2021 10:38:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事はこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メインネットにスマコンをデプロイしたい人&lt;/li&gt;
&lt;li&gt;自分のオリジナルトークンを作りたい人&lt;/li&gt;
&lt;li&gt;Remix の使い方を知りたい人&lt;/li&gt;
&lt;li&gt;Solidity の本を買ったけど、次に何をするかわからない人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;じつはメインネットにスマコンを作るのは、PC 上の開発環境に作るより簡単です！&lt;/p&gt;
&lt;p&gt;作業はすべて Remix という Web サービスを使うので、ブラウザさえあれば誰でも進められます。&lt;/p&gt;
&lt;p&gt;Remix にコードをコピペしてボタンを 2, 3 回クリックすればなんとスマコンは完成します！&lt;/p&gt;
&lt;p&gt;基本的に Remix は無料で利用できます。&lt;/p&gt;
&lt;p&gt;Remix の作業に必要な３ステップさえ覚えれば、本物のブロックチェーンにオリジナルトークンも作れるようになるのでやってみよう！&lt;/p&gt;
&lt;h1&gt;はじめに&lt;/h1&gt;
&lt;h3&gt;必要となるツール&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Metamask&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;利用するネットワーク&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ropsten (Ethereum のテストネット)&lt;/li&gt;
&lt;li&gt;Binance Smart Chain (メインネット)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ブロックチェーンにスマートコントラクトをデプロイするために、Remix と Metamask を使います。&lt;/p&gt;
&lt;p&gt;Remix は無料で利用できますが、ブロックチェーンのメインネットにデプロイするにはそのチェーンの利用料(Transaction Fee)がかかります。&lt;/p&gt;
&lt;p&gt;BSC(Binance Smart Chain)ならだいたい数十円ぐらいです。(2021 年 5 月現在)
もし BNB という仮想通貨を持っていない場合は、Ethereum のテストネット Ropsten にデプロイしましょう。Ropsten のようなテストネットなら Fee はもらえます。&lt;/p&gt;
&lt;p&gt;注意：Metamask の開発に使うアカウントは仮想通貨トレードに使うアカウントとわけてください。
誤って高額な Transaction Fee がかかったり、大事な秘密鍵を間違ったトランザクションに使ったりすることを防ぐためです。&lt;/p&gt;
&lt;h1&gt;Remix&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2e4cbeb676015a0415ac10e3fc4a966c/21b4d/remix.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABrklEQVR42m3Ry47TMBgF4LwJxLGT2I6vsXN3nEvTtFSVKirYwBsgtuzYsucleE6UyVBAM9Inywsf+fh3wMVg7BGT7m2Yx0kj5MR4TzJH6EabBVOX4jZJm2dJnRBXt9cPyz2o22vnbrlZpT4IOWHWD7ev4/1HnNZSH/rhbsuz1AsTI2V+k/VUzuu7T+/9JSiryzB9VHpRZhVqBpH5/O3nl++/ALBMjK27Vc1V5QtlnmT9M+pQ2kDcBZg4Y08A2jehDiOLSYfFSMVIaMflXDdXLifK+r/JJ08t+kDI2RZnFFchMCCyXI7GHnNzIJkntKds+OdOj+m2/tEHSi9cTBEsQGRBZDM+1O1Fm6MpTkLNTExMjCpfbHmmzGtzzPiwdeEDYT6IkzpO6j0ZwYIyz8TIxCjUJNRkitUUa27XvFgJdUwMmHSU+e0LSBeEwOyFQWRDYFLcKr0YexJyJtRlzCdpg+IqgsXeDqJtD1EZwSLYYw8ornR+lOog5MzFlLGBb8PrMelS3EFUxkmN4grFFUTlf+EQmIx5W5wJdftz9l4P+5mHFzcndZI2EJW7xyBf9Ruu8oD4uf21GQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/2e4cbeb676015a0415ac10e3fc4a966c/f058b/remix.png&quot;
        srcset=&quot;/static/2e4cbeb676015a0415ac10e3fc4a966c/c26ae/remix.png 158w,
/static/2e4cbeb676015a0415ac10e3fc4a966c/6bdcf/remix.png 315w,
/static/2e4cbeb676015a0415ac10e3fc4a966c/f058b/remix.png 630w,
/static/2e4cbeb676015a0415ac10e3fc4a966c/40601/remix.png 945w,
/static/2e4cbeb676015a0415ac10e3fc4a966c/78612/remix.png 1260w,
/static/2e4cbeb676015a0415ac10e3fc4a966c/21b4d/remix.png 1280w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://remix.ethereum.org/&quot;&gt;https://remix.ethereum.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;なんだか難しそうな画面がでてきます。でも、まだ閉じないで！&lt;/p&gt;
&lt;p&gt;Remix の使い方を全部理解する必要はありません。スマコンのデプロイに必要な場所は３箇所だけです。&lt;/p&gt;
&lt;p&gt;一番左のところを見てください。使うのは上から３つのアイコンです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FILE EXPLORERS&lt;/li&gt;
&lt;li&gt;SOLIDITY COMPILER&lt;/li&gt;
&lt;li&gt;DEPLOY &amp;#x26; RUN TRANSACTIONS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FILE EXPLORERS&lt;/h2&gt;
&lt;p&gt;１番上は FILE EXPLORERS、
コードを書く場合に使います。コードは 100%コピペで大丈夫です。&lt;/p&gt;
&lt;h2&gt;SOLIDITY COMPILER&lt;/h2&gt;
&lt;p&gt;上から２番目がコンパイラです。プログラムをコンパイルしてスマートコントラクトコードを作ります。人間が読み書きできるテキストコードから機械が処理するコードに変換します。&lt;/p&gt;
&lt;h2&gt;DEPLOY &amp;#x26; RUN TRANSACTIONS&lt;/h2&gt;
&lt;p&gt;３番目はデプロイする画面です。コンパイルしたスマコンをブロックチェーン上にデプロイします。デプロイするときには Metamask を使います。&lt;/p&gt;
&lt;p&gt;それでは実際に Remix を使ってスマコンを作っていきましょう！&lt;/p&gt;
&lt;h1&gt;スマートコントラクトの作成&lt;/h1&gt;
&lt;h2&gt;コーディング（コピペ OK）&lt;/h2&gt;
&lt;p&gt;今回はもっともシンプルなコードを使います。おなじみの Hello World です。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.4.22&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.9.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HelloWorld&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;pure&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello World&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;まず FILE EXPLORERS を開いて、contracts ディレクトリの下に New File を作ります。ファイル名は HelloWorld.sol にします。&lt;/p&gt;
&lt;p&gt;ファイルを作ったらさっきのコードをコピペしましょう。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/714c2e89040a387f13157e55a586fa6c/21b4d/remix-5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.9746835443038%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAABHElEQVR42o2Qy26DMBRE+RT8wAYM5mFsA7Z5JiFpG9p0k13//zMqglp1VUU6msVIozt3PFEddH0uytkHwgcCBzqOHUu6YVilPIhycv1qurWojphoiCXCCmEJH3hSnSu51M0rDdudMDIs7XNuRd6V3LJ8JOlA+YhIDaAAUAIoIdrwbPfu+g+pzwnv02xIs4Hnc5ZPvFqkeavd9Xi6amUYrXjc0KTPSpNlzXYcVd5y+Rqnu26uxt6MvVn3WYolK+aUT1Fko2RI+BgxR2gbUIOpJaEhoUFBi4LWmw53pV+K8hRGdofQNmYObyW3hj7YFCAFkII/uuM17frImH0wHwiAZMQcDvT+2D94Ul1Y0gFY/VoIq2fDCCsc1H+t58PfaN9ZLwXrX2YAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/714c2e89040a387f13157e55a586fa6c/f058b/remix-5.png&quot;
        srcset=&quot;/static/714c2e89040a387f13157e55a586fa6c/c26ae/remix-5.png 158w,
/static/714c2e89040a387f13157e55a586fa6c/6bdcf/remix-5.png 315w,
/static/714c2e89040a387f13157e55a586fa6c/f058b/remix-5.png 630w,
/static/714c2e89040a387f13157e55a586fa6c/40601/remix-5.png 945w,
/static/714c2e89040a387f13157e55a586fa6c/78612/remix-5.png 1260w,
/static/714c2e89040a387f13157e55a586fa6c/21b4d/remix-5.png 1280w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Solidity のコンパイル&lt;/h2&gt;
&lt;p&gt;これでコードは完成です。つぎはコンパイルです。&lt;/p&gt;
&lt;p&gt;上から２番目のアイコンの SOLIDITY COMPILER を開きます。
開いたら「Compile HelloWorld.sol」をクリックします。&lt;/p&gt;
&lt;p&gt;これでスマコンの出来上がり！
なんかあっけないですね&lt;/p&gt;
&lt;h2&gt;ブロックチェーンにスマコンをデプロイ&lt;/h2&gt;
&lt;p&gt;最後にデプロイです。上から３番目のアイコンの
DEPLOY &amp;#x26; RUN TRANSACTIONS を開きます。
CONTRACT のところに HelloWorld が表示されていることを確認しましょう。これはさっきコンパイルした HelloWorld コントラクトです。&lt;/p&gt;
&lt;h2&gt;ENVIRONMENT を Injected Web3 に変更する&lt;/h2&gt;
&lt;p&gt;ここからが大事なポイントです。
ENVIRONMENT を変更します。デフォルトでは「JavaScript VM」になっていますが、Metamask を使うためにここを「Injected Web3」に変更します。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d16eacdee264219ba8e7310f015dd855/ea7fb/remix-8.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 93.67088607594937%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAAAsTAAALEwEAmpwYAAADF0lEQVR42m2S2Y7bNhSG/Rodj22J2kXtJLVSm2Wt3pcZj8eTZBL0okBylau2932Ivm0hK3CBIMAH4hDgB53z64xguFNgzPNuGC2TdOMHnee3rtdEdOn5bRB2QdjReB3eTpqsEV6YVmE7JQvQyPr+rxIdeA5n+b6sntNsm6TbeXEoq6ck3cbJtqqf2+6S5fs42VT1cxh1CNfEbRmAR1p2VvQUADydWQ9j7eFRHz8aD2P9YaxNZ9Z0Zk+m1mRiTmf2re6LGePMGEeUgpEs+7ISCaJrO3le7MrmqayO82JXFDvLTqFONZ3qt3MAahHgCQuwIPojmqxULRZE1w+a/eH9+PR5d/h4PH1eri62k0Ptf61Hi3QrVfRMlAJe8EZ+1EE9ESUvy3eb3Yf9/tN6fV1v3pari2Vnmh7/+OANTYsMK1WtuaxEvawoVJJCUfJcr7pe/zidvuwP76enL+eX3x1c6L0c3+UBwLsMi/q2i+4IUQ4AUmFkGImmU9PKDDORlUCUXUF0BZHwAuEFfAdwGHCkD4weTu5qx0wc3co1I1NUauNaUuj40ZixaAiWBf1rFmAW4BnjMCxiAe5l4jaSHAGOEK9tl29Vc0nzQ9Nd6/a1rF+q5lLWL0G0RqT2wpWsRKa9MKxCGAL78+9/JKWXEa7r9nVRnbP5aVGdy/plUZ2r5lI1l5BuHFy5fifJoaxS01rwgtfLupkrkAKOQC2VlUhRKdMvjDOd9Q0PBeAIx7uAI4AjDIuGtvvAoFVwEuV410YLhCsHV6oWqzBWtUSFMdQSSQ4H7Sd6+a9P+/dl8dsERfHmcv32+vb1+uFbkh38cBVE65BudDNnWPRrOffiIkinLDHMHJEakxqR2rTmhpkbZm7e9mFI+xdyMj8MbUM90fSUBXgytYbB7uMN3LXhetvteKlCynLEC7oo3jq4QqRGuBrApFZhjHDpBUvLWdiotNGCeK0kh7f1hLECYxbgiG7S/Ei81guWd/xwBbWkai7L9UfsNn64cv2OJntZpb283V2HXyWIviAFohz+BC/6HO9yvNs/+IE3zPwfhCzuT9ofPiUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/d16eacdee264219ba8e7310f015dd855/f058b/remix-8.png&quot;
        srcset=&quot;/static/d16eacdee264219ba8e7310f015dd855/c26ae/remix-8.png 158w,
/static/d16eacdee264219ba8e7310f015dd855/6bdcf/remix-8.png 315w,
/static/d16eacdee264219ba8e7310f015dd855/f058b/remix-8.png 630w,
/static/d16eacdee264219ba8e7310f015dd855/ea7fb/remix-8.png 788w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;これで Metamask を使う設定になりました。&lt;/p&gt;
&lt;p&gt;Metamask はネットワーク設定で接続先のブロックチェーンを切り替えることができます。&lt;/p&gt;
&lt;p&gt;Remix からデプロイを実行すると Metamask が現在つないでいるブロックチェーンのネットワークにデプロイできます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;MetamaskでBSCを選択　→　RemixからBSCへデプロイ
MetamaskでRopstenを選択　→　RemixからRopstenへデプロイ
MetamaskでGanacheを選択　→　RemixからPC上のGanacheテストネットにデプロイ&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Ropsten へのデプロイ&lt;/h2&gt;
&lt;p&gt;まずは、Ethereum のテストネット Ropsten にデプロイしてみましょう。&lt;/p&gt;
&lt;p&gt;デプロイ時には Transaction Fee が必要になります。もしテストネットの ETH を持っていない場合は先に入手しましょう。&lt;/p&gt;
&lt;h2&gt;デプロイ前の３つの確認事項&lt;/h2&gt;
&lt;p&gt;以下の３点を確認しましょう&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remix の ENVIRONMENT が Intected Web3 になっていること&lt;/li&gt;
&lt;li&gt;Metamask のネットワークが Ropsten になっていること&lt;/li&gt;
&lt;li&gt;Metamask アカウントに ETH 残高があること&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：もし、誤って本番ネットワークが選択されている場合は、Transaction Fee として本物の仮想通貨を消費します。必ずダブルチェックしましょう。&lt;/p&gt;
&lt;h2&gt;Remix を使ったスマートコントラクトのデプロイ&lt;/h2&gt;
&lt;p&gt;確認できたら Deploy をクリックします。&lt;/p&gt;
&lt;h2&gt;Gas 代の確認&lt;/h2&gt;
&lt;p&gt;Metamask の確認画面が表示されます。
新しいコントラクトのデプロイを選択中のネットワークに対して実行します。&lt;/p&gt;
&lt;p&gt;Gas 代を確認して「確認」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/22674c0e685492ab2b3c92ecc1c1db6f/remix-10.gif&quot; alt=&quot;remix&quot;&gt;&lt;/p&gt;
&lt;h2&gt;トランザクションの確認（新しいスマートコントラクトの作成）&lt;/h2&gt;
&lt;p&gt;Remix のデプロイ画面の右下の動いているログの中に Ropsten の Etherscan へのリンクがあります。そのリンク先を開くと、トランザクションのステータスがわかります。&lt;/p&gt;
&lt;p&gt;Success になっていれば成功
Pending はまだ処理中
Failed は失敗&lt;/p&gt;
&lt;h3&gt;Etherscan (Ropsten)&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5b21f892675ac00f3dfbbd79c5c87d29/21b4d/scan-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.16455696202532%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABT0lEQVR42nWSaU4jQQyF+/5HmlMMEvkxC6AQQjOk0117efcoTUiEgCfLckn1yfarGra7McQsXymX0ntvrdfaamultNoBiUz5X+g/NtOwfx5fXg9IJKrMwnINEb0USFSRG3IHBMSOVICGJbWaCwEykYiqu5qpmZmbu5mruYiKniRyzUg0pHmpy6y9KYIQ1uOxlFJqyTHmEN4yM/snMctQW1v7mLtDmKftHeSE0yv8/QX3f+Bp229vJKfTFB+DRYYQwhl1R+L5cEgppd1ju/3Jd791t5XNjX4Ht951hdezhgpLxaXi8WmszyOFhebpM3mGAcDd9dyZpiVmkIKaUIt4AexM38IhBED0CzxNMcZ3h07b2PtcX8GpEstqmRFRiDGlREQXV+1a2EVuRszDfnwJManZ6ZOIlFprxwKSO+dOKeeQUkPe7MvD1NyN1zd/u/wf5pOAtynwK+kAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/5b21f892675ac00f3dfbbd79c5c87d29/f058b/scan-1.png&quot;
        srcset=&quot;/static/5b21f892675ac00f3dfbbd79c5c87d29/c26ae/scan-1.png 158w,
/static/5b21f892675ac00f3dfbbd79c5c87d29/6bdcf/scan-1.png 315w,
/static/5b21f892675ac00f3dfbbd79c5c87d29/f058b/scan-1.png 630w,
/static/5b21f892675ac00f3dfbbd79c5c87d29/40601/scan-1.png 945w,
/static/5b21f892675ac00f3dfbbd79c5c87d29/78612/scan-1.png 1260w,
/static/5b21f892675ac00f3dfbbd79c5c87d29/21b4d/scan-1.png 1280w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;デプロイが成功したらスマコンを実行してみましょう。&lt;/p&gt;
&lt;h2&gt;スマコンの実行確認(Ropsten)&lt;/h2&gt;
&lt;p&gt;DEPLOY &amp;#x26; RUN TRANSACTIONS の左下に Deployed Contracts という場所があります。デプロイが正常に完了していれば、ここに HELLOWORLD コントラクトがあるはずです。&lt;/p&gt;
&lt;p&gt;HELLOWORLD を開くと「get」というボタンが出てきます。&lt;/p&gt;
&lt;p&gt;この get はあなたが作ったスマートコントラクトの命令です。&lt;/p&gt;
&lt;h2&gt;HelloWorld コントラクトの get()ファンクション&lt;/h2&gt;
&lt;p&gt;今回使っている HelloWorld のコードをもう 1 回見てみましょう。
コードの中で get というファンクションを作っています。ファンクションとはスマートコントラクトに対する命令のことです。メソッドや関数とも言います。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ts&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-ts line-numbers&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; pure &lt;span class=&quot;token function&quot;&gt;returns&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; memory&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello World&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;今回あなたが作ったのは、get()を実行すると”Hello World”という文字を返すファンクションを持つスマートコントラクトだったのです。&lt;/p&gt;
&lt;p&gt;Remix で get ボタンを押してみましょう。Gas 代はかかりません。&lt;/p&gt;
&lt;p&gt;すぐ下に string: Hello World という文字が表示されています。
あなたがデプロイしたスマートコントラクトから返された文字です。&lt;/p&gt;
&lt;p&gt;このスマコンは Ropsten ブロックチェーン上にあるので、Remix 以外の web3.js からでももちろん実行することができます。&lt;/p&gt;
&lt;p&gt;ここまで到達したあなたなら、コピーするコードを変えるだけでどんなスマコンでも作ることができます！&lt;/p&gt;
&lt;p&gt;最後に BSC(Binance Smart Chain)へのデプロイを説明します。&lt;/p&gt;
&lt;h1&gt;BSC へのデプロイ&lt;/h1&gt;
&lt;p&gt;Ropsten のときとやることは同じです。
変わるのは Metamask の接続先のネットワークだけ。&lt;/p&gt;
&lt;h2&gt;Metamask のネットワーク設定&lt;/h2&gt;
&lt;p&gt;すでに BNB を持っているあなたは Metamask に BSC の設定が入っていると思いますが、一応設定を Metamask 用のネットワーク設定を載せておきます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-text line-numbers&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Binance Smart Chain
https://bsc-dataseed.binance.org/
56
BNB
https://bscscan.com/&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;デプロイ前の 4 つの確認事項&lt;/h2&gt;
&lt;p&gt;Remix の DEPLOY &amp;#x26; RUN TRANSACTIONS 画面では、以下の 4 点を確認しましょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remix の ENVIRONMENT が Intected Web3 になっていること&lt;/li&gt;
&lt;li&gt;Remix の CONTRACT で HelloWorld が選択されていること&lt;/li&gt;
&lt;li&gt;Metamask のネットワークが BSC になっていること&lt;/li&gt;
&lt;li&gt;Metamask アカウントに BNB 残高があること&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それでは Deploy をクリックしましょう。&lt;/p&gt;
&lt;h2&gt;デプロイ時の注意事項&lt;/h2&gt;
&lt;p&gt;メインネットにデプロイするときは、Metamask の確認画面で必ず高額な Gas 代を払っていないことを確認しましょう。&lt;/p&gt;
&lt;p&gt;トランザクションが混雑している場合に、一時的に Gas 代が高騰したり、誤って Gas 代の高い Ethreum のメインネットを選択していたら、10 倍以上の仮想通貨を消費してしまうことも起こります。&lt;/p&gt;
&lt;p&gt;メインネットで作業するときは必ずダブルチェックしましょう。&lt;/p&gt;
&lt;h2&gt;デプロイのステータス確認&lt;/h2&gt;
&lt;p&gt;デプロイが成功したかどうか確認します。&lt;/p&gt;
&lt;p&gt;Ropsten にデプロイしたときは、Remix の右下にあるログの URL から Ropsten のサイトに飛んで確認しました。今回は BSC のメインネットなので、BscScan というサイトで確認できます。&lt;/p&gt;
&lt;p&gt;Metamask のアクティビティから BscScan のサイトへ飛んでみましょう。&lt;/p&gt;
&lt;h2&gt;BscScan（エクスプローラ）を使った確認&lt;/h2&gt;
&lt;p&gt;BscScan のサイトの中身は Ropsten のときの Ethersacn と同じです。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/bc3a73420afbfb1623127d4f58f2b542/21b4d/scan-2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.89873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABNUlEQVR42m1Ry24cMQyb//+loof+QU8N2lMSoEj2lbEtS6IkP4qZ7W7RJAQPhiyCNL0cX38/Pj2x6PwMAggcMAUUMLPe25z9ZZWHF1pKocPxeDxdWE3grFbVRCEKVShcLQCDmbt/f85fHy7ffr59+XH+9UpLIk25rCnlisxeJEhdFLwro/Vo3aO5N49gOImTehEnsaUwTmsRkb85VXIptXIlLkRENRcy9znn+P9F7rGIKID7XTYrgLtHa733aG07jDH2hTs3cbSFRanWeZsKfE1lTXkzNLuajA/8J8Ztac5ZWA5ZzmSHrOeyVSjQ8dlHRLRFgYi4j1iEiFsffcw25l5Y28zHxvdiEj29ZfO4xmORlNK1hY94HxseFm1vZ4OZsSgjZCcramX3eL7o41nmHLfF7hF/ADkuR0/AsRc9AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/bc3a73420afbfb1623127d4f58f2b542/f058b/scan-2.png&quot;
        srcset=&quot;/static/bc3a73420afbfb1623127d4f58f2b542/c26ae/scan-2.png 158w,
/static/bc3a73420afbfb1623127d4f58f2b542/6bdcf/scan-2.png 315w,
/static/bc3a73420afbfb1623127d4f58f2b542/f058b/scan-2.png 630w,
/static/bc3a73420afbfb1623127d4f58f2b542/40601/scan-2.png 945w,
/static/bc3a73420afbfb1623127d4f58f2b542/78612/scan-2.png 1260w,
/static/bc3a73420afbfb1623127d4f58f2b542/21b4d/scan-2.png 1280w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Success になっていれば、あなたのスマコンが Binance Smart Chain にデプロイされています。
これでもう、あなたは Web3 エンジニアです！&lt;/p&gt;
&lt;h2&gt;スマートコントラクトの実行&lt;/h2&gt;
&lt;p&gt;最後にデプロイしたスマコンを実行してみます。Ropsten のときと同じように Remix の DEPLOY &amp;#x26; RUN TRANSACTIONS から実行します。&lt;/p&gt;
&lt;p&gt;対象のネットワーク設定には Metamask の設定を使います。
Deploy のときと同じように以下の 2 点を確認します。&lt;/p&gt;
&lt;p&gt;ENVIRONMENT が Injected Web3 になっていること
Metamask のネットワークが BSC になっていること&lt;/p&gt;
&lt;p&gt;左下の Deployed Contracts で HelloWorld スマコンを選んで get をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/787b5e9fc4cc75365f3f36ad433b4eda/38cea/remix-13.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 95.56962025316456%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAAAsTAAALEwEAmpwYAAACXElEQVR42n2S2W6bQBiF/SSpF4xhdoZZ2MdgbMBLkiZR5FRKq6hSparqXXrTXOSmee8KsJIom/RpdAbmaH4OZ2BN9Wgsjj55PcORfzTkneajsRhP5Jv0rwbjiYQoOz65rpt9VV3mxdmqumzWV8vVBYDJcPSGfzjilJWELQbWVE/tgPulxxeU5QhnmBjKcublU1u3py31aJtYatJuheMmthMNpnaAaE7YgvGS8ZKLiosV85eMl76qhaoZL6VuuKyEqjHNpd7ocAexwbRob6a8FLrW4UYF6zDe9UKqwxNfVkG0VeE6iLfUK4LoWIU74i24qNqbZ27suNHMecJxIwckj7QHOuHCtAfAdObGrRlgg7wSeaVLC0CLXkNsAMp6nusD2LgwHVgTydLz+c19en23+/Ww+fkv+3pnvt0R2bggeel5hguTzhx/zq7/Rvvbs98PzY/7cH+bfPmD+KofHsD0XfPUDlyUQZpTf+ngOealr2tPVlxUnr/kYoXIHKD0fTNMHBAzb4HJXKoqjHdS1UG87cMnrHDhR+Y2wC7S2Hai6Szs1z7kPrAXuDB1QGdGZC5UJXWtguZx1WHDxRKR+WsnQJlQDUBmMLG01HWzvqrq/e7kumr2p2c3x6ffzi++54tzAN+MKvVlDZFpG0ZYocMNF+3XQmz6gW0net6Kjie/A7qxLVu3Y+ta6qZvMmHFa7g391nG6AHhGYTS9mZM877GKljrcPOaINrGwRKiNFOmCEwoDCWGkXRgHQKrfVl9QCAXnKWKG82N7KAkPfyqD2p4qDfKEM4gbgXErXZB8h8Qgu58n3AK0wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/787b5e9fc4cc75365f3f36ad433b4eda/f058b/remix-13.png&quot;
        srcset=&quot;/static/787b5e9fc4cc75365f3f36ad433b4eda/c26ae/remix-13.png 158w,
/static/787b5e9fc4cc75365f3f36ad433b4eda/6bdcf/remix-13.png 315w,
/static/787b5e9fc4cc75365f3f36ad433b4eda/f058b/remix-13.png 630w,
/static/787b5e9fc4cc75365f3f36ad433b4eda/38cea/remix-13.png 678w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[【コピペで OK】オジリナル仮想通貨のつくり方（ERC20）]]></title><description><![CDATA[この記事はこんな人におすすめ オリジナル仮想通貨を作りたい人（非エンジニア向け） Solidity…]]></description><link>https://smacon.dev/posts/original-token</link><guid isPermaLink="false">https://smacon.dev/posts/original-token</guid><pubDate>Thu, 22 Apr 2021 10:38:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事はこんな人におすすめ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オリジナル仮想通貨を作りたい人（非エンジニア向け）&lt;/li&gt;
&lt;li&gt;Solidity の本を買ったけど、次に何をするかわからない人&lt;/li&gt;
&lt;li&gt;ブロックチェーンの仕組みを知りたい人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自分だけのオリジナル仮想通貨を本物のブロックチェーンのメインネットに作ってみましょう。&lt;/p&gt;
&lt;p&gt;Binance Smart Chain というブロックチェーンに作りますが、Metamask で繋がるブロックチェーンなら同じ方法で作れます。&lt;/p&gt;
&lt;p&gt;Metamask が使えるチェーン&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ethereum&lt;/li&gt;
&lt;li&gt;Polygon&lt;/li&gt;
&lt;li&gt;Fantom&lt;/li&gt;
&lt;li&gt;Aavalanche
など&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当記事は開発者向けではなく、非エンジニアでも作れるように説明します。
コードは 100%コピペすれば OK です。&lt;/p&gt;
&lt;p&gt;エンジニアの方にはこちらの記事がオススメです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/hardhat&quot;&gt;Hardhat の使い方: 初心者向けのスマートコントラクト開発&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;それではさっそく始めましょう！&lt;/p&gt;
&lt;h3&gt;免責事項&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;当記事では、本物の仮想通貨を使用する情報を掲載していますが、当記事の情報によって起きるいかなる結果にも筆者は責任を負いません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;はじめに&lt;/h1&gt;
&lt;p&gt;利用する Web サービス（無料）
&lt;a href=&quot;https://remix.ethereum.org&quot;&gt;https://remix.ethereum.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;必要なもの&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metamask&lt;/li&gt;
&lt;li&gt;0.01 BNB ぐらい（日本円で数百円ぐらい）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意
スマートコントラクトのデプロイには、専用の Metamask 環境を用意しましょう。仮想通貨のトレードに使うウォレットとわけましょう。&lt;/p&gt;
&lt;p&gt;今回の作業では Metamask を使って Binance Smart Chain（以降 BSC と表示）のメインネットに接続します。&lt;/p&gt;
&lt;p&gt;本番のメインネットにスマートコントラクトをデプロイするには、Transaction Fee が必要です。BSC なら 0.01 BNB ぐらいあれば足りると思います。&lt;/p&gt;
&lt;p&gt;作業前の前提として以下の準備が必要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metamask から Binance Smart Chain に繋いでいること&lt;/li&gt;
&lt;li&gt;Metamask の BSC のアカウントに 0.01 BNB 以上持っていること&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Binance Smart Chain 上の BNB を入手したり送金する方法は当記事では解説しません。&lt;/p&gt;
&lt;h1&gt;Remix でスマートコントラクトを作る&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/cf0eb955f8a2672a4f22cbfcbd23771f/5a190/remix-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.89873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABY0lEQVR42n3P22qkQBAG4H6TaB/tk632ScdDZxwVMxCS67z/gyw6s0tIYOG7KKqo4i+g47t1a2jfhBwJ67gcnVu9XSq7ynphfIA45tD/kOWOFT0IfontvXGbVJNUk5BpTOv7x/b5ue1bP18vy9bfbl1K8YdpCqCukjGzLq8vWZPlFpFWm16XXpehLENpYmnO4hdjIgg2hXhf1i/ndut2pRMi7Uvun7L/Aaa6NvbIjHBAOFDWUdZB5BD2B+TgX+gXwOXY2E3IEeGY5ZbQlokek3ig7ePWP4S23wHKOlPNId4J7SDylHVKJ11eq3qROpl6rprF1LNpbkKNtLiwb0AhBkyiD/uZPELkpZp8eHN+1+Wr0knpVPBnFoTDMxQOGAfA+KXgQ2M3yi4QeYg8F0NjV6WTVBMXQyEGLkcuBi4Gcj5CaHcWLRBypOzYR/jYzKGzbmvsxsV4jrocusfRhxy6RyeH7g9PDXASYKrUlQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/cf0eb955f8a2672a4f22cbfcbd23771f/f058b/remix-1.png&quot;
        srcset=&quot;/static/cf0eb955f8a2672a4f22cbfcbd23771f/c26ae/remix-1.png 158w,
/static/cf0eb955f8a2672a4f22cbfcbd23771f/6bdcf/remix-1.png 315w,
/static/cf0eb955f8a2672a4f22cbfcbd23771f/f058b/remix-1.png 630w,
/static/cf0eb955f8a2672a4f22cbfcbd23771f/5a190/remix-1.png 800w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Remix はスマートコントラクトの Web 型の開発環境です。
&lt;a href=&quot;https://remix.ethereum.org/&quot;&gt;https://remix.ethereum.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;コードを書いたり、コンパイルしたり、ブロックチェーンにデプロイしたりできます。&lt;/p&gt;
&lt;p&gt;今回使うコードは用意してあるので 100%コピペで大丈夫です。&lt;/p&gt;
&lt;p&gt;Remix で使うのは以下の 3 箇所です。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e60a9d8161263ef0f595898a7d692634/5a190/remix-2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.39240506329114%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAACVklEQVR42iWPSW7TUABAfZMktuPh/3j29/hnT7FjO2lKmzIoiigVCCirLrgC4ghchVtwBC6CWqSnt3i7p6zJGwBJXtRJ2pWYQxi5HsoLnKSE8Y6QiuCSMlk3oh9EiTs/qAwz/49ydTMdr/thHNJ87IdeSImJbLqacS6bqmS1vPla9/3tLT9f6v3hRtanONkGYRPGrfLl88B4lxdXWbGzADEsYtnEBNQGGKCxe/f96ecft7jXtFQ3WRj3mB6zYnQ84fpSebi0445StgUQa3qkabG+jjU9Ag6BVnx6+vHr91+UHqK4DCKWl13VXBV4TvMxTrbK3ZsuCPO8GGS1q2uGMSYUc4G7nk0Tb+fdeHp7uq3vXstpFo/f5sfH2Q+lDYkNiXJom/3Mmu48Th8IPWb5WJT7KO4sUIINNa3CMBLoEOhQ6NA4abKi98MabJ6L4rjC8+mwGwDk+jpfLOOVihZLZJhlhLZJNmTFFEataWMbUsMiuoEtQCxATZsoaV4Vpey6reshAOONk8BN4vmJ45YvhyMTuyRrUVqHsUhSRrlAKROSV1WliIqfz/xyma+O/HQn2hanWSZlLipOmBynoWmbAvNhPI7TsD909w/761fT5X3/8dNesQBZqWlezFk+bxyhatliiRbL2LAwdPiLheMJw8I2JF5Qu37th40X1l5QK9ChKzVyPYmSraqhlRqpGtL0Z1xPhFETRk0Ud15Q2TaGkMIN1fRE09ByFSlgQ1UNrY0sy8c0GwCk+jpVNaRqCECapEOMtijpw6jZOMz1pRdUridcTxhm8Q+lLai06cDwnQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/e60a9d8161263ef0f595898a7d692634/f058b/remix-2.png&quot;
        srcset=&quot;/static/e60a9d8161263ef0f595898a7d692634/c26ae/remix-2.png 158w,
/static/e60a9d8161263ef0f595898a7d692634/6bdcf/remix-2.png 315w,
/static/e60a9d8161263ef0f595898a7d692634/f058b/remix-2.png 630w,
/static/e60a9d8161263ef0f595898a7d692634/5a190/remix-2.png 800w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;FILE EXPLORERS&lt;/h2&gt;
&lt;p&gt;最初に、FILE EXPLORERS という画面ででコードをコピペします。
左側にはファイルツリーが表示されて、右側にファイルの編集画面が表示されています。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/27a2bfd590faf2a498fd70a165670239/5a190/remix-3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.06329113924051%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsElEQVR42m1S266bMBDkTxow2MYXjK8YMOYWICdppT70/7+lIlRtHiqtVrvWzuxoxwkOvxiPSt+N3Qvob6kGuStp0GaTehP1bO0u6omyiMu+gJ7QAZc9oUGqJZH+ad3DNl++fUl1J3SgLDI+cR4bHTu36uYh9EZID3F34TNg08zcUp0ofdf2GOJP446SBEKHE8/HWi5STsYeSq/a3N+Mo6gXxkeQuwzYDNiEiZnQKNUGUXtL9UUJUcuqiVQTrxfKIxcTYwOhAeEWIl+SU3ZeNImSc1kG6760OS6+NDMId5VYeB2a/ujDD989ffvSZs+ABbn7t3ntV0J6bQ6l90+w1AfCfQE7jLsCdjnsIQogbz8j4WKq5SrVPS+av+ACeUzCn/ad/xsJZYNUm2ueaWYuPScYekz6z7k0M9c5riJNz5xgEiBqfftdqo3xKQPuvbnlYiYssmquxEL5yMWszCbNruyuzKbsXsklKekActf4Vy3XizUDNi8acrldTaJeCT1/COUj5SNhl5fnS0JYvKVa1ItrnryaEO4unbg8r2jsw7qHVKfPvJopiwh1IHff3vp/A5JPfSXTCnAWAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/27a2bfd590faf2a498fd70a165670239/f058b/remix-3.png&quot;
        srcset=&quot;/static/27a2bfd590faf2a498fd70a165670239/c26ae/remix-3.png 158w,
/static/27a2bfd590faf2a498fd70a165670239/6bdcf/remix-3.png 315w,
/static/27a2bfd590faf2a498fd70a165670239/f058b/remix-3.png 630w,
/static/27a2bfd590faf2a498fd70a165670239/5a190/remix-3.png 800w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;contracts というフォルダの下に、MyToken.sol というファイルを作って右側に下のコードをコピペします。&lt;/p&gt;
&lt;p&gt;MyToken というのがトークンの名前です。TKN が通貨の単位です。
自分の好きな名前に置換すれば、オリジナルの名前で作れます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;solidity&quot;&gt;&lt;pre style=&quot;counter-reset: linenumber NaN&quot; class=&quot;language-solidity line-numbers&quot;&gt;&lt;code class=&quot;language-solidity&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// contracts/SimpleToken.sol&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;solidity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt;&lt;span class=&quot;token version number&quot;&gt;0.6.2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@openzeppelin/contracts/token/ERC20/ERC20.sol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyToken&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; ERC20 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/**
   * @dev Constructor that gives msg.sender all of existing tokens.
   */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;constructor&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;uint256&lt;/span&gt; initialSupply
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ERC20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;MyToken&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;TKN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;_mint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sender&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; initialSupply &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;uint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;decimals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot; style=&quot;white-space: normal; width: auto; left: 0;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでコーディングは完了！
今日からあなたも Solidity エンジニアです。&lt;/p&gt;
&lt;p&gt;次はコンパイルです。&lt;/p&gt;
&lt;h2&gt;SOLIDITY COMPILER&lt;/h2&gt;
&lt;p&gt;SOLIDITY COMPILER という画面を開きましょう。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5a04e78ae35b15e6fd6e0f6c6c56ceb5/5a190/remix-4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 73.41772151898735%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAACzUlEQVR42lXSW4vcNgAFYP+PQnd818WW7ZEsyZJsy7Jn7PHszF7oXkLYpNu0sJC89amFhEJfCu2PLsnSh8L3ejhwOB6anjLSN81K2STkUpSDH7CNTxFucd6LZuXyUJROyIMQc1kNZeVyYgHUOOs8RBeEWy4OlM2kGHHuEmDi1ISRTmAHYMvKXjLH2VDKQ14OSSov/O3Gpxebrcd5D6BiYhncup9P83Lkspeqb7tOGdd1bnFGm7HmS0l3FZ2Kcqi205bu6nr23j1fv31r52W3rv3tbXe+0tbKqyv18GAe30x39+PPv0zHyz0pXFl2jE0QqSRtEDYAKs+6HSnbzl7h3MWpSUCfwh5AG0YtyhxAdhNqRFxGbFY6lHVFOeSkh0inoPFwbhOgRXOs+ZLlHUAavoKqqMaidHlhtJ0bfRzGG2VOsrlU+hzFYuNT74f9Ls+NVJfKnLhcMzLgvM+IhbgttxOrlzjVcaIB0ACoONVRohPQfl00Vl5FxxQonPVZbhFq40QEIfMDGkY1KQaATRjxMKqDsA5C/k39H+5VbErSJiO2KB3E/SaQYay/NSiIbZTo7y/Yxq/94H9e8x4mfRLzJOBxICUV61SdD2w31Fen5u5hnJd2XfXxqAbX7HaNc02jpNZy4zM/YB5EOqqW7v758PRh+enl5tPLzcuH4/NTvb82xpluUmYQchTNXqp9RS2tR6kXWi+Mzx6CKhS366+/vfvzj5sv/5x+//vuy193nz9ny49p8no1lQADYAtgGydNCg0mlhRDXlgP4i6NRRoKGFOCCoIKnJCL70gUUAA1KSwXB1bPXBy4OFTbr+tCpBFuo1h4EBuIO2OvpTkzeYmIA5kl2xFmXRDWUSy5WBt14mJl9bKl+6J0W7qnbK62kweQKappWd8/PH68u/94//jpsD6N05tGnTc+DSOOcJeTAeE2BRrhDiIDoIbIQNT+C/Hbw86naaYfAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/5a04e78ae35b15e6fd6e0f6c6c56ceb5/f058b/remix-4.png&quot;
        srcset=&quot;/static/5a04e78ae35b15e6fd6e0f6c6c56ceb5/c26ae/remix-4.png 158w,
/static/5a04e78ae35b15e6fd6e0f6c6c56ceb5/6bdcf/remix-4.png 315w,
/static/5a04e78ae35b15e6fd6e0f6c6c56ceb5/f058b/remix-4.png 630w,
/static/5a04e78ae35b15e6fd6e0f6c6c56ceb5/5a190/remix-4.png 800w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;開いたら Complie MyToken.sol をクリックします。&lt;/p&gt;
&lt;p&gt;バージョンの違いで、下のような Warning が表示されますが、無視して OK です。&lt;/p&gt;
&lt;!-- ![remix](/media/original-token/remix-5.png) --&gt;
&lt;blockquote&gt;
&lt;p&gt;Warning: Visibility for constructor is ignored. If you want the contract to be non-deployable, making it “abstract” is sufficient. —&gt; contracts/MyToken.sol:11:3: | 11 | constructor (uint256 initialSupply | ^ (Relevant source part starts here and spans across multiple lines).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ほかに何もエラーが出なければコンパイル完了です。&lt;/p&gt;
&lt;p&gt;あとはこのコンパイルしたスマートコントラクトをブロックチェーンにデプロイしたら完成です。&lt;/p&gt;
&lt;p&gt;Metamask が Binance Smart Chain に繋がっていることを確認しましょう。&lt;/p&gt;
&lt;h2&gt;DEPLOY &amp;#x26; RUN TRANSACTIONS&lt;/h2&gt;
&lt;p&gt;DEPLOY &amp;#x26; RUN TRANSACTIONS を開きましょう。Deploy する前にいくつか確認するポイントがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ENVIRONEMNT を「Injected Web3」に変える&lt;/li&gt;
&lt;li&gt;ACCOUNT が Metamask のアドレスになっていること&lt;/li&gt;
&lt;li&gt;CONTRACT が先ほどコンパイルした MyToken になっていること&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/798c109e4291211f69fc7044934737b5/5a190/remix-6.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.69620253164557%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB4klEQVR42kWS246bMBRF+ZJJIAnGXIyxDb7gKyZcMq3Umap97UN/pJ9eMU1baem8rS3to52U6ktdmwa5unGoDWVlr/nYkTvpIqFL28Wi0JerzIEEhQKFbJDNgcwufXbpk6JyA99D/GZsoMwhbGivvfXbHJf1VZlVCD/w0OIpBzLN6DmlacaestOTELufvmsz+eBwp1ww8R7jMoXoRx2stUpZCHUOFCjU9cb/mIf8/rayYRn4q3N36yJlqkbaurDu0/ZY7+vi3OK97weujRxHecuHNPsrS+YJnVm/AmheTuxy7Qk1zs/aGGud1nbgTo6OMAWgzIG43ER2fZK03dEH49A0jouojSdUq9EIKVkvuBCo5S0WHZFpxs8pzy78enuSlJUp0VS2S0fv+2PvqKuRxiRYH9Z9YcM0zfP7122K66fP27pvIc5Na4rSwMokAI4/9+nXj0cID0yXuMyESue3OD98CC0eB245l3XDOyJQKxrE/9VOilIzbGc7Oe/VaJXWdT344LbNCSkpE1XNX079OWWn88E57f8/rIBj1e9IvSGyEBZx53MgqudsfFnZqnZVbQs45kDmQBVw/FjLQVLVtiNRyr3B0/mIHG65RO3U4tji2KDwcT0s9SHAEZa6gEdEAfVvB1iJ1HupjTkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/798c109e4291211f69fc7044934737b5/f058b/remix-6.png&quot;
        srcset=&quot;/static/798c109e4291211f69fc7044934737b5/c26ae/remix-6.png 158w,
/static/798c109e4291211f69fc7044934737b5/6bdcf/remix-6.png 315w,
/static/798c109e4291211f69fc7044934737b5/f058b/remix-6.png 630w,
/static/798c109e4291211f69fc7044934737b5/5a190/remix-6.png 800w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;トークンの供給量を決めます。
今回は 10,000 にするとして、Deploy ボタンの隣に半角で「10000」と入力します。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7cf76ae836097673ae9a3b5a6046f1d0/898f6/remix-7.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.78481012658227%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAACUElEQVR42mWS2WrbQBSG/Ry9iTWrNNLItqxlZrRairzEWxw7hpY0dps0aQsN5BV6USj0FfpShdyVPksZ26QmhY/DmeXnzDn/NLp+jbDAOLJ5Ri110vSaRvcYA/gG8F9sAhhQK26k+RTA0DRVJM863VNmp7aTHZFiIghVzE6fsVhyEJsswUSYVjwYvVHJTKiJjKd7VDKN5Nhtl6v1fVGuQnEm1DhO5yqdH8RJNoEoxETwVs/muc1z3uo947gFNVXHO+Vu4fB8R2E72UEcRgOEI4Qj28kcnjMnM2Dw3KoBfACDk6b3onMD+Fps2SmmglDp+X2vW7faJaGSUImIwEQg3bBe4t2SmIpq5KGyzfP9Qd1fz8+3l+vbur8uq+XF8mYy2ywvPyyWNxer28lsM5lt4nTW6dahHEMUUlM1GM8JlQaMECuIU1JeIauAVuG0yla712qXro46aXVK5uhRs13PmAhd2cBSuNHnUXw3TO4G8d1AfRrFeRBTpt2yWGJaiY4sYXZmOSlEIYABwlGDu/krQ1yV8e9v9a/vF39+fnn6sX76Wj4sR/3p+9l8e2yejPfmVRCFWmzzHGARuHLT710Pq+2ovh5U74andTogu4L/86/yYWBUQTNjbsW9ockrk1dtr39s0jEABgcxczJCJQA+BF0IvF3UNE86lKpOtwYo2N/WHOU78W7aEEeIpYAqg6gmkchKiKkIkbaTQxhqkI4AhhhrX4+ejUPilur84+D1w/jt49nVYzy/D9JF0VtkvUVRLotymRbnOqlWQo394PAp/wLhtrv/byZ8hAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/7cf76ae836097673ae9a3b5a6046f1d0/f058b/remix-7.png&quot;
        srcset=&quot;/static/7cf76ae836097673ae9a3b5a6046f1d0/c26ae/remix-7.png 158w,
/static/7cf76ae836097673ae9a3b5a6046f1d0/6bdcf/remix-7.png 315w,
/static/7cf76ae836097673ae9a3b5a6046f1d0/f058b/remix-7.png 630w,
/static/7cf76ae836097673ae9a3b5a6046f1d0/898f6/remix-7.png 798w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;全部確認できればいよいよデプロイです。Deploy をクリックしましょう。
Metamask のトランザクション承認画面が表示されます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/22674c0e685492ab2b3c92ecc1c1db6f/remix-8.gif&quot; alt=&quot;remix&quot;&gt;&lt;/p&gt;
&lt;p&gt;トランザクションの承認画面では Gas 代を確認しましょう。&lt;/p&gt;
&lt;p&gt;Gas 代はタイミングによって変わります。今回は 0.006244 BNB でした。&lt;/p&gt;
&lt;p&gt;問題なければ確認をクリックしましょう。
何もエラーが出なければオリジナルトークンの完成です。&lt;/p&gt;
&lt;h2&gt;オリジナルトークンをウォレットに追加しよう&lt;/h2&gt;
&lt;p&gt;作ったオリジナルトークンをウォレットに追加してみましょう。&lt;/p&gt;
&lt;p&gt;スマートコントラクトは、ウォレットと同じようにブロックチェーン上のアドレスを持っています。そのアドレスは DEPLOY &amp;#x26; RUN TRANSACTION 画面の左下からコピーできます。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/877d33bea4894d16d1627f8ad4d4d017/5a190/remix-9.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 77.84810126582278%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAACy0lEQVR42lWSS5LzJhRGtZG0nwKBEE89ECCEELJsy+1OqvL3LBlknh1kB9lElpq4e5SqMz333rrflyGxdO2laa9aX617WPdu7CbVUiAnVDJ2E3JWder6G5cRE4fwkAMNYA8Lk4Gi7/Q9zp+qXt92YreTh2OzP6gcasqnXg1OJ2dWZR9cpZIM3xosTIFMBpG17jmlH8Y962Zt2isuhxz0sLCMT4INXMSmvTIxS5UYnxiPQiYhk6ovWSucqK91c3mZ3bVpr+gla4gsEzMRC+VzRT0hlvEAC53nHSz6r8t1VpJBm80NH6QKCLuf3vj+oPZ7CZGhLJbUyy4xuchu4zLVzUXIBIAGQOdAZ4INQl2YiIQGTDwmvsAWwL7ATtSXig2tnrW+jf5RN2vb3VVzxWRAJBAWM608FTMXkfFYEi/VwsVM2YSwE+qSQ3c89aezPp66F2d9OvdnYL6w2RlaKpaSJURGJiLloaw8KHpY9Ajb46n+P83hqL7ZH1RWlnZ2yy2sTq+y3up243IFhT/nBpMJ4QGVvsAeYV+goUC+rAImEyahYlMmq/7v35d//nz+9cea7ltK85wuj/fonF3WZFzQfRz84obU2zDNMS23ebndtrus1+wVOtSoMHFyn5/j82ne3819M8titvsYY0hpSim4Ieh+8GPQfYhxGscJYZ9BbKl5yvFXrK6MzhVNlCdcho+f3Y/f5vsjrNdpe0zPj4hLD5Er0JADC6B71TOHlnebDr/U+ib1jYqJVB4WrsAd6zyXQYgoZKibyEWibKJsKokndHzJjJk0z49tfWyXYRp137Ztreo+B+3p0OWgz0EPoAHQHI7N20687cT+oHZ7+fr2490bO3ERKQvFVzwI28s6+dGcuSfUV3Qi1UhoqGh47axGhGxJRgBNpprBWONH670dwxDCMI6u0xZhDagj1fgtVzRQ9jXlq8UlGf+r5793HMpmkLU6jQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/877d33bea4894d16d1627f8ad4d4d017/f058b/remix-9.png&quot;
        srcset=&quot;/static/877d33bea4894d16d1627f8ad4d4d017/c26ae/remix-9.png 158w,
/static/877d33bea4894d16d1627f8ad4d4d017/6bdcf/remix-9.png 315w,
/static/877d33bea4894d16d1627f8ad4d4d017/f058b/remix-9.png 630w,
/static/877d33bea4894d16d1627f8ad4d4d017/5a190/remix-9.png 800w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;コントラクトアドレスをコピーしたら、Metamask の「トークンを追加」に入力しましょう。&lt;/p&gt;
&lt;p&gt;無事に Metamask に MyToken を 10,000TKN 登録できました！&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ba50f60764f46b94f173099e185b5697/d6331/metamask-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 165.82278481012656%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAhCAIAAABWXBxEAAAACXBIWXMAAAsTAAALEwEAmpwYAAADqklEQVR42pVUS2/kRBD2b+GE+CvcOHGEG9w4cOAfIIGEENoDSIEVQpEirZZDhFixBLKZBJKM8tiwyQxJHGYm83La9rgftrvtqu5GbWesPPfxqWVVtau6ur6uKs9/sbf/6Ovj3b8yBZyLGWWT6QUJYxJGYTQjYUQiJ5MwjmcJpYzwrP3g24MHP8aZ8vpbT/78+J3T33/K0HLOSRgfHHb756Ne/3wwHPcGo+o77J+PSBSzhB4T9sUHn7Te/2ia5B5nNCQBS2aMp4wLxgXngjJeLTYX3EqoU9M0W/dJux9maeoBajQGUAMgAGIlaK1R21IyKDJtLFQ/cG5jrTHGAKBnryPPcwDI81xWUEpJKY0xRYXaxhi3rLXeXHca53xjY2N3b++3p09/fvx4eXm51WotLi4uLS0tLCysrq5aa7XWTaRrkYui6Ha7Ozu7z58/39zaWmutHx11tre3j446q8/WjjqdJswdzm+K5truO4rV5inLFFprDwbiqyejaeLyPA3yL38d/kfyxvIO59UO/e6PST9U1trPfxm+9enO8l5srf2hdfH2Z7sP1y+staBvXbveiFPojrMSnTaI1MP1gGZgrZ3S4lE7HM+Kq543c0ZtkhRqCyGxR1R9UKr0LINIlLLUdzu717ufG/Nywsyt//MdU8HeeCfnXGuZ0oNITZJCSLxxhJQquCDRLEkSRsKIcdEc4eUF5gVkCpOsjEXJJWQFZgoUYB1Ra12CQ1kBALTW9S8vSPKAyiCRhMmQKcLURaUmQiFC7YaIl62BAPODAMBzmaF7fYCyULJaSslca3x1hZV5xP0lXTL/rL9VYW9/f2VlhZDwNkMNGBcuskal4n80FldN7/NpoFShtfaMMWguX+NN4bncKkprDptn1S+FGytaewJxM4gKrdNURFFEKWWMUUpfeXNH2Mmzzffe/fDvw5PpaLi2tnZ4eOj7frvdrofOfUdQxqqnOp9E33zPAvI6PDUoXfsYryn6eQU36zUmicu94t3RrrWbwajxKjlu39T787o0tXStJYVCoTB1dQ5JBrMUorSc0mKWuoLnEvP7+rkEI9RlSdaeASt7odo+471Q1qOCSzQ3nJt+TRVyCanCzMWv26uWUUjkOSrQV8eGd3sAVK14OR703O5ODp3zaDTyfX84HPq+PxgMJpPJeDzq9XrBdHI8Ed1J/u8074yzfijPiDwJ8tNA1jPDq2aFZIylacorSClrWQiRK5ylwCXSDIR0RAa0ZDlClfv/LjZhd9I10cUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;remix&quot;
        title=&quot;&quot;
        src=&quot;/static/ba50f60764f46b94f173099e185b5697/f058b/metamask-1.png&quot;
        srcset=&quot;/static/ba50f60764f46b94f173099e185b5697/c26ae/metamask-1.png 158w,
/static/ba50f60764f46b94f173099e185b5697/6bdcf/metamask-1.png 315w,
/static/ba50f60764f46b94f173099e185b5697/f058b/metamask-1.png 630w,
/static/ba50f60764f46b94f173099e185b5697/d6331/metamask-1.png 702w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;もちろん、作ったトークンは BSC のほかのアドレスに送ることができます。&lt;/p&gt;</content:encoded></item></channel></rss>