見出し画像

BlockChainのsendTransactionで、 {'code': -32000, 'message': 'transaction underpriced'}のエラーが発生したときの対応

はじめに

@yutakikuchi_です。
ETH, Polygonなど、BlockChainのgasPriceがtransactionの混み具合によってはその日の中でも上がったり下がったりなど流動性がかなり高い状態ですが、sendTransactionをwallet経由ではなく、プログラムなどで処理をしている場合、transaction underpricedというエラーが発生することがあります。

対処法

この問題解決は非常にシンプルで、transactionに含めるgasPriceの値を上げるということで解決します。発生する原因の一つとしてはtransactionのformatを決定する処理の中で、gasPriceを固定で20Gweiのように指定してしまうと、混雑状況によるタイミングによっては20Gweiの価格でunderpricedと判定されることによります。下記はWeb3.pyを用いたsend_transactionになります。

# Legacy transaction (less efficient)
HexBytes('0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331')
>>> web3.eth.send_transaction({
  'to': '0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
  'from': web3.eth.coinbase,
  'value': 12345,
  'gas': 21000,
  'gasPrice': web3.toWei(20, 'gwei'),
})

固定でgasPriceを設定している場合は、各種BlockChainごとのgasTrackerのサイトなどを見ながら、現状のガス代を確認して設定する必要があります。

そもそもの話として

sendTransactionとして、gasPriceのデータ項目を設定する事自体が古いやり方のようで、新しいやり方としてはmaxFeePerGas(最大手数料)maxPriorityFeePerGas(マイナーに対する支払い)を使用するということになっています下記の例ではmaxFeePerGasを250Gweiを固定として設定していますが、gasStationのEndpointをcallして、maxFeePerGasの値を動的に管理するというやり方もあるかと思います。

gasPrice: integer - Integer of the gasPrice used for each paid gas LEGACY - unless you have a good reason to use gasPrice, use maxFeePerGas and maxPriorityFeePerGas instead.

https://web3py.readthedocs.io/en/stable/web3.eth.html#web3.eth.Eth.send_transaction
# Dynamic fee transaction, introduced by EIP-1559:
HexBytes('0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331')
>>> web3.eth.send_transaction({
  'to': '0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
  'from': web3.eth.coinbase,
  'value': 12345,
  'gas': 21000,
  'maxFeePerGas': web3.toWei(250, 'gwei'),
  'maxPriorityFeePerGas': web3.toWei(2, 'gwei'),
})

GaS Station API


この記事が気に入ったらサポートをしてみませんか?