Ethereum の取引エラー解説:各メッセージの意味と直し方

EVM のエラーメッセージを直し方つきで解読。執筆:ChainGate.

Ethereum の取引エラーとは、ノードがあなたの取引を拒否した、または失敗させた理由です。「nonce too low」はその取引番号がすでに使われているという意味なので、ウォレットを更新してください。「replacement transaction underpriced」は高速化やキャンセルで手数料を十分に上げていないという意味なので、10 パーセント以上引き上げてください。「intrinsic gas too low」は gas limit が取引の基本コストを下回っているという意味なので、引き上げてください(単純な送金の最小値は 21,000 です)。「insufficient funds for gas * price + value」はアカウントが送金額と最大手数料の合計をまかなえないという意味なので、ネイティブコインを追加してください。「execution reverted」はコントラクトが呼び出しを拒んだという意味で、手数料ではなく入力の問題です。

拒否はどれも gas を消費しません。取引がブロックに届いていないからです。gas を消費するのは、ブロックに取り込まれた取引の「out of gas」と「execution reverted」の 2 つです。ネットワークは処理を行い、その処理が失敗し、手数料はそれでも支払われます。

メッセージは短く、それについてのフォーラムのスレッドは長く、そのほとんどは答えのないまま終わります。このガイドでは Ethereum のノードソフトウェアが出力する文字列そのものを取り上げ、それぞれが何を検査しているのかを説明し、失敗した試みに費用がかかったのかどうかを伝え、ウォレット利用者向けと開発者向けの直し方を示します。同じメッセージは Base、Arbitrum、Optimism、Polygon、BNB Smart Chain をはじめ、他のすべての EVM ネットワークにも現れます。同じノードのコードを共有しているからです。

要約

  • エラーには 2 つの系統があります。 取引がブロックに入る前の拒否(nonce、手数料、資金、gas limit)には費用がかかりません。取り込み後の失敗(out of gas、execution reverted)には手数料が全額かかります。
  • 文字列は go-ethereum に由来します。nonce too low · replacement transaction underpriced · intrinsic gas too low · insufficient funds for gas * price + value はネットワークではなく取引そのものに対する検査です。
  • ほとんどは一行で直せます。ウォレットを更新する、手数料を 10 パーセント以上引き上げる、gas を足す、ネイティブコインを補充する、のいずれかです。
  • 「estimate gas」で失敗する dapp は、そのコントラクト呼び出しがリバートすることを伝えています。入力を変えてください。gas limit を上げても役に立ちません。

1. このエラーメッセージはどこから来るのか?

ほぼすべてのウォレット、ライブラリ、RPC プロバイダーは、最も広く運用されている Ethereum クライアントであるgo-ethereumが生成するエラーテキストをそのまま通し、Layer 2 ネットワークのクライアントも同じ文字列を再利用しています。MetaMask はそれを自前のダイアログで包み、ethers.js は NONCE_EXPIRED や REPLACEMENT_UNDERPRICED といったコードを添え、RPC プロバイダーはコード -32000 の JSON-RPC エラーとして返します。その下にあるメッセージは同じです。

ノードは 2 種類の異なる検査を行います。1 つ目は取引を受け取ったときです。nonce は正しいか、手数料は受け入れられるか、gas limit は妥当か、送信者は支払えるか。ここで失敗した取引は破棄され、オンチェーンには何も記録されません。2 つ目は取引がブロックの中で実行されるときです。コントラクトのコードがリバートせずに gas limit 内で完了するか。ここで失敗した取引はそれでもブロックに取り込まれ、エクスプローラーでは Fail ステータスで表示され、手数料は消費されます。

エラーがどちらの系統に属するかがわかれば、2 つのことが同時にわかります。お金を失ったのかどうか、そして直すべきなのが自分の側(取引)なのかコントラクトの側(入力)なのかです。

2. クイックリファレンス:よくあるエラー一覧

正確な文字列を、出会う可能性の高い順に並べました。文言は go-ethereum のソースによるもので、ウォレットが短縮することもあります。

