【解決方法は?】Solanaで"transaction was not confirmed in 60.01 seconds"というエラーが出る問題
- 2022-01-25
Solanaのweb3.jsを使ってトランザクションを送信しようとしたときに以下のようなエラーが発生。
Error: Transaction was not confirmed in 60.01 seconds. It is unknown if it succeeded or failed. Check signature [signature] using the Solana Explorer or CLI tools.
たまたまかな?と思って再度試しても同じエラーが発生。
メインネットでこれが起こってしまって上手くプログラムが動作しない人向けです。
実はこれ、あなたのプログラムが悪いのではなくSolanaのネットワークの問題です。
この問題についての深堀りと、解決方法があるのかについて書きたいと思います。
原因はSolanaネットワーク自体
このエラーは、Solanaネットワークの不具合です。
本当にSolanaネットワーク側の問題なのか確かめたい
自分のプログラムの問題なのか、Solanaチェーンの問題なのかを確かめたい方もいると思います。
その場合は、PhantomWalletなどで少量のSOLを別のウォレットに送ってみるといいと思います。
それでトランザクションが確定しなければSolanaネットワーク側の問題です。
Solanaってブロックチェーンで非中央集権だし、世界で一番高速なチェーンなのにそんなことが起こるのか?
こんな疑問を持っている方もいると思いますが、つい先日同様の問題が起こったのです。
ニュースでも取り上げられました。
The Solana network was down again for 48 hours, but this time users who took loans were forced to pay the price as they faced heavy liquidations.
Solanaネットワークは再び48時間ダウンしたが、今度は融資を受けたユーザーが重い清算に直面し、その代償を払わされることになった。
48時間もネットワークダウンしたようなのです。
このとき私はちょうどweb3.jsでsolanaの自動送金プログラムを組んでいてメインネットでテストもしていました。
しかし全くトランザクションが通らず「プログラムおかしいのかな?」と悩んでいたのですが「まさかのネットワーク側の問題」だったのです。
“The mainnet-beta cluster is experiencing some performance degradation, we are currently investigating the issue,” the team wrote.
“メインネットベータのクラスタに性能低下が発生しており、現在この問題を調査中です。”
ちなみにこれは2022年1月23日の出来事です。
このときマーケットではちょうど暴落が起こっていて資産を動かしたかった人もいるはずです。
そんなときにSolanaにある資産を動かせないというのは気が気でなかったでしょう。
ネットワークに問題がないのにエラーが出てしまう場合の対処法
この問題、Solanaが悪いのであなたが実践できる解決策はありません。
だけどもし、Solanaで普通に送金できるのにあなたのプログラムで同じエラーが出てしまった場合に「それを回避できるかもしれない」ちょっとした方法を紹介します。
エラー内容をみると
Transaction was not confirmed in 60.01 seconds.
**トランザクションは60秒以内で完了しなかった。**とあります。
これはトランザクションが高速なSolanaでも(特にネットワーク異常がなくても)たまに発生してしまうみたいなのです。
Solanaのweb3.jsではデフォルトでトランザクションのタイムアウトが30秒もしくは60秒に設定されています。
このため、60秒経過しても通らなかったトランザクションに対して中止しエラーが帰ってきてしまういます。
このエラーを極力抑えるためにタイムアウト時間を60秒以上にしてやる方法があります。
60秒でダメでも120秒(2分)トライしてみればトランザクションが通るかもしれません
// Connect to cluster
var connection = new web3.Connection(web3.clusterApiUrl(useMainNet ? "mainnet-beta" : "devnet"), {
confirmTransactionInitialTimeout: 300 * 1000
});
web3.jsでクラスターにconnectionするときに「confirmTransactionInitialTimeout
」というオプションを設定することができます。
これを60秒以上に設定することで、タイムアウト時間を伸ばすことができます。
上記の例ではタイムアウトを 300(秒) つまり5分 に設定しています。単位がミリ秒なので1000倍します。
やっぱりSolanaを構成してるノードなどに依存するので、完全な解決策はないのですがエラーを極力抑えるためにもこのような工夫はできるかと思います。