手数料の求め方
- 手数料はトランザクションバイト数から求めます
- 1バイトあたり手数料という概念があります
- トランザクションバイト数 * 1バイト当たり手数料 が手数料になります
- 古いコインは無料(coin age)という考え方もあるらしいですがここでは無視します※1
サンプルとして以下のような計算になります
トランザクションバイト数=226
1バイト当たり手数料=90
手数料= 226 * 90 = 20340
※1 なぜ無視するかというと実際にどのトランザクションをブロックに取り込むかを選ぶ権利はマイナーにあって、普通の競争原理から考えて手数料のないトランザクションはよほど手数料が低いときでないと選ばれないからです。
マイニングプールのアルゴリズムの実装は割と自由なのでそうなっている可能性が高いです。
世の中カネです
1バイト当たり手数料
- 21という会社が公開しています
- APIでも取得できます
- ネットワークの混雑状況によって変化することがあります
- https://bitcoinfees.21.co/
トランザクションバイト数
トランザクションバイト数は以下の式で求められます
s = スクリプトバイト数
i = 入力数
o = 出力数
txbyte = (s * i) + (34 * o) + 10
スクリプトバイト数はトランザクションの内容によって計算式が異なります。
P2PKH
P2PKHは以下のようなフォーマットです
PREVOUT: hash (32 bytes)
index (4 bytes)
SCRIPTSIG: length (1 byte)
CONTENTS: push opcode (1 byte)
signature (71 or 72 bytes)
push opcode (1 byte)
pubkey (33 bytes for compressed, 65 for uncompressed)
sequence (4 bytes)
= 147 or 148
スクリプトバイト数は147 ~ 148なので148とします
P2PKHのトランザクションバイト数は以下のような計算式になります
s = 148
txbyte = (s * i) + (34 * o) + 10
P2SH
2of3マルチシグの場合のP2SHは以下のようなフォーマットです
PREVOUT: hash (32 bytes)
index (4 bytes)
SCRIPTSIG: length(3byte)
OP_0(1byte)
sig1(73byte) sig2(73byte) OP_2(1byte)
pubkey1(34byte) pubkey2(34byte) pubkey3(34byte) OP_3(1byte)
CHECKMULTISIG(1byte)
sequence (4 bytes)
= 295byte
マルチシグトランザクションのスクリプトバイト数は以下の計算式で求められます
m = 署名の数
n = 公開鍵の数
s = (73 * m) + (34 * n) + 47
P2SHのトランザクションバイト数は以下のような計算式になります
s = (73 * m) + (34 * n) + 47
txbyte = (s * i) + (34 * o) + 10
参考資料
JS実装
詳しい実装は以下を参照