【仮想通貨NEM】TransferTransaction実験1
はじめに
NEMのFee計算がなんだか分かりにくいということで、徹底的に調べて記事にしようかと思って最近NEM-coreのソースコードを眺めてたりしています。すると、関係ないところで疑問に思ったことがありまして、今回はその実験と結果です。
ちなみに、当然ですがテストネットで試してます。
疑問
ソースコードを見る限りだとMosaicが添付されたTransferTransactionはAmount(送信xem量)フィールドが無視されるっぽい。実際、NanoWalletを利用してもモザイクの送信をしたい時に一緒にxemを送信するとなると "nem:xem" をわざわざ添付してあげないといけない仕様になっている。
では、mosaicが添付されている + Amountフィールドに数値が入力されているTransferTransactionをブロードキャストするとどうなるのか。主に気になるのは以下の点。
- 手数料は?
- xemの送信量は?
- そもそもverificationを通過するの?
結果
結果だけお伝えします
Amountフィールドはモザイク送信時には別の意味になる
説明
モザイクが添付されている場合、モザイクの送信量は以下の通りとなります。
トータルの送信量 = ( amount / 1,000,000 ) × ( quantity / 10^dividibility )
ややこしいのでamountを1,000,000に固定すれば( amount / 1,000,000)は "1" になるので、それで良いと思います。送信量はquantityで調整できるので。
なお、この時amountは1,000,000で割り切れる数字でないといけません。そうでなければ検証で弾かれます。
example
上記説明の例を書いておきます。
[mosaic]
1. 名前 : alice
2. 総発行数 : 100
3. divisibility(可分性) : 2
4. 可分性を含めた発行数(2,3より) : 100.00
[送信]
amount : 2,000,000
quantity : 100
実際の転送量 : 2,000,000 / 1,000,000 * 100 / 10^2 = 2
[mosaic]
1. 名前 : alice
2. 総発行数 : 1000
3. divisibility(可分性) : 1
4. 可分性を含めた発行数(2,3より) : 1000.0
[送信]
amount : 4,000,000
quantity : 20
実際の転送量 : 4,000,000 / 1,000,000 * 20 / 10^1 = 8
今回送信したデータ
[MosaicInfo]
namespace : 1alice.1alice
mosaicname : 1alice
initial suply : 10,000
divisibility : 2
(つまり総発行数は10,000.00)
[TxData1]
01010000
02000098
21447005
20000000
2CE02903E133430372A5082DC544928CDD5EC8AED20ADEBB614BA096ABB2B6CF
3057050000000000
31527005
28000000
5441564E335036535A32483452524232495A54514D454855544A4552364B36504C55544959554E54
80841E0000000000 amount(2,000,000 == 2)
00000000
01000000
27000000
1B000000
0D000000
31616C6963652E31616C696365
06000000
31616C696365
6400000000000000 quantity(100)
(フィールド名は省略しています)
[txID]
a49efe9b1ddd1ecb907616491c017447d2efd440bb71d45d242b35f7786d7743
[送信量]
2,000,000(amount) / 1,000,000 × 100(quantity) / 10^2(divisibility) = 2
=> 1aliceモザイクを2.00送信できた
[TxData2]
01010000
02000098
90497005
20000000
2CE02903E133430372A5082DC544928CDD5EC8AED20ADEBB614BA096ABB2B6CF
3057050000000000
A0577005
28000000
5441564E335036535A32483452524232495A54514D454855544A4552364B36504C55544959554E54
20A1070000000000 amount(500,000 == 0.5)
00000000
01000000
27000000
1B000000
0D000000
31616C6963652E31616C696365
06000000
31616C696365
6400000000000000 quantity(100)
[APIcallの結果(JSON)]
{"innerTransactionHash"{},"code":148,"type":1,"message":"FAILURE_MOSAIC_DIVISIBILITY_VIOLATED","transactionHash":{"data":"be83c04540dcccc1a0accb22114a0c59d1e1a6dfcca33639478f031c70b861f6"}}
※amountが1,000,000で割りきれない数字だとエラーが出るので送金できませんでした
さいごに
最初無視しているのかと思いましたが、違ったようです。
ここまでさらっとしてますが、これやるのにライブラリ使えばいいのに簡単なHTTPクライアントをJavaで作ったり(折角なので今後使いまわせるやつ作った)、MosaicInfoのデータが無いのでNEM-coreのコードを書き換えて自力入力できるようにしたりなんか色々やったので大変でした。
コードが散らばってしまって多分来月には何がなんやらわからない状態になっていると思います。
気になったらTestNetでどんどん試しましょうね。場合によってはバグバウンティ貰えるかもよ。
手数料の記事はリファレンスを信用するならあれで解ると思いますし、わざわざ書かなくてもいいかな...とか思ってます。
あと、今回"実験1"としているのは単に将来用です。2があるかどうかはわかりません。