MetaMask API の使い方: dApp を Ethereum ウォレットに接続

Ashley Innocent

Ashley Innocent

23 4月 2026

MetaMask API の使い方: dApp を Ethereum ウォレットに接続

Apidog エンタープライズ

オンプレミスデプロイ

SSO & RBAC

SOC 2 準拠

Apidog Enterpriseを見る

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とは?

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エラーコードを返します。最も頻繁に遭遇するのは次のとおりです。

プロバイダー自体にはレート制限はありませんが、基盤となる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_chainIdeth_getBalanceが期待どおりの値を返すことを確認し、そのフロー全体をテストスイートとして保存できます。

Ethereum JSON-RPC仕様をインポートし、ノードURLを環境変数として設定すれば、すべてのEVMチェーンで再利用可能なコレクションが手に入ります。Apidogは応答のモックも行うため、スマートコントラクトがまだ監査中であっても、フロントエンド開発者は偽のeth_sendTransactionに対して開発を進めることができます。CIの場合、同じコレクションをコマンドラインから実行し、応答の形式が変更された場合にビルドを失敗させることも可能です。チーム間で同期しないPostmanコレクションに苦労してきたなら、2026年のPostmanなしのAPIテストに関する私たちのガイドが、ApidogがなぜマルチプロトコルdAppテストをより良く処理するのかを説明します。

開始するには、Apidogをダウンロードしてください。

よくある質問

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる