MetaMaskは、何千万ものユーザーにとってEthereumへの主要な入り口であり、dAppを運営している場合、MetaMask APIはあなたのUIとユーザーの署名キーの間を繋ぐものです。「MetaMask API」は、二つの要素が組み合わさったものです。一つはEIP-1193によって定義される、注入されたwindow.ethereumプロバイダー。もう一つは、その同じインターフェースをモバイルアプリ、React Native、Node.jsバックエンドに拡張するMetaMask SDKです。このプロバイダーを学ぶことで、ウェブ上のあらゆるウォレット統合の80%を習得したことになります。
このガイドでは、プロバイダーの検出、アカウントのリクエスト、現在のチェーンの読み取り、personal_signとEIP-712を使用したメッセージの署名、トランザクションの送信、チェーンの追加または切り替え、そしてブラウザ拡張機能の外でMetaMask SDKを使用する方法を説明します。また、ethers.js v6やviemがより高レベルのラッパーとしてどのように適合するか、そして使い捨てのフロントエンドコードを書かずに基盤となるJSON-RPC呼び出しをテストしたい場合にApidogがワークフローにどのように組み込まれるかについても説明します。
ウォレットに関連するものを構築している場合は、プロバイダーの状況をより広く理解するために、このガイドと最高の暗号ウォレットAPIに関する私たちのガイドを一緒にブックマークしてください。
要点
- MetaMask APIは、ブラウザの
window.ethereumで公開されるEIP-1193プロバイダーと、モバイルおよびNode用のMetaMask SDKです。 eth_requestAccountsでユーザーに接続を促し、その後accountsChangedとchainChangedをリッスンします。personal_signでメッセージを署名し、eth_signTypedData_v4(EIP-712)で構造化データを署名します。wallet_switchEthereumChain(EIP-3326)でネットワークを切り替え、wallet_addEthereumChain(EIP-3085)で新しいネットワークを追加します。- ethers.js v6、viem、wagmiのような高レベルライブラリは生のプロバイダーをラップし、SnapsはMetaMask自体を拡張します。
- Apidogを使用して、JSON-RPCエンドポイントをテストし、トランザクション応答をモックし、デプロイ前に署名をデバッグします。
MetaMask APIとは?
MetaMask APIは、MetaMaskがウェブページやアプリに公開する、EthereumおよびEVM互換チェーンとやり取りするためのインターフェースです。ブラウザでは、拡張機能がwindow.ethereumにプロバイダーオブジェクトを注入し、そのオブジェクトはEIP-1193標準に準拠しています。この標準をターゲットとするdAppは、MetaMask、Coinbase Wallet、Rabby、Frame、その他多数のウォレットと、コード変更なしで動作します。
ブラウザの外では、MetaMask SDKがReact Native、純粋なNode.js、デスクトップElectronアプリ、さらにはサーバーサイドスクリプトでも同じプロバイダーの形式を提供します。SDKは、デスクトップまたはバックエンドプロセスによって要求されたトランザクションをモバイルMetaMaskウォレットが署名できるようにするディープリンクとQRコードの処理を行います。その内部ではEIP-1193に準拠しているため、アプリのコードはほとんど変更されません。
MetaMaskはまた、サードパーティが新しいチェーン、カスタムRPCメソッド、アカウントタイプでウォレットを拡張できるプラグインシステムであるSnapsも提供しています。Snapsはここでは範囲外ですが、非EVMチェーンやMetaMask自体でのカスタム署名フローをサポートしたい場合には知っておく価値があります。
認証とセットアップ
プロバイダー自体にAPIキーはありません。認証とは、ユーザーがウォレットUIで各リクエストを承認することです。必要なものは2つあります。プロバイダーを検出する方法と、変更をリッスンする方法です。
まず検出から始めます。@metamask/detect-providerヘルパーは、複数のウォレットがインストールされているなどのエッジケースを処理しますが、直接チェックすることもできます。
// Vanilla JS detection
import detectEthereumProvider from '@metamask/detect-provider';
const provider = await detectEthereumProvider({ mustBeMetaMask: true });
if (!provider) {
alert('Please install MetaMask');
} else {
console.log('MetaMask detected');
}
プロバイダーを取得したら、何かをリクエストする前にイベントリスナーを接続します。accountsChangedイベントを見逃すことは、MetaMask統合で最も一般的なバグです。
window.ethereum.on('accountsChanged', (accounts) => {
if (accounts.length === 0) {
console.log('User disconnected');
} else {
console.log('Active account:', accounts[0]);
}
});
window.ethereum.on('chainChanged', (chainId) => {
// Best practice: reload the page on chain change
window.location.reload();
});
Reactアプリの場合、wagmiはこれらすべてを処理し、注入されたコネクタを介してMetaMaskを自動的に検出します。
主要エンドポイント
すべてのプロバイダー呼び出しはwindow.ethereum.request({ method, params })を介して行われます。メソッド名はJSON-RPC文字列であり、paramsはメソッドに応じて配列またはオブジェクトです。以下に、dApp統合の95%をカバーする呼び出しを示します。
アカウントをリクエストし、チェーンを読み取る
// Prompt the user to connect
const accounts = await window.ethereum.request({
method: 'eth_requestAccounts',
});
const account = accounts[0];
// Read the current chain
const chainId = await window.ethereum.request({
method: 'eth_chainId',
});
console.log(account, chainId); // '0x...' '0x1' (Ethereum mainnet)
任意のEthereumノードに送信できる、同等の生のJSON-RPC呼び出しは、curlでは次のようになります。
curl https://mainnet.infura.io/v3/YOUR_KEY \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
読み取り専用の呼び出しの場合、MetaMaskはまったく必要ありません。AlchemyやInfuraのようなノードプロバイダーが同じRPCを提供します。ホストされたEthereumノードに関する全容については、私たちのAlchemy APIガイドをご覧ください。
簡単なメッセージに署名する
personal_signは、伝統的な人間が読める署名です。メッセージにプレフィックスを付けることで、ユーザーが任意のトランザクションバイトに署名するよう騙されるのを防ぎます。
const message = 'Sign in to Apidog at ' + new Date().toISOString();
const signature = await window.ethereum.request({
method: 'personal_sign',
params: [message, account],
});
EIP-712で構造化データに署名する
許可証やログインチャレンジのような複雑なものには、eth_signTypedData_v4を使用します。MetaMaskは確認ポップアップでフィールドをきれいに表示し、ユーザーを保護し、信頼を築きます。
const typedData = {
domain: { name: 'Apidog Demo', version: '1', chainId: 1 },
types: {
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
],
Login: [
{ name: 'wallet', type: 'address' },
{ name: 'nonce', type: 'uint256' },
],
},
primaryType: 'Login',
message: { wallet: account, nonce: 42 },
};
const sig = await window.ethereum.request({
method: 'eth_signTypedData_v4',
params: [account, JSON.stringify(typedData)],
});
トランザクションを送信する
トランザクションはeth_sendTransactionを使用します。MetaMaskはガス見積もりとノンス管理を自動的に処理します。
const txHash = await window.ethereum.request({
method: 'eth_sendTransaction',
params: [{
from: account,
to: '0xRecipientAddressHere',
value: '0x38d7ea4c68000', // 0.001 ETH in wei, hex
}],
});
チェーンを切り替える、または追加する
EIP-3326とEIP-3085は、既知のチェーンへの切り替えと新しいチェーンの追加を扱います。
// Switch to Polygon (chainId 137 = 0x89)
try {
await window.ethereum.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: '0x89' }],
});
} catch (err) {
if (err.code === 4902) {
// Chain not added yet
await window.ethereum.request({
method: 'wallet_addEthereumChain',
params: [{
chainId: '0x89',
chainName: 'Polygon',
rpcUrls: ['https://polygon-rpc.com'],
nativeCurrency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 },
}],
});
}
}
MetaMask SDKをReactで使用する
SDKは、デスクトップ拡張機能、モバイルディープリンク、アプリ内ブラウザをカバーする単一の統合パスが必要な場合、通常のReactでもうまく機能します。
import { MetaMaskProvider, useSDK } from '@metamask/sdk-react';
function Connect() {
const { sdk, connected, account } = useSDK();
return (
<button onClick={() => sdk?.connect()}>
{connected ? account : 'Connect MetaMask'}
</button>
);
}
export default function App() {
return (
<MetaMaskProvider sdkOptions={{ dappMetadata: { name: 'My dApp' } }}>
<Connect />
</MetaMaskProvider>
);
}
プロダクションアプリの場合、生のプロバイダーをethers.js v6またはviemでラップします。これらは、基盤となるMetaMask APIと通信しながらも、型付きコントラクト、ABIデコーダ、およびより良いエラーメッセージを提供します。フォールバックとしてメールまたはソーシャルログインも必要な場合は、Privy APIガイドを介してMetaMaskと埋め込みウォレットを組み合わせます。
一般的なエラーとレート制限
MetaMaskは標準のJSON-RPCエラーコードを返します。最も頻繁に遭遇するのは次のとおりです。
4001: ユーザーがリクエストを拒否しました。「接続がキャンセルされました」というメッセージを表示し、自動的に再試行しないでください。4100: 権限なし。アカウントが接続されていません。まずeth_requestAccountsを呼び出してください。4200: 未サポートのメソッド。まれですが、ベンダー固有のメソッドを呼び出す前に、ウォレットがMetaMaskであることを確認してください。4902: チェーンが追加されていません。wallet_addEthereumChainで追加してください。-32002: リクエストは既に保留中です。ユーザーがボタンを2回クリックすることがあります。あなたの側でデバウンス処理を行ってください。
プロバイダー自体にはレート制限はありませんが、基盤となるRPCにはあります。InfuraまたはAlchemyを介して読み取りをプロキシしている場合、それらのティアに縛られます。ETHからUSDへの変換のようなフィアットフローの場合、ほとんどのチームはこの統合をフィアットのオンランプおよびオフランプAPIと組み合わせて、ユーザーがdAppを離れることなくチャージできるようにしています。
MetaMask APIの料金
MetaMask拡張機能とSDKは無料です。接続ごと、署名ごと、トランザクションごとに料金はかかりません。MetaMaskは、ユーザーがウォレット内で取引する際のスワップ手数料とMetaMaskカードを通じて収益を得ており、dApp開発者からは得ていません。
支払うコストは、dAppが読み取りのためにアクセスするRPCエンドポイントから発生します。無料のAlchemyまたはInfuraティアはほとんどの小規模アプリに対応しますが、プロダクションdAppは通常、専用のスループットに対して月額49ドルから299ドルかかります。
ApidogでMetaMask APIをテストする
ブラウザベースの署名は、リクエストフローが拡張機能、ページ、そして時にはモバイルのディープリンクにまたがるため、デバッグが困難です。そこでApidogがウォレット開発ツールキットとしての地位を確立します。dAppが使用する生のJSON-RPCエンドポイントにアクセスし、eth_chainIdとeth_getBalanceが期待どおりの値を返すことを確認し、そのフロー全体をテストスイートとして保存できます。
Ethereum JSON-RPC仕様をインポートし、ノードURLを環境変数として設定すれば、すべてのEVMチェーンで再利用可能なコレクションが手に入ります。Apidogは応答のモックも行うため、スマートコントラクトがまだ監査中であっても、フロントエンド開発者は偽のeth_sendTransactionに対して開発を進めることができます。CIの場合、同じコレクションをコマンドラインから実行し、応答の形式が変更された場合にビルドを失敗させることも可能です。チーム間で同期しないPostmanコレクションに苦労してきたなら、2026年のPostmanなしのAPIテストに関する私たちのガイドが、ApidogがなぜマルチプロトコルdAppテストをより良く処理するのかを説明します。
開始するには、Apidogをダウンロードしてください。
よくある質問
- MetaMask APIはモバイルで動作しますか?はい、動作します。MetaMask SDKを使用してください。これは署名のためにモバイルアプリにディープリンクします。プロバイダーのインターフェースはブラウザ拡張機能と同一なので、コードは変更されません。他のモバイルウォレットSDKとのより詳細な比較については、私たちの最高の暗号ウォレットAPIのまとめをご覧ください。
eth_sign、personal_sign、eth_signTypedData_v4の違いは何ですか?eth_signは生のバイトに署名するため危険です。MetaMaskはユーザーに強く警告します。personal_signは人間が読めるメッセージにプレフィックスを付けます。eth_signTypedData_v4は構造化されたEIP-712データに署名し、MetaMask UIできれいにフィールドを表示します。後者の2つを使用し、eth_signは避けてください。- MetaMaskとは別にAPIキーが必要ですか?いいえ、プロバイダーは無料でキーは不要です。ウォレット外での読み取りには、AlchemyやInfuraのようなRPCプロバイダーが必要で、これらには独自のキーがあります。
- ethers.jsやviemをMetaMaskと一緒に使用できますか?はい、どちらも
window.ethereumプロバイダーをラップします。Ethers v6はBrowserProvider(window.ethereum)を公開し、viemはcreateWalletClient({ transport: custom(window.ethereum) })を持っています。ほとんどのプロダクションdAppは、これらのいずれかを使用しています。 - ユーザーが複数のウォレットをインストールしている場合はどうなりますか?MetaMaskはEIP-6963を実装しているため、dAppは
window.ethereumを取り合うことなく、インストールされているすべてのウォレットを検出できます。WagmiとRainbowKitはこれを自動的に処理します。 - MetaMask Snapsはプロダクション対応していますか?はい、Snapsは2024年に一般公開されました。ほとんどのプロダクションでの使用は、非EVMチェーンのサポート、カスタムトランザクションインサイト、およびハードウェアウォレットの統合のためです。
