正月間近だというのにゆっくりしている namuyan です。
今回、NEMのtestnetのFaucetを作りました。
そしてtomotomoさんも作成してくれています、こちらです。
NEMは日本語の資料が多くて非常にとっつきやすかったです。翻訳してくれた方々にはこの場でお礼を言わせてもらいます。どうも有難うございます!
そもそも testnet とは?となる人もいるかもしれません、なので説明したいと思います。
Testnet とは?
その名の通りTESTで使用される仮想通貨P2Pネットワークです。
Mainnetにてコンテンツを放流する前に本当に正しく動くか?を検証する為の仮想通貨ネットワークです。仮想通貨には金銭価値があります。仮想通貨を扱ったコンテンツを作ったもののMainnetでは正しく動くか検証しにくいです。下手をすれば相手の迷惑になります。Testnetは定数の一部がMainnetと異なるだけである為、Testnetで正しく動くコンテンツはMainnetでも動きます。また、NEMの内容はCPやBitcoinに比べて複雑度が高いです、そのため価値の無いtestnetで一通りの動作を確認した方が奥行きのある利用法が思い浮かぶと思いますのでオススメです。(ちなみにKumacoinのコンテンツを作っていて20万Kumaを失いました、testnetを動かすのが面倒だったからです、モノによってはtestnetは常設されていない為、自分で敷設する必要があります。)
NEM Testnet Faucet とは?
testnetのNEMを貰えるFaucetです。
NEMはBitcoinのようにTestnetが常設されておりコンテンツ作成者にとってありがたい環境です。しかし、NEMのデベロッパーに直接言わないとTestnetのNEMを手に入れることができません。これでは不便だ!っということでTestnetのNEMのFaucetを常設することにしました。なんと賞金も貰えちゃいます!75000XEMも!
NEM Testnet Faucet の使い方(How to use)
非常に簡単です。
1、Tから始まるTestnetのアドレスを入手 (アドレス管理にはnanoWalletをお勧めします、秘密鍵の生成にはtomotomoさんのページを使用しましょう、PaperWalletを印刷して保存しておけばたぶん安心です。)
2、”NEM Address”欄にアドレスを書き込みます。ハイフンは気にしないで下さい。
3、”message”欄に何か書いておきましょう。Faucetの履歴に表示されるので面白いのを頼みます!
4、reCAPTCHAを認証しますと Click! が押せるようになるので押しましょう。以下のようになっていますか?
5、クリックしましたら、送金が完了しました! と表示され自動的に元のページへ飛ばされるはずです。この時にXEMとランダムで選ばれたMosaicも送られます。もしエラーが出ている場合はスクリーンショットを管理者へ渡してもらえると大変助かります。
6、設定では1時間に一回まで、別に深い意味はありません。もしもMosaicを作成したい場合はまず 5000XEM を集める必要があります。さすがに50回以上引かせるのは酷なので 5000XEM を入手する為の別の手段を用意するつもりです。急いでいる場合はTwitterで話しかけてくれれば直接送ります。または開発者より貰ってください。
SBMFaucet の使い方(How to use)
実はMosaicを手に入れることができるFaucetも設置されています。
そもそもSBMとはSmall Business Mosaicの略で、供給量1万以内かつ分割無しのMosaicのことです。送金手数料が定額1XEMであることが特徴です。
【 SBMF使用方法 】
- TDEK3DOKN54XWEVUNXJOLWDJMYEF2G7HPK2LRU5W 宛てに 10XEM をmessage付きで送ります。
- messageの内容が重要です。必ず”twistSBMF”と記入して下さい。
- 5~20分するとDepositHistoryに送金履歴が表示され 完了! の文字が付加されます。
- ランダムで選ばれたMosaicが送られます。
さらに、SBMFに自分の作ったMosaicを登録することもできます。自分の登録したSBMが相手に投げられた時、幾分か(平均3XEM)が登録時のアドレスに送金されます。これはなにか目的のMosaic引き当てるためにSBMFをユーザーが捻りまくる.....ことでSBM作成者にもオコボレが舞い込むようにしました。さらにネットワーク使用頻度も上がる為、ハーベストにも良い影響があるのでは!?と考えています。
”目的のMosaic引き当てるため”の部分でMosaicのサムネイルを登録するには特定のMosaicが必要になるようにしようと考えています。やはり目玉となるMosaicが存在しないと何も進みません。
【SBMFへの登録方法】
- 登録には条件があります。SBMの作成者であること、SmoallBusinessMosaicの定義を満たすこと。
- TDEK3DOKN54XWEVUNXJOLWDJMYEF2G7HPK2LRU5W 宛てに 10XEM と 撒きたいSBM を同梱して特定のMessageを付けて送ります。
- 例えば namuyan:namu を 1000 撒きたい、そして一回に撒かれる量は最小10で最大30にしたいならば sbmf,namuyan:namu,10,30 が送るMessageになります。
- 30分以内にDepositHistoryにトランザクションが表示され、Messageの最後に完了!も文字が付けば登録完了です。
只今配布中のMsaic達です、よかったら蛇口をひねってみて下さい。
この他にも、 Mosaic API やら Mosaic Thumbnail やらさまざまなサービスの実証実験を行っていますので是非試してください。
技術的なお話(How to build)
今回使用したのは PHP , Mysql です。
Webアプリケーションを作成する為に使うツールとして一般的です。ちょっとかじった事ある人ならば普通に扱えるのではないでしょうか?しかし、トランザクションの生成、Feeの計算 など少し戸惑った所があるので少し解説したいと思います。参考にした資料は『 NEM NIS API Documentation 』、『NEM関連サイトまとめ』です。
1、トランザクションの生成
実はトランザクションには2種類あります。Ver1は nem:xem (つまりXEM)を送金することに特化しており、Ver2は Mosaic を送金することに特化しています。ちなみに nem:xem とはNEMにおける基軸通貨です(NEMとかXEMとか言われます、本当はXEMです)。NEMのブロックチェーンにかかわると発生するFeeとしてXEMが徴収されます。
注意:以下の記事の内容は少し古いです。 class へ書き換えましたのでこちらのExampleを参考にして下さい。
Ver1のトランザクションを生成するファンクション(SendNEMver1)をご覧ください。資料ページ
プログラム内のコメントで全て説明できてるはずですが補足のみ
timeStampはUnixtimeでない事にご注意ください。2038年問題を回避する為だと思います。
typeはトランザクションの種類を示します。送金であるならば257。他にもImportanceやMosaicの発行、Namespaceのレンタルなどさまざまな種類があります。
deadlineはトランザクションがmempoolに存在できる期限です。私たちはトランザクションを生成しP2Pネットワークに流します、ネットワークに漂っている間はP2Pを構成するNISのインストールされたPCのメインメモリに存在します。もしもトランザクションに問題がありブロックチェーンに取り込まれない ( Feeが足りないなどBitcoinで大きな問題となっている、TXの内容として間違いではないから消化されず長期間漂う ) とネットワークに迷惑がかかります。大体どのトランザクションも12時間に設定されています。
versionはトランザクションのバージョンです。これを基にNEM専用かMosaic専用かを判断しています、またmainnetなのかtestnetなのかによっても異なります。値はマイナス?なのかよくわかりませんがハイフンが必要です。
signerはトランザクションの署名主の公開鍵です。
Ver2のトランザクションを生成するファンクション(SendMosaicVer2)をご覧ください。資料ページ
さっきよりスッキリしているのはコメントが少ないからです(笑
Ver1との違いと言えばキーに"mosaic"が含まれるぐらいですね。逆に何故"amount"が残ってるのか不思議に思いました。amountはコンスタントに 1XEM かかるようです。注意点は先ほど書き出したので言う事はこれぐらいですね。
戸惑ったのはFeeを算出する過程です。
2、Feeの算出
Feeを算出するファンクション(EstimateFee)をご覧ください。
$amount は送金するXEMの量です。
$message は送る際に付随させるMessageです。なければ空文字でも入れておいてください。
$mosaic は送るMosaicの詳細を配列で格納します。画像のコメントを参考にして下さい。
公式で公開されているFeeの計算式は
x = how many mosaic you send
fee = Max(1, Min(25, x * 900_000 / MosaicSupply) - floor(0.8 * ln(9_000_000_000_000_000 / MosaicSupply * 10^divisibility)))
となっておりますが、上のファンクションでは
$initialSupplybyUnit = $DetailMosaic['initialSupply'] * pow(10, $DetailMosaic['divisibility']);
$fee_tmp += round( max(1, min(25, $quantity * 900000 / $initialSupplybyUnit ) - floor(0.8 * log(9000000000000000 / $initialSupplybyUnit ))));
となっております。公式ではうまく算出できないです。別に間違っているわけではありませんが amount の表記が二通りあるために混乱が生じます。
これはもともと /namespace/mosaic/definition/page で取得される initialSupply が小数点アリの値であるせいではないかと考えています。(疑
ですので
fee = Max(1, Min(25, x * 900_000 / MosaicSupply) - floor(0.8 * ln(9_000_000_000_000_000 / MosaicSupply)))
代入する値は全て生の値(小数点表記ではない)です。(そもそもDivisibilityは飾りなんですよ、小数点は後付けの飾りなんです)
さらに小数点以下を切り捨てにするとnanowalletと同じ値を出します。
3、POSTのやり方
ファンクション(get_POSTdata)をご覧ください。
NISへGETリクエストするならば難しいことはなにもないので省略します。
POSTする場合はちょっと困りました。適当にPOSTメソッド( /local/account/transfers/incoming など)をたたくとエラーが出ます。
エラー:Content type 'application/x-www-form-urlencoded' not supported
通常、私たちがPOSTメソッドでリクエストする時のパラメータは
namespace=namuyan&name=namu
のような形式です。POSTされる際のデフォルト形式(?)です。参考
NISへPOSTリクエストを送る際は Content-Type: application/json でなければいけません。
実際に試してみてください。
設置方法 (How to setup)
NEM testnet Faucet の README.md をご覧ください。
寄付を貰うと喜びます↓
DonationCPaddress: 1BvRTmPCe47vee2CyrLi9AGeSEcrR2ciM4
DonationNEMaddress: NAN7XFG52NL3V5AW3NTSYO77AVR6X5LYRJKXWKHY
DonationMonacoin: MSYTEF7t62b9sjXt3oN9JokSjnYkvtcPFx
記事を書き終わるのに一週間経ってる!ゆっくりしすぎたよ!はんせいしる!
ログ
・tomotomoさんのFaucetへのリンクを書き忘れていた為直しました。