昨晩、LXDAO Vdel 先生の招待を受けて、web3 インターンシッププログラムの学生たちに DAPP 開発について話しました。考えてみると、ウォレットが必要なチェーン上のインタラクションは DAPP そのものですし、特に複雑でもありません。今の AI はとても強力なので、DAPP を書くのはあっという間のことです。そこで、私は承諾し、これは web3 のハローワールドに過ぎないと思いました。
その後、仕事が終わった後に考えたのですが、私は「知識の呪い」を受けているのかもしれません。初めてハッカソンに参加したとき、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 に展開するという素晴らしいアイデアを思いつきました(次の章で紹介します)。簡単に言えば、店をチラシにコピーして、多くの人に配布し、ある場所を封鎖し、他の場所に残すようなものです。当然、代償はこのウェブサイトのアクセスが非常に遅くなることです。したがって、これは一般的な解決策ではありません。
- 広義に言えば、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 を提供)を使用して照会できるようにし、開発の負担を軽減します。
オラクル(Oracle)#
オラクルという名前は非常に高尚に聞こえますが、実際にはブロックチェーンと現実世界の橋渡しをするものです。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 Gateway を通じて画像にアクセスできます。例: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...)から新しいデジタル資産を生成し、ユーザーに配布することを指します。転送とは異なり、転送は資産をあるアドレスから別のアドレスに移動させることです。
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 をフォローして、ぜひ交流しましょう!私の Twitter