- はじめに
- トランザクション手数料の決まり方
- トランザクションサイズ(バイト数)
- ブロックの手数料倍率
- 手数料倍率が定まる要因
- ノード戦略
- 最小手数料倍率
- 受け入れ戦略
- 手数料最大化
- トランザクションを1つしか取り込まないケース
- 古い順
- 手数料が低い順
- 最大手数料の設定の考え方
- ノードの最小手数料倍率の分布
- とにかく早くブロックに取り込まれて欲しい
- できる限り安い手数料でブロックに取り込まれ欲しい
- 結論
はじめに
以下、だらだら長く書いていますが、どの手数料を設定すればよいかのヒントだけ欲しい方は結論だけ読めばOKです。
Symbolブロックチェーンで送金などのトランザクションを実行するには所定の手数料をSymbolブロックチェーンの基軸トークンであるxymで支払う必要があります。
この手数料はブロックを生成したアカウント(ノード)に対して支払われブロックチェーンネットワークを維持するインセンティブとなります。パブリックブロックチェーンを維持する上でこのトランザクション手数料は必要不可欠なものです。
一方でSymbolブロックチェーン上でトランザクションを発生させ、利用する側としてはできるだけ手数料を抑えたい場合や多少のコストを支払っても早く承認してもらいたいケースなどもあります。
この記事ではトランザクション手数料を決めるための要素を説明し、手数料を決めるヒントを解説したいと思います。
トランザクション手数料の決まり方
トランザクション手数料は以下の式で求まります
トランザクション手数料 = トランザクションサイズ(バイト数) * トランザクションが取り込まれたブロックの手数料倍率
トランザクションサイズ(バイト数)
トランザクション手数料はまず送信しようとするトランザクションのバイト数が基本となります。
トランザクションの大きさが大きくなればなるほど支払う手数料は高くなります。
トランザクションの大きさが大きくなる要因としては以下のようなものがあります。
- 転送トランザクションに添付するメッセージの文字数が増える
- 転送トランザクションで1回の送るモザイクの種類が大きくなる
なお、1度に複数のトランザクションを送る際は、単体で送るよりアグリゲートトランザクションでひとまとめにした方がトランザクションのトータルサイズは小さくなります。
ブロックの手数料倍率
トランザクション手数料が定まるもう一つの要因としてはトランザクションが取り込まれたブロックの手数料倍率があります。
この手数料倍率はブロック毎に変動しており、手数料倍率が定まる要因としてはノード毎の戦略とそのブロックで取り込まれたブロックに含まれているトランザクションによって定まります。
トランザクションをアナウンスした段階ではトランザクション手数料は決定せず、ブロックに取り込まれた時点で決定するため、トランザクションをアナウンスする時には最大で支払ってもよい手数料(最大手数料)を設定してアナウンスします。
手数料倍率が定まる要因
さてここでは手数料倍率が定まる要因をもう少し深追いしてみようと思います。
ノード戦略
手数料倍率の決定においてノード戦略は大きな影響を与えています。
ノード戦略は外側から確認できるものとそうでないものがありますが、次のようなものがあります。
最小手数料倍率
1つ目としてはノード毎に最小手数料倍率が設定されています。ノードは設定した最小手数料倍率以上のトランザクションのみをブロックに取り込みます。トランザクションの最大手数料が最低手数料倍率に満ちていなかった場合は、そのトランザクションを受け入れいてもらえる最低手数料倍率のノードがブロックを生成した際に取り込まれます。但し、設定した期限までに取り込まれなかった場合は、そのトランザクションはブロックに取り込まれずに破棄されます。
なお、トランザクションをアナウンスする際はそのノードが設定した最低手数料倍率以上の最大手数料を設定する必要があります。もし、最低手数料倍率未満の最大手数料だった場合、ノードはそのトランザクションを未承認トランザクションのプールに入れることなく破棄します。この際、REST APIはエラーレスポンスも返さないので注意が必要です。
受け入れ戦略
ノードはどのトランザクションを優先して受け入れるかを決めることができます。
受け入れ戦略は次の3つがあります。
- 手数料最大化
- 古い順
- 手数料が低い順
手数料最大化
この戦略はブロックに含まれる手数料が最大化されるようにトランザクションを選択します。基本的にはトランザクション手数料倍率が高い順に優先して取り込みます。
なお、この戦略を採用しているノードでは、1ブロックに6,000トランザクション取り込めるところを1トランザクションしか取り込まないケースがありえます。
トランザクションを1つしか取り込まないケース
手数料倍率が極端に高いトランザクションがあった場合、その他のトランザクションを無視してそのトランザクションのみを取り込みます。
トランザクションのサイズが全て同じだった(ここでは単純化のためトランザクションのバイト数は1とします)として、手数料倍率のみが異なっていた場合、ある1つのトランザクションの最大手数料倍率が10,000、その他5,999個のトランザクションの最大手数料倍率が1だった場合、最大手数料倍率が10,000のトランザクションのみが取り込まれ、その他5,999個のトランザクションは次のブロック生成に持ち越されます。
なぜこのようなことが起きるかというと、最大手数料倍率が10,000の1つのトランザクションと最大手数料倍率が1の5,999のトランザクションを全て取り込んだ場合、得られる手数料は6000となります。これはブロックの手数料倍率はそのブロックに含まれている全ての中で最低の手数料倍率となるためです。
この例では、ブロックの手数料倍率は1となり、最大手数料倍率が10,000としたトランザクションも支払時に適用される手数料倍率は1となります。
一方で、最大手数料倍率が10,000のトランザクションのみを取り込んで、その他手数料倍率が1の5,999個のトランザクションを無視した場合、得られる手数料は10,000となります。
よって手数料最大化戦略では、そのノードが得られる手数料を最大化するために本来6,000個のトランザクションを受け入れ可能な所をあえて、少ないトランザクションしか受け入れないケースがあり、全体的な性能を低下させるケースがあり得ます。
古い順
これはそのまま、トランザクションが未承認トランザクションプールに入ってから長期間経過したトランザクションから順に取り込む戦略です。
この戦略ではノードが設定した最低手数料倍率以上のトランザクションであれば手数料倍率の多寡は関係ないです。
手数料が低い順
まさに手数料倍率が低い順から優先して取り込んでいく戦略です。
最低手数料倍率が0で、受け入れ戦略を手数料が低い順とした場合、このノードは手数料0のトランザクション優先して受け入れるので、手数料が無料の慈悲深いノードとなります。
利用者からすると手数料無料ノードは一見してありがたいノードに見えるかもしれませんが、一方でこの戦略を採るノードが多くなると悪意のあるトランザクションを受け入れ放題となってしまうため全体最適を考えた場合、パブリックチェーンにおいては積極的に採用しずらい戦略と言えるでしょう。
最大手数料の設定の考え方
ここまでSymbolのトランザクション手数料がどのよう影響で決まるかを説明してきましたが、トランザクションの送信する際の最大手数料をどのように設定すればよいか考えてみようと思います。
最大手数料を考える上で、まずそのトランザクションの取り込みポリシーを考える必要があります。ポリシーとしては以下の2つが考えられます。
- とにかく早くブロックに取り込まれて欲しい
- できる限り安い手数料でブロックに取り込まれ欲しい(ただし、取り込むのに時間がかかるのは許容する)
ノードの最小手数料倍率の分布
出典: https://symbol-tools.com/symbolTools/view/tool/statistics.html
最適な最大手数料を考えるには、ノードの最小手数料倍率がどのような分布になっているかを把握しておくと最適解に近づきます。もっと正確に言うと委任込みの重要度分布が把握できるとよいのですが計算が手間過ぎるので、だいたいノードの数に近似されるものとして考えます。
あひきさんのSymbol Node Listの統計情報から2022年12月18日現在の最小手数料係数(倍率)の統計情報を引用しました。
ここでポイントとなるのは
- 最小手数料倍率の最大値は100
- 最小手数料倍率が25以下のノードが5割程度
- 最小手数料倍率が10以下のノードは15%程度
と言うところでしょう。
とにかく早くブロックに取り込まれて欲しい
この場合は、できる限りで高い手数料倍率を設定すれば早くブロックに取り込まれる可能性が高いでしょう。極端に高い手数料を設定すれば他のトランザクションを押しのけて自分のトランザクションだけを受け入れてもらえる場合もあります。ただし、ノード戦略によってはあまり高い手数料を設定しても早く取り込まれない(むしろ優先度を下げる)場合もあるので正確にはどの戦略を採っているノードが多いかにもよりますが、この情報を知るのは困難です。
最小手数料倍率は最大でも100のため、現在のトランザクション数であれば100以上の手数料倍率を設定してもそこまでメリットはないと考えます。
できる限り安い手数料でブロックに取り込まれ欲しい
この場合は、できる限り低い手数料倍率を設定すれば安くブロックに取り込まれるかもしれません。
しかしあまりに低いといつまでも取り込まれずに、有効期限切れになるリスクがあります。そのリスクをどこまで許容するかによって設定する手数料倍率が変わります。
12/18現在のノード分布の場合、トランザクションの取り込まれやすさは手数料倍率が100〜、25〜99、10〜24、0〜9で大きく変わると考えられます。
きちんと検証できていないですが、これまでの経験則上100以上であれば、次か、次の次ぐらいに生成されたブロックに取り込まれ、25以上であれば概ね5分以内には取り込まれ、10以上は場合によってはいつでも取り込まれないケースがあります。10未満ではある程度運がよくないと取り込まれないのではないかといったところです。
結論
2022年12月18日現在のノード分布で、ブロック生成間隔の内に発生するトランザクションの数 << ブロックが受け入れ可能なトランザクション数の状況下の場合、
- 手数料倍率100以上 … 早いタイミングでブロックに取り込まれる
- 手数料倍率25以上 … 概ね5分くらいに取り込まれればよい場合はこの程度でOK
- 手数料倍率25未満 … 取り込まれないリスクを承知の上で設定するの値。特に10を下回る値はよほど運がよくないと取り込まれないと思った方がよい。