問題
web3.js
の sendSignedTransaction
を使って同じアカウントから連続で複数回他のアカウントに送金しようとしたら、2目以降のトランザクションはどうしてもエラーでした。
Error: Returned error: replacement transaction underpriced
結論
-
sendSignedTransaction
の場合、トランザクションにnonce
項目を設定しないと行けない - その値は、送金するアカウントごとのシーケンスでないと行けない
-
シーケンス
という意味は、ユニークかつ連続 の数値でないと行けないこと
-
対応方法
-
web3.eth.getTransactionCount(from)
で、from
アカウントのトランザクション数を取得して、そのcountをnonceとして設定すれば、順番通りのシーケンスになる
課題
- 2回目以降の送信は、前の処理を完了して(ブロックに書き込まれた)からじゃないと、countが1回目の値と同じになってしまうので、2回目の送信は、1回目の送信がチェーンに書き込まれるまで待つ必要がある。
- 1つのアカウントからの送金処理は並列にできないように見えるので、少しがっかりしました。