エラーメッセージ意味gas はかかる?直し方
nonce too lowこの nonce の取引はすでに承認済みいいえウォレットを更新。再送前にエクスプローラーを確認
nonce too highそれより小さい nonce がまだ欠けていて、この取引はまだ実行できないいいえ欠けている nonce を送るか消す。ローカルチェーンの再起動後は開発用ウォレットをリセット
replacement transaction underpriced保留中の取引と同じ nonce で、手数料の引き上げが足りないいいえ2 つの手数料項目を両方とも 10 パーセント以上引き上げる
transaction underpriced手数料がノードの最低額を下回っているいいえmax fee と priority fee を上げる
insufficient funds for gas * price + value残高が、送金額に gas limit × max fee を足した額に足りないいいえネイティブコイン(ETH、POL、BNB)を追加するか、送金額を減らす
intrinsic gas too lowgas limit が取引の固定の基本コストを下回っているいいえgas limit を上げる。単純な送金なら 21,000
exceeds block gas limit / transaction gas limit too highgas limit がブロックの許容量より大きい、または 16,777,216 の上限を超えているいいえgas limit を下げる
max fee per gas less than block base feemax fee が現在の base fee を下回っているいいえmax fee を上げるか、base fee が下がるのを待つ
max priority fee per gas higher than max fee per gasチップが手数料全体の上限より高く設定されているいいえpriority fee を max fee 以下にする
already knownノードはこの取引そのものをすでに持っているいいえ何もしない。承認を待つ
invalid sender署名から送信者を復元できない。たいていはチェーンIDの不一致いいえRPC が返すチェーンIDで署名する
execution revertedコントラクトのコードが呼び出しを拒否したブロックに取り込まれた場合のみ入力を直す:承認額、スリッページ、残高、期限
out of gasブロック内の実行が gas limit を超えたはいより高い gas limit で再送

3. 「nonce too low」とは?

すべてのアカウントは自分の取引にゼロから番号を振り、各番号は一度しか使えません。「nonce too low」は、いま送った取引が、そのアカウントについてネットワークがすでに承認済みの番号を持っているという意味です。ノードは取引の nonce をアカウントの次に期待される nonce と比べ、それより小さいものはすべて拒否します。

起きるのは、ウォレットが考える次の nonce が古くなっているときです。同じアカウントから別のウォレットや端末で取引を送った、高速化やキャンセルがすでにその番号を使った、あるいはローカルの開発チェーンを再起動してアカウントのカウンターがゼロに戻ったのに MetaMask は数え続けていた、といった場合です。ハードウェアウォレットでは、取引に二度署名したときにも出ます。

直し方は、ウォレットに再同期させることです。まずエクスプローラーでアドレスを調べてください。やろうとしていたことがその nonce ですでに通っているなら、再送してはいけません。ウォレットが古い番号を出し続けるなら、MetaMask の「Delete activity and nonce data」(アクティビティと nonce データを削除)オプション(設定、開発者ツール)が現在のネットワークのローカルカウンターを消去します。MetaMask は、この操作は元に戻せず、現在のネットワークにのみ影響し、残高には触れないと注記しています。コードでは、自前のカウンターを持つ代わりに、署名前に eth_getTransactionCount を「pending」タグで呼んで次の nonce を読み取ってください。

4. 「nonce too high」とは?

逆方向のずれです。取引の nonce がアカウントの次に期待される値より大きいので、穴があります。それより小さい番号がまだ承認されていないのです。ノードはそのような取引を実行せずにキューに保持し、一部のノードはこのメッセージで即座に拒否します。

典型的な原因は、一連の取引のうち先行するものが破棄された場合や、逆方向のローカルチェーンのリセット(チェーンはリセットしたがウォレットはしていないので、nonce 0 を期待するチェーンにウォレットが nonce 40 を送る)です。欠けている nonce を送って穴を埋めるか、上記のとおりウォレットのアクティビティデータを消去してください。

5. 「replacement transaction underpriced」とは?

保留中の取引を置き換えよう(高速化、キャンセル、または単に同じ nonce で再送)としたのに、新しい取引が古いものより十分に多く支払っていません。ノードが保留中の取引を同じ nonce の別の取引と入れ替えるのは、手数料が最低限の割合だけ上がっている場合に限られます。go-ethereum ではその引き上げ幅のデフォルトは 10 パーセントで、max fee と priority fee の両方に適用されます。

nonce は正しく、価格が問題です。2 つの手数料項目を両方とも、現在のネットワーク相場ではなく保留中の取引に対して 10 パーセント以上引き上げてください。関連する「transaction underpriced」ダイアログについての MetaMask 自身の案内は、priority fee を 10 パーセント以上、max fee を 30 パーセント以上高くすることです。代わりにキャンセルするには、MetaMask のエラーガイドにあるとおり、同じ nonce と引き上げた手数料で自分のアドレスに 0 ETH を送ります。どちらの場合も置き換えた取引には新しいトランザクションハッシュが付き、古い方は破棄されます。

