# SIWE:Dappのための身分証明を提供する強力なツールSIWE(Ethereumでのサインイン)は、Ethereum上でユーザーの身分証明を行う方法であり、取引を開始するのと似ており、ユーザーがウォレットの管理権を持っていることを証明します。現在、ほとんどのウォレットプラグインはこの簡単な署名方式をサポートしています。この記事では、Ethereum上の署名シナリオについて主に議論し、他のパブリックチェーンには触れません。! [SIWEマニュアル:Dappをより強力にする方法は? ](https://img-cdn.gateio.im/social/moments-9e9c9e786391f84b004cd8450a29acce)## あなたのプロジェクトはSIWEが必要ですか?あなたのDappが以下の要件を持っている場合、SIWEの使用を検討できます:- 自分のユーザーシステムを持っている- ユーザーのプライバシーに関する情報を確認する必要があります主にクエリ機能を提供するDapp(、例えばetherscan)では、SIWEを使用する必要はありません。ウォレットを接続するとフロントエンドで身分証明が確認できますが、バックエンドサポートが必要なインターフェース呼び出しにおいて、アドレスのみを渡すことでは身分を証明することはできません。なぜなら、アドレスは公開情報だからです。## SIWEの原理とプロセスSIWEのプロセスは、3つのステップで構成されています: ウォレットの接続、署名、身分証明の取得。### ウォレットを接続するこれは一般的なWeb3操作であり、ウォレットプラグインを介してDappに接続します。### サインSIWEの署名手順は次のとおりです:1. Nonce値を取得する: バックエンドAPIを呼び出してランダムなNonce値を取得し、アドレスに関連付ける。2. サイン内容の構築: Nonce値、ドメイン、チェーンIDなどの情報を含む。3. ウォレット署名: ウォレットが提供する方法で内容に署名します。4. 署名を送信: 署名をバックエンドに送信して検証します。### ID を取得する バックエンドで署名の検証が通過した後、ユーザーの身分証明(をJWT)として返します。以降のリクエストにはアドレスと身分証明を持参すれば、ウォレットの所有権を証明できます。! [SIWEマニュアル:Dappをより強力にする方法は? ](https://img-cdn.gateio.im/social/moments-138fc08a9148099755d1fe162292922f)## SIWEの実践私たちは、SIWEをサポートするフルスタックアプリケーションをNext.jsで開発します。###の準備1. Next.jsをインストールする:npx create-next-app@142. SIWE関連の依存関係をインストールする:npm install antd @ant-design/web3 @ant-design/web3-wagmi wagmi viem @tanstack/react-query --save### ワグミのご紹介layout.tsx に WagmiProvider を導入します。JSXのimport { WagmiWeb3ConfigProvider } from "@ant-design/web3-wagmi";const WagmiProvider = ({ children }) => { リターン( <wagmiweb3configprovider config="{{" siwe:="" {="" getnonce:="" async="" (address)="""> (await getNonce(address)).data, createMessage: (props) => createSiweMessage({ ... props, statement: "Ant Design Web3" }), verifyMessage:非同期(message、signature) = > { const jwt = (await verifyMessage(message、signature)).data; setJwt(jwt); 帰る!! JWTの; }, }, チェーン:[Mainnet]、 トランスポーツ: { [Mainnet.id]:http()、 }, 財布:[MetaMask()、WalletConnect()、TokenPocket()、 OkxWallet()] }} > {子供} </wagmiweb3configprovider> );};! [SIWEマニュアル:Dappをより強力にする方法は? ](https://img-cdn.gateio.im/social/moments-355ea961b315585f7d217cbcf6a3fa69)### 接続ボタンを追加ウォレット接続と署名のボタンを作成する:JSXのexport default 関数 App() { const jwt = React.useContext(JwtProvider); リターン( <connectbutton> <connectbutton.connector> {({ アカウント, 接続 }) => ( <ボタン onclick="{connect}"> ${account.address.slice(0,6)}...${account.address.slice(-4)} : "Connect Wallet"} </button> )} </connectbutton.connector> </connectbutton> );}! [SIWEマニュアル:Dappをより強力にする方法は? ](https://img-cdn.gateio.im/social/moments-53c03d1cb26f29a9d739e3d1aa0816df)### バックエンドインターフェースを実現する#### NonceインターフェースJavaScriptの非同期関数のエクスポート GET(request) { const { searchParams } = 新しいURL(request.url); constアドレス= searchParams.get("アドレス"); if (!address) { 新しいError("無効なアドレス")をスローします。 } const nonce = randomBytes(16).toString("hex"); addressMap.set(住所、nonce); Response.json({ data: nonce });}! [SIWEマニュアル:Dappをより強力にする方法は? ](https://img-cdn.gateio.im/social/moments-18a98c883797c414a689c54ae0d65302)#### 署名検証インターフェースJavaScriptの非同期関数のエクスポート POST(request) { const {署名、メッセージ} = await request.json(); const { nonce, アドレス = "0x" } = parseSiweMessage(message); if (!nonce || nonce !== addressMap.get(アドレス)) { 新しいError("無効なナンス")をスローします。 } const valid = await publicClient.verifySiweMessage({ メッセージ、 アドレス, シグネチャー, }); if (!valid) { 新しいError("無効な署名")をスローします。 } const token = jwt.sign({ アドレス }, JWT_SECRET, { expiresIn: "1h" }); 戻り値 Response.json({ data: token });}! [SIWEマニュアル:Dappをより強力にする方法は? ](https://img-cdn.gateio.im/social/moments-9351d7f08e48962120d591c3a0c7d245)## パフォーマンス最適化検証速度を向上させるために、専用のノードサービスの使用をお勧めします。デフォルトのRPCを置き換えるためにZANのノードサービスを使用できます。JavaScriptのconst publicClient = createPublicClient({ チェーン: メインネット, transport: http('), // ZAN ノードサービス RPC});これにより、インターフェースの応答速度が大幅に向上します。! [SIWEマニュアル:Dappをより強力にする方法は? ](https://img-cdn.gateio.im/social/moments-0ce46cff7473e96e768adfb5fc6dafb8)
SIWE:エーテルの身分証明を構築するDappのフルスタック実践ガイド
SIWE:Dappのための身分証明を提供する強力なツール
SIWE(Ethereumでのサインイン)は、Ethereum上でユーザーの身分証明を行う方法であり、取引を開始するのと似ており、ユーザーがウォレットの管理権を持っていることを証明します。現在、ほとんどのウォレットプラグインはこの簡単な署名方式をサポートしています。
この記事では、Ethereum上の署名シナリオについて主に議論し、他のパブリックチェーンには触れません。
! SIWEマニュアル:Dappをより強力にする方法は?
あなたのプロジェクトはSIWEが必要ですか?
あなたのDappが以下の要件を持っている場合、SIWEの使用を検討できます:
主にクエリ機能を提供するDapp(、例えばetherscan)では、SIWEを使用する必要はありません。
ウォレットを接続するとフロントエンドで身分証明が確認できますが、バックエンドサポートが必要なインターフェース呼び出しにおいて、アドレスのみを渡すことでは身分を証明することはできません。なぜなら、アドレスは公開情報だからです。
SIWEの原理とプロセス
SIWEのプロセスは、3つのステップで構成されています: ウォレットの接続、署名、身分証明の取得。
ウォレットを接続する
これは一般的なWeb3操作であり、ウォレットプラグインを介してDappに接続します。
サイン
SIWEの署名手順は次のとおりです:
Nonce値を取得する: バックエンドAPIを呼び出してランダムなNonce値を取得し、アドレスに関連付ける。
サイン内容の構築: Nonce値、ドメイン、チェーンIDなどの情報を含む。
ウォレット署名: ウォレットが提供する方法で内容に署名します。
署名を送信: 署名をバックエンドに送信して検証します。
ID を取得する
バックエンドで署名の検証が通過した後、ユーザーの身分証明(をJWT)として返します。以降のリクエストにはアドレスと身分証明を持参すれば、ウォレットの所有権を証明できます。
! SIWEマニュアル:Dappをより強力にする方法は?
SIWEの実践
私たちは、SIWEをサポートするフルスタックアプリケーションをNext.jsで開発します。
###の準備
npx create-next-app@14
npm install antd @ant-design/web3 @ant-design/web3-wagmi wagmi viem @tanstack/react-query --save
ワグミのご紹介
layout.tsx に WagmiProvider を導入します。
JSXの import { WagmiWeb3ConfigProvider } from "@ant-design/web3-wagmi";
const WagmiProvider = ({ children }) => { リターン( <wagmiweb3configprovider config="{{" siwe:="" {="" getnonce:="" async="" (address)="""> (await getNonce(address)).data, createMessage: (props) => createSiweMessage({ ... props, statement: "Ant Design Web3" }), verifyMessage:非同期(message、signature) = > { const jwt = (await verifyMessage(message、signature)).data; setJwt(jwt); 帰る!! JWTの; }, }, チェーン:[Mainnet]、 トランスポーツ: { [Mainnet.id]:http()、 }, 財布:[MetaMask()、WalletConnect()、TokenPocket()、 OkxWallet()] }} > {子供} ); };
! SIWEマニュアル:Dappをより強力にする方法は?
接続ボタンを追加
ウォレット接続と署名のボタンを作成する:
JSXの export default 関数 App() { const jwt = React.useContext(JwtProvider);
リターン( <connectbutton.connector> {({ アカウント, 接続 }) => ( <ボタン onclick="{connect}"> ${account.address.slice(0,6)}...${account.address.slice(-4)} : "Connect Wallet"} )} </connectbutton.connector> ); }
! SIWEマニュアル:Dappをより強力にする方法は?
バックエンドインターフェースを実現する
Nonceインターフェース
JavaScriptの 非同期関数のエクスポート GET(request) { const { searchParams } = 新しいURL(request.url); constアドレス= searchParams.get("アドレス");
if (!address) { 新しいError("無効なアドレス")をスローします。 } const nonce = randomBytes(16).toString("hex"); addressMap.set(住所、nonce); Response.json({ data: nonce }); }
! SIWEマニュアル:Dappをより強力にする方法は?
署名検証インターフェース
JavaScriptの 非同期関数のエクスポート POST(request) { const {署名、メッセージ} = await request.json(); const { nonce, アドレス = "0x" } = parseSiweMessage(message);
if (!nonce || nonce !== addressMap.get(アドレス)) { 新しいError("無効なナンス")をスローします。 }
const valid = await publicClient.verifySiweMessage({ メッセージ、 アドレス, シグネチャー, });
if (!valid) { 新しいError("無効な署名")をスローします。 }
const token = jwt.sign({ アドレス }, JWT_SECRET, { expiresIn: "1h" }); 戻り値 Response.json({ data: token }); }
! SIWEマニュアル:Dappをより強力にする方法は?
パフォーマンス最適化
検証速度を向上させるために、専用のノードサービスの使用をお勧めします。デフォルトのRPCを置き換えるためにZANのノードサービスを使用できます。
JavaScriptの const publicClient = createPublicClient({ チェーン: メインネット, transport: http('), // ZAN ノードサービス RPC });
これにより、インターフェースの応答速度が大幅に向上します。
! SIWEマニュアル:Dappをより強力にする方法は?