Polygonネットワークでトランザクションを快適に通す方法
対象者
- ethers.jsを利用している方
- Polygonのようなレイヤー2ソリューションで構築されたネットワークを利用している方
結論
EIP1559のプロトコルを用いて十分なpriority fee
を設定してトランザクションを発行することで快適にトランザクションを通すことが可能になります。
適切なpriority fee
はPolygonに限らず、各ネットワークのGas Stationから確認することが可能です。今回例に挙げるPolygonネットワークでのpriority fee
は、Polygon Gas Stationのエンドポイントを叩くだけで簡単に適切な値を確認できます。以下は、実際に著者がcurl
を用いてエンドポイントを叩いた結果です。
curl https://gasstation-mainnet.matic.network/v2
{"safeLow":{"maxPriorityFee":30.483141240733335,"maxFee":30.483141250733336},"standard":{"maxPriorityFee":32.58761522646667,"maxFee":32.58761523646667},"fast":{"maxPriorityFee":38.90418547033334,"maxFee":38.90418548033334},"estimatedBaseFee":1e-8,"blockTime":6,"blockNumber":26530960}
上記のmaxPriorityFee
(+maxFee
)を用いて1MATICを送金するトランザクションは、ethers.jsを利用する場合以下ようになります。ここではfast
の値を利用しています。
const tx = await signer.sendTransaction({
to: toAddress,
value: ethers.utils.parseEther('1'),
maxFeePerGas: ethers.utils.parseUnits(38.90418548033334.toFixed(9), 'gwei'),
maxPriorityFeePerGas: ethers.utils.parseUnits(38.90418547033334.toFixed(9), 'gwei'),
});
上記のトランザクションはおそらく快適に通るのではないかと思います。トランザクションがなかなか通らない方は、上記の方法を試してみてください。
Gas代の決定方法
EthereumにおけるGas代の決定方式は、トランザクションの種類から以下の2つが存在しています。
- Legacy transactions
- Type 2 EIP-1559 transasctions
Legacy方式の詳細はここでは述べず、新しいEIP-1559の方式について簡単に解説します。EIP-1559におけるGas代計算に用いられる各変数は以下の通りです。
-
baseFeePerGas
- 基本手数料(必ず支払う必要がある)
- ブロック固有のもの
- EIP1559プロトコルによって自動的に決定される
- マイナーに支払われずにburnされる
-
maxPriorityFeePerGas
- マイナーに対するチップ(オプション)
- ユーザが任意の値を設定可能
-
maxFeePerGas
- 最大手数料
最終的なトランザクションの手数料は、上記の3つの変数を利用して以下のように計算されます。
Total fee = min(maxFeePerGas
, baseFeePerGas
+ maxPriorityFeePerGas
) * (Gas Used by Tx)
トランザクションの通りやすさに影響するのは、maxPriorityFeePerGas
であるため、本記事ではこの変数に焦点を当てて解説します。
なぜトランザクションが通らないのか
十分なGas代が設定されていない場合、トランザクションがなかなか通らない場合があります。EIP1559で導入されたpriority fee
は、マイナーへの報酬として支払われます。したがって、priority fee
の値が小さいとマイナーに相手をしてもらえず、トランザクションが通るまで時間がかかってしまいます。最悪の場合、一生トランザクションが通らないまま闇に消えていきます。
しかし、Gas代を自分で計算して設定する場面はあまりないかと思います。例えば、MetaMaskは、トランザクションを発行する際にGas代を提案してくれます。UXの観点から見れば、ユーザがいちいちGas代を計算しなければならないのは手間がかかるため、Gas代の自動推定は必須であると考えられます。
ethers.jsを利用する場合もGas代をユーザが指定しなかった場合にはライブラリが自動で値を決定してくれます。具体的には、以下のようにsendTransaction
メソッドにGas代のパラメータを設定せずにコールするとEIP1559に対応したネットワークなら自動でEIP1559が採用され、Gas代も自動で設定してくれます。
const tx = await signer.sendTransaction({
to: toAddress,
value: ethers.utils.parseEther('1'),
});
しかし、ethers.jsでGas代を自動推定させるのは非推奨です。なぜならば、ethers.jsでGas代を自動推定する際に利用されているProvider.getFeeData()
メソッドはmaxPriorityFeePerGas
(priority fee
)としてハードコーディングされた定数を利用しており、適切なネットワークの手数料を推定することができません。(2022/03/30)
具体的には、getFeeData()
メソッド内に以下のような行が存在し、maxPriorityFeePerGas
に1500000000wei = 1.5Gweiが定数として利用されていることがわかります。
maxPriorityFeePerGas = BigNumber.from("1500000000");
冒頭の結論のセクションでGas Stationから取得した結果では、適切なmaxPriorityFeePerGas
として最低でも30Gweiは必要だったため、全然足りていないことが分かるかと思います。
これは、ethers.js
がGas代の推定に関してはマルチチェーンに対応していないことが原因です。実際のところ、本記事執筆時点では、Ethereum Gas TrackerでEthereumの適切なGas代を確認すると1.5Gweiは妥当な値であることがわかります。PolygonのGas代の相場の方がEthereumのそれよりも高かったためにトランザクションが通りづらくなってしまっていたのでした。
宣伝
HokusaiはNFTの開発インフラ「Hokusai」を提供しています。
「デジタル上で価値を流通させたい全ての個人・事業者にとってのインフラ」としてAPIサービスを提供するEmbedded NFTサービスです。
Hokusaiを提供するモノバンドルで新たにデジタル資産のコード監査・認証のプロバイダー「SuperAudit」の提供を開始いたしました。ブロックチェーンの技術を用いたサービスやプロジェクトに対してコード監査を行い、NFTによる認証を行うサービスです。
この記事を書いた人
Ida - Backend engineer
Discussion