6. 「transaction underpriced」とは?

「replacement」という語がない場合は単純な価格検査です。取引の手数料が、ノードがプールに保持してもよいと考える額を下回っています。ノードはスパムを締め出すために最低 gas 価格を設定しており、混雑時にはウォレットの「低」の手数料見積もりがそれを下回ることがあります。兄弟にあたるメッセージ「transaction gas price below minimum」も同じ意味です。

max fee と priority fee を上げて再送してください。オンチェーンには何も記録されていないので、消すべき詰まった取引はありません。あるネットワークで繰り返し見るなら、そのネットワークの最低額がウォレットのデフォルトより高いということです。ガストラッカーのネットワーク別ページに相場が載っています。

7. 「insufficient funds for gas * price + value」とは?

送信者のネイティブコイン残高は、送金額に最悪ケースの手数料、つまり gas limit に max fee per gas を掛けたものを足した額をまかなえなければなりません。この規則はEIP-1559に書かれています。署名者は value に加えて gas_limit に max_fee_per_gas を掛けた額を支払える必要があります。ノードはこれを取引が実際にかかる額ではなく最大額に対して検査するので、最終的な手数料なら収まったはずの取引でもこの検査に落ちることがあります。

原因は 3 つでほぼすべてのケースを網羅します。トークンは持っているがネイティブコインがない。Base の USDC には gas 用の ETH が、Polygon の USDT には POL が、BNB Smart Chain のものには何であれ BNB が必要です。残高全額を送ろうとして手数料の分を残していない。先に最大手数料を差し引いてください。あるいはコントラクト呼び出しで gas limit が膨らみ、最悪ケースが実際のコストをはるかに上回っている。

直し方は、ネイティブコインを補充する、送金額を減らす、または水増しされているなら max fee や gas limit を下げることです。関連する「insufficient funds for transfer」は、gas を考慮する以前に送金額だけで残高を超えているという意味です。

8. Intrinsic gas too low、out of gas と gas limit のエラー

gas limit に関わるメッセージは 4 つあり、失敗する時点がそれぞれ異なります。「Intrinsic gas too low」は取り込み前の拒否です。すべての取引にはコードが実行される前の固定の基本コストがあり、単純な送金で 21,000 gas にデータ 1 バイトごとの料金を加えたものですが、あなたの gas limit はそれを下回っています。ethereum.org の gas ドキュメントは標準的な送金を 21,000 単位としています。トークン送金やコントラクト呼び出しにはもっと必要です。上限を上げるか、ウォレットやライブラリに見積もらせてください。

「Out of gas」は取り込み後の版です。上限は基本コストをまかない、取引はブロックに取り込まれ、その後コントラクトのコードが上限以上を必要としました。EVM はすべての状態変更をリバートしますが、同じドキュメントが述べるとおり、提供された gas は行われた処理のためにすべて消費されます。手数料は失われ、取引はエクスプローラーで失敗と表示されます。より高い上限で再送してください。ウォレットが見積もりに余裕を上乗せするのはこのためです。

「Exceeds block gas limit」は、設定した上限がそのネットワークでブロック 1 つが収容できる量より大きいという意味です。「Transaction gas limit too high」はより新しいもので、EIP-7825以降、1 つの取引が要求できる gas は 16,777,216(2 の 24 乗)までとなり、この上限を超える取引は拒否されます。どちらも上限を下げれば直ります。正当な取引がその数字に近い量を必要とすることはありません。

9. Max fee と priority fee のエラー

EIP-1559 以降、取引は 2 つの手数料項目を持ちます。1 単位あたりに支払う最大額である max fee per gas と、バリデーターへのチップである max priority fee per gas です。プロトコルはこの 2 つとブロックの base fee の間に 2 つの関係を強制し、それぞれに固有のエラーがあります。

「Max fee per gas less than block base fee」。max fee が現在の base fee を下回っているので、どんなチップを付けても取引を取り込めません。静かな時間帯に署名して base fee が上がってからブロードキャストした取引や、手数料をハードコードして組み立てた取引で起こります。max fee を上げるか、待ってください。base fee はブロックごとに動くので、あなたの上限を下回れば取引は再び有効になります。

「Max priority fee per gas higher than max fee per gas」。チップが全体の上限を超えています。base fee が先に充当され、チップは残りからしか出せないため、仕様はこれを禁じています。priority fee を max fee 以下に設定してください。正しく組み立てられた取引は、max fee がおおよそ base fee の 2 倍にチップを足した額になっていて、待っている間に base fee が上がる余地が残ります。

