NEMモザイク送金の手数料計算

[mathjax]

今日はちょっと需要の少なそうな技術的なお話をします。

モザイクってなんやねん、って人は、LCNEMの仕事ついでに、NEMモザイクの仕組みを解剖するご覧ください。

モザイクの送金にかかる手数料の計算式についてです。

NEM NIS API Documentation

7.10 Transaction Feesにおいて、送金にかかる手数料の計算の仕方が書かれています。以下引用。

The fee is the sum of the fee for transferring an amount of XEM and the fee for appending a message to the transaction.

  1. Fees for transferring XEM to another account:
    0.05 XEM per 10,000 XEM transferred, capped at 1.25 XEM
    Example:
    0.20 XEM fee for a 45,000 XEM transfer, 1.25 XEM fee for a 500,000 XEM transfer.
  2. Fees for appending a message to a transaction:
    0.05 XEM per commenced 32 message bytes (messageLength / 32 + 1).
    Example:
    The unencrypted message „The New Economy Movement will change the world!!!” has a length 49 characters and thus will cost 0.15 XEM fee.
  3. Fees for transferring a mosaic to another account:
    1. mosaics with divisibility of 0 and a maximum supply of 10,000 are called small business mosaics.
      0.05 XEM fee for any transfer of a small business mosaic.
    2. For each mosaic that is transferred the fee is calculated the following way: given a mosaic with initial supply s, divisibility d and quantity q, the XEM equivalent is (round to the next smaller integer)
      xemEquivalent = (8,999,999,999 * q) / (s * 10^d)
      To take into account the total quantities for different mosaics, an adjustment term is calculated.
      For a mosaic called m calculate

      1. maxMosaicQuantity = 9,000,000,000,000,000
      2. totalMosaicQuantity = mosaic m supply * 10 ^ (mosaic m divisibility)
      3. supplyRelatedAdjustment = floor(0.8 * ln(maxMosaicQuantity / totalMosaicQuantity)
      4. Then the unweighted fee is calculated as
        unweightedFee = max(1L, xemFee – supplyRelatedAdjustment)
      5. Finally, the weighted fee can be calculated:
        fee = unweightedFee * feeUnit

お、おう

XEMの送金手数料の計算方法は意味が分かります。

  1. 10000XEMごとに0.05XEMの手数料、ただし上限は1.25XEM
  2. メッセージ32バイトごとに0.05XEM

しかし、モザイクの送金手数料のところは、途中でxemFeeとやらが出てくるのですが、これの導出方法が書かれておらず、さっぱり意味の分からない暗号文となっています。

これをNEMフォーラムで質問したところ、phpのコードを示してくれた人がいました。感謝です。

nem-php

phpは専門外ですが、モザイクの送金手数料について解読してわかったことを以下にまとめます。

  1. 可分性0、供給量10000以下のスモールビジネスモザイクは、いかなる送金も0.05XEMがモザイク送金手数料となる(これは読める)。
  2. スモールビジネスモザイクでない場合、送金量\(q\)、初期供給量\(s\)、可分性\(d\)、として、以下の\(x\)を計算する。
    \[
    x = \frac{8999999999 \times q}{s \times {10} ^ d}
    \]
  3. \(x\)がxemの送金量であった場合の送金手数料を上記の方法(10000XEMごとに0.05XEMの手数料、ただし上限は1.25XEM)で計算する。これがモザイク送金手数料となる。
  4. 上記の計算を各モザイクごとに行い、合計する。

xemEquivalentって、そういう意味なのね。。。

追記:

なにか怪しいなと思っていましたが、このphpのコードは端折った計算方法だそうです。。。クソォ。。。

正しい計算方法はこっちに載ってます。

NEMモザイク送金手数料をOctaveで4次元グラフにしてみた