昨晩、LXDAO Vdel 先生の招待を受けて、web3 インターンシッププログラムの学生たちに DAPP 開発について話しました。考えてみると、ウォレットが必要なチェーン上のインタラクションは DAPP に他ならず、そんなに複雑ではありません。ましてや今の AI は非常に強力で、DAPP を書くのはあっという間のことです。そこで、私は承諾し、これは web3 の Hello World ではないかと思いました。
その後、仕事が終わって考えてみると、私は「知識の呪い」を受けているかもしれないと思いました。初めてハッカソンに参加したとき、LXDAO Marry3の模倣品Ring3を作ったときの迷いと無力感を思い出し、この数年間のハッカソンやプロジェクトでの経験を振り返ると、やはり話す価値があると感じました。同時に、これは私の数年間の経験を整理する非常に良い機会でもあり、講義の準備をしながらブログを書くことにしました。
DAPP とは?#
一般的な定義は:DAPP、正式には Decentralized Application(分散型アプリケーション)であり、ブロックチェーン上で動作するアプリケーションです。従来の中央集権型アプリケーションとは異なり、DAPP は中央集権型サーバーに依存せず、ブロックチェーンの分散型特性に依存しています。したがって、DAPP は分散型、信頼不要、中介不要の特性を持っています。
以上は非常に公式な紹介ですが、実際には公式なサーバーに従って DAPP を作成すると、すべてを分散化するとユーザー体験が非常に悪くなります。例えば、アクセスが難しい、速度が遅い、プロセスが複雑などです。実際、ブロックチェーンの最も偉大な発明の一つである分散型取引所 Uniswap でさえ、完全に分散化されているわけではありません。具体的には、Uniswap 上のトークンリストは、毎回ブロックチェーンから読み取ると、いつになるかわかりません。また、価格、スリッページ、取引量、TVL、流動性プールなどのデータは、中央集権型サービスを通じてブロックチェーンデータを検索、整理、保存した後、web API/GraphQL インターフェースを提供し、フロントエンドがこれらのインターフェースを呼び出してユーザーに提供します。
では、結局のところ、分散型アプリケーション(DAPP)とは何でしょうか?私の言葉で言えば、チェーン上のインタラクションが必要で、書き込み / 読み取り操作を行うものはすべて DAPP と見なすことができます。ただし、程度の違いがあります。DAPP と従来の web 開発は対立するものではなく、互いに互換性があります。製品の分散化の程度を分析するためにベン図を使用できます:
全体の紫色の領域は DAPP の領域として定義できると考えています。特に注目すべきいくつかの領域があります:
- 茶色の領域は大多数の DAPP です:Uniswap、Pendle、OpenSea、ENS などのほとんどの有名な DAPP は、フロントエンドとバックエンドの両方に分散型技術と中央集権型技術を持っています。フロントエンドは通常、IPFS のような技術を使用してサービスを展開しませんが、ユーザー体験を向上させるために分散型技術 CDN を使用することがあります。バックエンドサービスの基盤は分散型のブロックチェーン技術に基づいており、コアサービスのユーザーは直接チェーンとインタラクションしますが、すべて中央集権型のデータベースサーバーを通じてブロックチェーン上のデータを同期し、インデックスを形成し、データ検索速度を向上させることが本質的にユーザー体験を向上させることになります。
- 次に、茶色の領域の下にある「シンプル DAPP」領域を見てみましょう。この領域のアプリケーションは通常、機能が比較的シンプルで、具体的には特定のアドレスの資産状況を読み取るだけで済む場合や、いくつかの簡単な書き込み操作を行う場合があります。例えば、NFT をミントしたり、NFT を転送したりするなどです。この種の DAPP は 2021 年頃に特に流行しました。当時は NFT の繁忙期で、多くのプロジェクトが自分の NFT のブランドイメージを向上させるためにクールなウェブページを作成し、より多くの NFT を販売していました。これらの DAPP は、ユーザーがミントする資格があるかどうかを判断し、何個の NFT をミントできるかを判断し、ユーザーにスマートコントラクトを呼び出してミントさせ、ミントされた NFT をユーザーに表示します。ちなみに、LXDAO の 0 号プロジェクトである良心 NFT もその時期に誕生しましたが、良心 NFT は市場の中で独自の存在であり、ウェブページのスタイルは質素ですが機能は充実しており、NFT の機能を客観的に紹介し、派手な見せかけはありません。単純なアート作品販売サイトと考えることができます。当時の価格は 1 つあたり 0.01ETH でしたが、今では手に入れるのが難しいです
- 次に、茶色の領域の「極端 DAPP」領域を見てみましょう。ここでは CDN のコンテンツ配信ネットワークについては議論しません。このサービス自体は確かに分散型ですが、CDN サービスプロバイダーの中央集権型の問題に直面しています。しかし、ほとんどの場合、私たちの分散型アプリケーションはインタラクションインターフェースがない状態での使用を受け入れることができます。ここで議論されている分散型フロントエンドは、ネットワークサービスプロバイダーの中央集権型の問題を回避することを目的としています。例えば、Tornado.cash は、要するにブロックチェーン技術を利用してマネーロンダリングを行うアプリケーションです。誰がそれを維持するかによって法的リスクが生じます。どのサーバー提供者も自分のサーバーがこのようなものを展開するために使用されることを望んでいません。しかし、技術は無罪であり、コミュニティは Tornado.cash のフロントエンドコードを IPFS に展開するという素晴らしいアイデアを思いつきました(次の章で紹介します)。簡単に言えば、店舗をチラシにコピーして多くの人に配布し、1 つの場所を封鎖し、他の場所に残すようなものです。当然のことながら、その代償はこのウェブサイトへのアクセスが非常に遅くなることです。したがって、これは一般的な解決策ではありません。
- 広義に言えば、DAPP の核心は一整套のスマートコントラクトです。スマートコントラクトだけで DAPP を構成することができますが、ブロックチェーンはプログラマーだけではありません。より多くのユーザーを持つためには、基本的なインタラクションインターフェースが必要です。
要約すると、チェーンとのインタラクションがあるかどうか、コアがスマートコントラクトを中心に展開されているかどうかが DAPP を判断する最も基本的な基準です。中央集権型のフロントエンドとバックエンドは DAPP と互換性があり、ユーザー体験の向上に非常に重要な役割を果たします。
DAPP の基本構造#
上記の DAPP に関する理解を総合すると、DAPP の基本構造は前端、後端、スマートコントラクトの 3 つの部分に分けることができます。前端と後端は中央集権型であり、スマートコントラクトは分散型です。もちろん、そんなに簡単ではありません。これが簡単なら、書くことはほとんどありません。上記の内容に加えて、DAPP の運用をサポートするいくつかの重要な基礎サービスがあります。彼らの関係は以下の図のようになりますが、あまり多くはありません:
IPFS#
中国語名は星際文件系統で、分散型のファイルストレージシステムと理解できますが、ブロックチェーンの複雑なコンセンサスメカニズムはなく、ハッシュ値を照合する方法でファイルを区別 / 検索します。
具体的には、善意の人々がインターネット上で無料のストレージ施設を維持していると理解できます。ファイルをアップロードすると、世界中の多くのストレージ施設に分散して保存されます(つまり、一部のサーバーにはそのファイルのコピーがあります)。ファイルのハッシュ値を計算することで重複保存を避け、ユーザーはファイルのハッシュ値を使用して対応するファイルの完全なデータを見つけることができます。
もちろん、世の中にはそんなに良いことはありません。無料の代償は、あなたのファイルがいつでも削除される可能性があることですが、IPFS は Filecoin(ブロックチェーン)を通じてファイルの保存を保証するいくつかの有料ストレージサービスも提供しています。
RPC サービスプロバイダー#
実際、通常のアプリケーションは直接 Ethereum ネットワークとインタラクションする必要はありませんし、必要もありません。詳細なブロックチェーンの基礎知識についてはここでは詳しく説明しません。興味のある方は自分で調べてみてください。
DAPP はブロックチェーンを「使用」するだけで、ブロックチェーンを「維持」する必要はありません。ブロックチェーンを「維持」することは、チェーンと直接インタラクションする操作、つまりブロックチェーンのマイニング / コンセンサスに参加することを意味します。これには膨大なブロックチェーンデータを同期する必要がありますが、ブロックチェーンを「使用」することは、そんなに膨大なデータを気にする必要はありません。通常の web サービスと似ており、いくつかのインターフェースを開放するだけで済みます。
RPC(リモートプロシージャコール)サービスプロバイダーは本質的に API インターフェースを提供するもので、特別な形式の要件があります。RPC サービスプロバイダーは通常、異なるタイプの Ethereum ノード(フルノード、ライトノード、アーカイブノードを含む)を運営し、ノード機能を JSON-RPC インターフェースを通じて公開します。これらのインターフェースは Ethereum の JSON-RPC 規格に従い、開発者は HTTP または WebSocket リクエストを通じてブロックチェーンデータを照会したり、トランザクションを送信したり、スマートコントラクトを呼び出したりできます。
インデックスサービスプロバイダー#
RPC を見てからインデックスサービスを理解することができます。これについてはもう少し詳しく説明する必要があります。RPC を使用してブロックチェーンデータを読み取るとき、データベースのように自由に必要なデータを照会することはできません。通常、特定のコントラクトまたはウォレットの現在の状態(例えば、残高)を読み取るか、単一のトランザクション / ブロックの詳細情報を照会するか、いくつかのイベントの発生を監視することができます(例えば、新しい NFT がミントされたか、新しいトランザクションがあるか)。
しかし、DApp としては、通常、特定のコントラクトのすべてのトランザクション状況を照会する必要があります。具体的には、特定の NFT コントラクトのすべての保有者を調べる必要があります。インデックスサービスがなければ、コントラクトがデプロイされたブロックから始めて、1 つのブロックずつ関連する NFT のミント、転送、バーンなどのトランザクションを記録する必要があります。
理論的には、これはそれほど「必要」なサービスではありません。プロジェクトの規模が大きくない場合、完全に自分でこの作業を行うことができます。しかし、この種のサービスの需要は似ており、一般的であるため、インデックスサービスが存在します。彼らは各ブロックをチェックし、関連するトランザクションをデータベースに記録し、開発者が通常のデータ照会文(通常は GraphQL API を提供)を使用して照会できるようにし、開発者の負担を軽減します。
オラクル#
オラクルという名前は非常に高尚に聞こえますが、実際にはブロックチェーンと現実世界の橋渡しです。1 つの問題を考えてみてください。ブロックチェーンは現在の ETH の価格をどうやって知るのでしょうか?直感的に言えば、スマートコントラクトをデプロイして、信頼できる役割に価格を教えてもらうことができます。スマートコントラクトはこの価格に基づいてその後の操作を行います。しかし、問題は、誰がこの役割が信頼できることを保証するのでしょうか?私たちは当然、1 つの役割の情報だけでメッセージの真偽を判断することはできません。結果の検証も分散化される必要があります。オラクルが登場する理由です。
オラクルの基本原理は、複数のデータソースと複数のデータ提供者を通じてデータの信頼性を確保することです。ETH 価格の例を挙げると、オラクルネットワークは Coinbase、Binance、Kraken などの複数の取引所から ETH/USD の価格データを取得し、加重平均アルゴリズムを使用して最終価格を計算します。もしある取引所が提供する価格が他の大多数の取引所と大きく異なる場合、システムによって識別され排除されます。同時に、データ提供者(オラクルノード)はトークンを担保として質入れする必要があり、誤った価格データを提供するとトークンが没収されるため、データの正確性を保証するための経済的インセンティブが形成されます。
最も有名なオラクルプロジェクトは Chainlink で、数千の DeFi DAPP にリアルタイムの価格データを提供する大規模なオラクルネットワークを構築しています。あなたが Uniswap で取引を行ったり、Aave で貸し借りを行ったりする際、これらのプロトコルは取引比率や清算条件を計算するためにさまざまなトークンの正確な価格を知る必要があり、これらの価格データは Chainlink などのオラクルによって提供されます。
ツールチェーンの推奨#
この部分では、まず一般的なフロントエンドとバックエンドの開発ツールチェーンを紹介し、その後、私が接触したいくつかのチェーンのツールチェーンを紹介します。
一般的な技術#
DApp 開発を行う場合、まず JS をしっかり学ぶことを強くお勧めします。JS を学べば、ほぼ一人で全プロセスを通すことができます。
フロントエンド技術スタック:
- フロントエンドフレームワーク:Next.js
- スタイルライブラリ:Tailwind CSS
- UI ライブラリ:shadcn/ui
- 代替スタイルソリューション:bruce 先生のツイート
- 状態管理:Zustand
- フォーム検証:Zod
- 新興技術スタック:TanStack
デプロイとツール:
- 簡単なデプロイ:Vercel
- 運用ソリューション:Coolify
- デザインツール:Figma
- プロトタイプツール:Excalidraw
バックエンド技術スタック:
- 簡単なバックエンド:Next.js の API Routes + Vercel サーバーレス関数
- 複雑なバックエンド:NestJS
- ORM:Prisma
- データベース:PostgreSQL
- デプロイプラットフォーム:NorthFlank
ストレージサービス:
コスト最適化:
- 「独立開発 穷鬼套餐」を検索して、より多くの経済的なソリューションを見つけることをお勧めします。
エコシステムツールチェーン#
ブロックチェーン | ウォレットプラグインリンク | コントラクト / チェーンインタラクションライブラリ | コントラクト開発フレームワーク / 言語 | RPC プロバイダー | インデックスサービス |
---|---|---|---|---|---|
ETH | RainbowKit, ConnectKit, Web3Modal | ethers.js, viem, web3.js | Foundry, Hardhat, Truffle (Solidity 言語) | Alchemy, Infura, QuickNode | The Graph, Moralis, Alchemy |
Solana | @solana/wallet-adapter | @solana/web3.js, @solana/spl-token | Anchor (フレームワーク), Rust (言語) | Helius, QuickNode, Alchemy | Helius, Simple Hash |
BTC | UniSat, Xverse | bitcoinjs-lib, @scure/btc-signer | Bitcoin Script (スクリプト言語) | BlockCypher, Blockstream API | Ordiscan, Blockstream |
Cosmos | @cosmos-kit/react | @cosmjs/stargate, cosmjs | Cosmos SDK (フレームワーク), CosmWasm (Rust 言語) | All Nodes, Stakely | Mintscan, Big Dipper |
Aptos | @aptos-labs/wallet-adapter | @aptos-labs/ts-sdk | Move (言語), Aptos Framework | Aptos Labs, Nodereal | Aptos Labs, Aptoscan |
TON | @tonconnect/ui-react | @ton/ton, @ton/crypto | FunC (言語), Blueprint (フレームワーク) | TonCenter, GetBlock | TonAPI, Toncenter |
いずれにせよ、Ethereum は現在最も成熟したチェーンであり、次の章では Ethereum を例に DAPP 開発の全プロセスを紹介します。
NFT ミント DAPP デモ#
コントラクト開発とデプロイ(以下のいずれかを選択してください)#
開発前の準備#
- 画像を作成します:自分のアバターを使用するか、AI で生成されたものを使用することを検討できます。
- Pinata IPFS にアップロードします。
- 登録してログインします。
- ファイルをアップロードします。
- CID を記録します。例:bafkreigfpdewysnl5fq2ir57r26fhxpa6bg3qoy3sbkxlajq6dkf4wye3u
- IPFS ゲートウェイを通じて画像にアクセスできます。例:https://ipfs.io/ipfs/bafkreigfpdewysnl5fq2ir57r26fhxpa6bg3qoy3sbkxlajq6dkf4wye3u
- 文字列 ipfs://{CID} を準備します。例:ipfs://bafkreigfpdewysnl5fq2ir57r26fhxpa6bg3qoy3sbkxlajq6dkf4wye3u
- メタデータを準備します。
- 以下の内容を参考にして、自分のメタデータを作成します。名前(name)、説明(description)、属性(attributes)を自由に記入します(注意:属性は trait_type と value の固定内容の配列です)。
- 先ほどの内容をコピーして、json ファイルを作成します。
- 以前の手順を参考にして ipfs にアップロードします。
- CID を記録し、IPFS URL を準備します。例:ipfs://bafkreid7msiyufvgilrlkt6244psudmaycbbzika2aq57kou3xha5u36pe
{
"name": "My First Handmade NFT",
"description": "My First Handmade NFT by @hardman_eth",
"image": "ipfs://bafkreigfpdewysnl5fq2ir57r26fhxpa6bg3qoy3sbkxlajq6dkf4wye3u",
"attributes": [
{
"trait_type": "IQ",
"value": "80"
},
{
"trait_type": "Hat",
"value": "Pot"
}
]
}
- etherscan API キーを準備します。
- https://etherscan.io/login に登録してログインします。メインネット API キーとテストネットは共通です。
- API キーをコピーして、環境変数.env に入れます。
- デプロイに使用する予定の秘密鍵を追加します(自分でスクリプトを生成するか、直接作成することを検討してください。オンラインツールを使用して生成することはお勧めしません。安全上の問題があります)。
# デプロイ用の秘密鍵
PRIVATE_KEY=your_private_key_here
# 公開Sepolia RPC URL。自分のプライベートRPCに変更できます。
SEPOLIA_RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
# コントラクト検証用のEtherscan APIキー(etherscan.ioから無料)
ETHERSCAN_API_KEY=your_etherscan_api_key
- 水を得る(テストコイン)
ブロックチェーン上のすべての書き込み操作には Gas 費用が必要です。テストネットを使用するため、いくつかのテストコインを取得できます。つまり、「水を得る」ことができます。
https://www.alchemy.com/faucets/ethereum-sepolia
私の Twitter をフォローして、DM でアドレスを送ってくれれば、0.1 個送ります。
Foundry フレームワークに基づく#
- Foundry をインストールします。詳細は公式ドキュメントを参照してください。
- Foundry プロジェクトを初期化します。
forge init foundry-nft
- 先ほど準備した.env をファイルディレクトリにコピーします。
- 依存関係をインストールします(openzeppelin)。
forge install OpenZeppelin/openzeppelin-contracts
- コントラクトを作成します。AI に生成させることもできます。プロンプトの参考として「シンプルな NFT コントラクトを作成し、無料でミントし、999 個の限定版、ipfs://bafkreid7msiyufvgilrlkt6244psudmaycbbzika2aq57kou3xha5u36pe」と入力します。または、foundry-simple-nft リポジトリのコントラクトコードを直接参考にすることもできます。
- 単体テストを作成します。foundry-nft/test/SimpleNFT.t.sol を参考にしてください。
- デプロイメントスクリプトを準備します。foundry-nft/script/DeploySimpleNFT.s.sol を参考にしてください。
- コントラクトをデプロイし、コントラクトを検証します。
# 1. 環境変数ファイルをコピーし、秘密鍵を入力します。
cp .env.example .env
# .envファイルを編集し、秘密鍵を入力します。
# 2. Sepoliaテストネットにデプロイします。
source .env && forge script script/DeploySimpleNFT.s.sol --rpc-url $SEPOLIA_RPC_URL --broadcast --verify
# または、公共RPCを使用して直接デプロイします。
forge script script/DeploySimpleNFT.s.sol --rpc-url https://ethereum-sepolia-rpc.publicnode.com --broadcast
# 3. または、ステップ実行します。
# まずデプロイします。
source .env && forge script script/DeploySimpleNFT.s.sol --rpc-url $SEPOLIA_RPC_URL --broadcast
# 次に検証します(コントラクトアドレスが必要です)。
source .env && forge verify-contract <CONTRACT_ADDRESS> src/SimpleNFT.sol:SimpleNFT \
--etherscan-api-key $ETHERSCAN_API_KEY \
--chain sepolia
フロントエンド開発#
https://github.com/0xhardman/handmade-nft-frontend master ブランチ
ウォレットプラグインの統合#
- rainbowkit、wagmi、viem をインストールします。
npm install @rainbow-me/rainbowkit wagmi [email protected] @tanstack/react-query
- テストネットワークを設定します。
- プロバイダーをラップします。
- RainbowKit の設定について簡単に理解します。
一般的な wagmi フックをざっと理解します。#
- useReadContract:単一コントラクトのデータを読み取ります。
- useWriteContract:コントラクトにデータを書き込みます。例えば、ミントや転送など。
- useAccount:接続されたアカウントの基本情報(アドレス、現在のネットワーク)を取得します。
- useSignMessage:メッセージに署名します。
- useBalance:アカウントのガスコイン残高や ERC20 トークンの残高を取得します。
- useWaitForTransactionReceipt:トランザクションの確認を待ちます。
- useSwitchChain:現在のチェーンを切り替えます。
- useSwitchAccount:アカウントを切り替えます。
ABI ファイルを取得します。#
- コントラクトが検証されている場合、ブロックチェーンブラウザからダウンロードできます。
- 自分でデプロイした場合、コンパイルファイルから探すことができます。
- Foundry の場合、out/SimpleNFT.out/SimpleNFT.json から取得できます。
機能実装#
- ネットワークを確認し、切り替えを促します。
- ウォレットの残高を確認し、ユーザーにチャージを促します。
- ボタンをクリックして、コントラクトを呼び出してミントします。
- トランザクションの確認を待ち、成功を通知します。
- 私の NFT ページを表示します。
他の初心者が知らないかもしれない概念#
ミント#
初めて購入することと理解できます。例えば、アート作品を購入する場合、アーティストから直接購入することをミントと呼びます。あなたのお金はアーティストに直接渡され、アーティストを支援します。二次販売業者や他の購入者から購入することとは異なります。二次販売業者や購入者は差額を得ます。技術的には、ミントはブロックチェーンネットワーク上でゼロアドレス(0x0000...)から新しいデジタル資産を生成し、ユーザーに配布することを指します。transfer とは異なり、transfer は資産をあるアドレスから別のアドレスに移動させることです。
Gas とは?なぜ Gas が必要なのか?#
この質問は非常に古典的です。私が初めてブロックチェーンに触れたときも、なぜ送金に手数料が必要なのか全く理解できませんでした。そして、この手数料は高くなったり低くなったりします。時には数ドル、時には数十ドルで、銀行よりもひどいと思いました!
実際、Gas は Ethereum ネットワークの「手数料」です。しかし、それは単なる手数料ではありません。Ethereum を世界中で共有されるスーパーコンピュータのように想像してみてください。このコンピュータに作業を依頼する(例えば、送金やスマートコントラクトの実行)には、そのコンピュータを維持する人々(マイナー / バリデーター)に支払う必要があります。
技術的には、各操作には計算リソースが消費され、Gas はこれらのリソース消費の単位を測るものです。送金には 21,000 Gas しか必要ないかもしれませんが、複雑なスマートコントラクトを実行する(例えば、Uniswap で取引する)には、数十万 Gas が必要になることがあります。Gas 価格(Gas Price)はネットワークの混雑度に応じてリアルタイムで変動します。ネットワークが混雑しているときは価格が高く、空いているときは価格が低くなります。これはタクシーのピーク時の価格と同じです。
では、なぜ Gas が必要なのか?簡単に言えば、悪意のある攻撃からネットワークを防ぐためです(例えば、無限ループのコードなど)。同時に、マイナー / バリデーターにネットワークの安全を維持するインセンティブを与えます。Gas がなければ、ネットワークは様々なゴミ取引で麻痺してしまいます。
なぜブロック確認を待つのか?#
なぜボタンをクリックした後、十数秒や数分待たなければならないのか?この体験はあまりにも悪いのではないかと思います!
しかし、これはブロックチェーンの分散化の必然的な結果です。従来の中央集権型システム、例えば Alipay では、送金時に Alipay のサーバーが確認するだけで済み、即座に入金されます。しかし、ブロックチェーンは異なります。中央サーバーがなく、世界中の何千ものノードが共同で維持しています。
具体的には、あなたがトランザクションを開始すると、そのトランザクションはネットワーク全体にブロードキャストされ、マイナー(またはバリデーター)が新しいブロックにパッケージ化するのを待ちます。Ethereum は約 12〜15 秒ごとに新しいブロックを生成するため、あなたのトランザクションは最速でも 1 つのブロックの時間を待たなければなりません。
しかし、これだけではありません。チェーンの再編成を防ぐため(簡単に言えば、ブロックチェーンの分岐が戻ること)、通常は複数のブロックの確認を待つことが推奨されます。例えば、取引所は通常、12 ブロックの確認を要求し、トランザクションが最終的なものであると見なします。これが時には数分待たなければならない理由です。
ただし、DAPP の場合、通常は 1〜2 ブロックの確認を待つだけで十分です。大体十数秒から 1 分の時間です。中央集権型システムよりは遅いですが、得られるのは分散化、検閲耐性、グローバルな無境界の特性です。このトレードオフは価値があると思います。
推奨リソース#
EVM エコシステム DApp スキャフォールド
JavaScript を使用してブロックチェーン、Solidity、およびフルスタック Web3 開発を学ぶ
web3 インターンシッププログラム
助記詞を ETH アドレスに変換するために知っておくべきすべて
結語#
実際に言いたいことはたくさんありますが、「入門」に焦点を当てると、あまり深く掘り下げることができません。ブロックチェーンに入門するのは簡単ではなく、30 分では DApp 開発という厚い本を「ざっと読む」ことしかできません。やはり多くの実践と試行が必要です!
私のTwitterに DM を送って、一緒に交流しましょう!