10. 「execution reverted」とは?

呼び出したコントラクトが意図的に実行を停止しました。Solidity の require、revert、assert 文はすべてこのメッセージで終わり、多くの場合コントラクト自身の理由文字列が続きます。「ERC20: transfer amount exceeds allowance」「UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT」「Pausable: paused」などです。理由が空のときは「execution reverted」だけ、または生のエラーデータだけが見えます。

ほとんどの場合、送信前に目にします。ウォレットが eth_estimateGas で呼び出しを通し、そのシミュレーションがリバートするからで、MetaMask はその場合 gas を見積もれないと報告します。これは安く済む版で、何も送られていません。高くつく版は、シミュレーションを通り、ブロックに取り込まれ、その間に状態が変わったためにオンチェーンでリバートした取引です(スワップ価格がスリッページを超えて動いた、最後の 1 点を誰かが先に買った、期限が過ぎた)。エクスプローラーでは Fail と表示され、手数料は支払われます。

直し方が gas limit の引き上げであることは決してありません。理由文字列を読み、入力を変えてください。先にトークンを承認する、スリッページを広げるか送金額を減らす、コントラクトが一時停止されていないか確認する、コントラクトが存在するネットワークにいることを確認する、などです。取り込まれた失敗についてはエクスプローラーの取引ページがリバート理由を表示しており、Etherscan のガイドにその見つけ方が載っています。

11. Already known、invalid sender、oversized data

「Already known」は実用上の意味ではエラーではありません。ノードは送った取引そのものをすでに保持しています。たいていはライブラリがブロードキャストを再試行したか、2 つのウォレットが同じ署名済みバイト列を送ったためです。元の取引の承認を待ってください。

「Invalid sender」は、ノードが署名から有効な署名者を復元できなかったという意味です。EIP-155 以降はチェーンIDが署名対象の一部なので、チェーン 1 向けに署名してチェーン 137 に送った取引は無意味な値に復元され、拒否されます。署名設定のチェーンIDを RPC エンドポイントが返すものと照らし合わせてください。チェーンID一覧に番号と不一致のケースが載っています。

「Oversized data」は取引のバイトサイズがノードがプールに受け入れる上限を超えているという意味で、非常に大きなコントラクトのデプロイや calldata でしか起きません。データを分割するか、ファクトリー経由でデプロイしてください。

12. 失敗した取引に gas はかかる?

どこで失敗したかによります。このガイドの 1 つ目の系統(nonce、underpriced、insufficient funds、intrinsic gas、手数料上限、already known、invalid sender、oversized data)はすべて拒否です。ノードが取引を破棄し、どのブロックにも含まれていないので、手数料は請求されず、エクスプローラーには何も見つかりません。再送に追加の費用はかかりません。

「Out of gas」と、取り込まれた取引の「execution reverted」は 2 つ目の系統です。取引は Fail ステータスでブロックに入っており、バリデーターは処理を行い、手数料は全額支払われます。ethereum.org のドキュメントは、取引が成功しても失敗しても手数料は支払われると明言しています。動かそうとした ETH やトークンは元の場所に残り、失われるのは手数料だけです。

13. コードでこれらのエラーを避けるには

4 つの習慣で、この一覧の大半を送信サービスから取り除けます。カウンターを持つ代わりにノードから pending の nonce を読む、いまいるネットワークの手数料見積もりをノードから取る、署名前に gas を見積もって余裕を加える、ブロードキャスト前に残高を送金額と最悪ケースの手数料の合計と照らす、の 4 つです。ChainGate SDK は transfer() の中でこの 4 つすべてを行い、自分で処理しなければならない唯一のケースを型付きエラーとして表面化させます:

import { ChainGate, importWallet, NotEnoughFundsError } from 'chaingate';

const cg = new ChainGate({ apiKey: process.env.CHAINGATE_API_KEY });
const wallet = importWallet({ phrase: process.env.MNEMONIC });
const eth = cg.connect(cg.networks.ethereum, wallet);

try {
  // Nonce, gas limit and EIP-1559 fees are read from the node for you
  const tx = await eth.transfer(cg.networks.ethereum.amount('0.05'), '0x...');
  tx.setFee(tx.recommendedFees().normal);

  if (!tx.enoughFunds()) {
    // amount + worst-case fee exceeds the balance: nothing is broadcast
    console.log('short by', tx.missingFunds());
    return;
  }

  const sent = await tx.signAndBroadcast();
  console.log(sent.transactionId);
} catch (err) {
  if (err instanceof NotEnoughFundsError) {
    console.error('Not enough ETH for amount + fee');
  }
  throw err;
}

Ethereum と UTXO チェーンの流れ全体はJavaScript で暗号資産を送るチュートリアルが示しており、transfer のドキュメントには手数料の段階と、ネイティブコインがちょうどいくら不足しているかを教えてくれる missingFunds フィールドが載っています。

14. 次に読むもの

これらのエラーの多くは手数料に関するものなので、次に読むページはガス代とは何か、max fee、priority fee、base fee がどう組み合わさるのかで、続いてガストラッカーで各ネットワークの今の相場を確認してください。取引が実際に送信されていて、それがどうなったかを知る必要があるなら、トランザクションハッシュのガイドが調べ方を示しています。そして Ethereum、EVM の Layer 2、Bitcoin にわたって nonce、手数料、残高の検査を処理する TypeScript ライブラリなら、ChainGate がこのサイトの裏にある SDK です。

よくある質問

MetaMask の「nonce too low」とは?

MetaMask が使おうとした取引番号は、そのアカウントについてすでに承認済みです。たいていは別のウォレットや端末、または高速化が先にそれを使ったか、ローカルチェーンがリセットされたためです。エクスプローラーで操作がすでに通っているか確認し、それから MetaMask のそのネットワークのアクティビティと nonce データを消去して再同期させてください。

「replacement transaction underpriced」はどう直す?

置き換える取引の max fee と priority fee を両方とも、置き換えられる取引より 10 パーセント以上上げてください。go-ethereum のデフォルトの最小引き上げ幅は 10 パーセントです。高速化ではなくキャンセルするには、同じ nonce とより高い手数料で自分宛てに 0 ETH を送ります。

「intrinsic gas too low」とは?

取引の gas limit が固定の基本コストを下回っています。基本コストは単純な ETH 送金で 21,000 gas、トークン送金やコントラクト呼び出しではそれ以上です。gas limit を上げるか、ウォレットに見積もらせてください。取引は取り込み前に拒否されたので、手数料はかかっていません。

「insufficient funds for gas * price + value」とは?

アカウントのネイティブコイン残高が、送金額に gas limit × max fee per gas を足した額に足りません。トークンを持っているだけでは足りず、gas は Ethereum と Base では ETH、Polygon では POL、BNB Smart Chain では BNB で支払います。ネイティブコインを補充するか、送る額を減らしてください。

「execution reverted」に gas はかかる?

取引がブロックに取り込まれた場合だけです。ウォレットが gas 見積もりの段階で報告したなら、何も送られておらず、何も請求されていません。取り込まれた取引がリバートした場合は手数料が全額支払われ、エクスプローラーには Fail ステータスが表示されます。

gas limit を設定したのに取引が「out of gas」で失敗するのはなぜ?

その上限は受け入れられるには十分でも、実行されたコントラクトのコードには足りませんでした。EVM は変更をリバートし、提供された gas をすべて消費するので、手数料は失われます。より高い上限で再送してください。eth_estimateGas の見積もりに余裕を加えればこれを避けられます。

「max fee per gas less than block base fee」とは?

取引の max fee が現在の base fee を下回っているため、どのブロックにも取り込めません。max fee を上げるか、base fee があなたの上限を下回るまで待ってください。以前にハードコードした手数料で署名した取引でよく起こります。

拒否された取引に費用はかかる?

かかりません。nonce too low、transaction underpriced、insufficient funds、intrinsic gas too low のような拒否は取引がブロックに入る前に起きるので、手数料は請求されず、エクスプローラーにも何も表示されません。手数料がかかるのは、取り込まれた取引が gas 切れになるかリバートした場合だけです。

これらのエラーは Base、Arbitrum、Polygon、BNB Smart Chain でも同じ?

同じです。これらのネットワークは同じコードから派生した EVM クライアントを動かしているので、メッセージも nonce の規則も手数料の検査も同じです。異なるのは金額で、gas は各ネットワークのネイティブコインで支払い、最低手数料は Ethereum メインネットよりはるかに低くなります。

ChainGate で構築する

アイデアをコードに落とし込みましょう — ChainGate は Ethereum と 20 以上のブロックチェーン向けのウォレット、トランザクション、マネージド RPC を 1 つのライブラリで提供します。