30
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

nemAdvent Calendar 2021

Day 13

フルオンチェーンNFTの考察と実装。

Last updated at Posted at 2021-12-12

##ちょっと書きたくなったので殴り書き

フルオンチェーンNFT関連の投稿が多く驚いたのでサービス化にあたって工夫した点なんかを殴りガキしておきます。
といっても違法アップロードの観点から一般公開しておらず。
どうやってNFT作ってるのか?謎に包まれています。

NFTDriveの仕様としては、
Geminiというモデルをつくりました。

自動販売機でNFTDriveテストネット祭りの時と同じですね。
自動で手数料を受け取ってあまったら返却を行いNFTを発行する。
自動販売というのは、仮想通貨を預かることを回避するためにすべてクライアントサイドでの実装です。
ツールとしてユーザーがダウンロードして自己責任で利用するという流れです。
それをやらないとNEMBERARTのデポジットのような事にね。
なので使い捨てのアカウントが利用者とのやり取りを自動でします。
手数料を受け取り、データを作成して。。。。
ちょっとフロー載せておきます。

aa.png

このようになっているわけですね。
基本的には自己責任のツールという枠で実装しました。
とはいえ不安の声もあったので現在は非公開でチェックしてアップロードしているという現実ですw

技術的な側面で言うと、Symbolスパムフィルターとの対峙で、
インターバル多めの4秒とっていますのでゆっくり書き込んでいます。
詰めて送信するとコアの方も言っていましたがキャッシュあふれてエラー返さず消滅するので、400ミリ秒だったかな?
アグリの場合は通常の250ミリ秒以上ではダメみたいです。400は開けろということですね。
それはほかのTXがないというのが前提なので、その十倍は開けるのがまぁ良いのかな?と思います。

あと実装で注意するのが、連続で投げるので途中で手数料が変わることがあるので、不足した場合の処理を加える必要があります。
とくにMOSAIC を発行する時は注意です、50の定数はだめですね。
ちゃんとMOSAICの発行手数料とれるので取ってきてから利用者に請求するようにですね。

最大1700Xym?もっとかな?ぐらいは見たので不足したら追加で請求する処理を入れました。

あと検証ですがwebsocketが不安定になることがあるので、ちゃんと確認するために4つのノードでリスニングしています。
送信したハッシュリストと送信後にちゃんとあるか?とwebsocketのリアルタイムモニターで送信作業を見守ります。
もし、ハッシュが存在しないと再送信配列に保存しておきます。
そして最後にもう一度送信します。

{ダブルプレッション方式}と勝手に呼んでいます。

このダブルプレッション方式は少し強力に機能するようになっていまして、
TXが不足というのは1アグリゲート(最大100内包)なので
不足するよりは{重複しても送信すべき}ということで、検証に少しでも異常があればもくはレスポンスが悪くなったら再送信します。

デコーダ側でこのダブルプレッション方式で重複したTXを処理しています。
といっても配列回すときにサイズが大きいほうに上書きすることで実装できます。

アップローダーのGeminiは3台同時運用にしています。
同時に3台しか動作しない設計です。
それぞれが使用するノードのリストを共有してかぶらないようにしています。
負荷テストの時は一人で50タブとか開いているかたもおられましたが。。。

サービスで一般開放という条件では同時に3台ほどがせいぜい良いところかな?と考えました。
技術的にも黎明期なので様子見というところですね。

基本的に秘密鍵はクライアントサイドにというのがサービス側としては責任の観点からも重要になってくるので、そこは
各サービス方針に基づいてどっちが責任取るか?ということになるかと思います。

あとアドレス制限を入れるのでこれがあるか?ないか?でデコーダーの反応を変えています。
アドレス制限が確認できなければデコードしても不完全なデータと表示されます。
オンチェーンNFT開発は実装としてはアップローダーの部分より。
デコーダーに開発リソースがとられます。

たとえばMIDI対応をしたり、色々なファイル形式をブラウザーで再生できるようにしていないと利用者的には意味がないですよね。
実装コストを考えるとBase64が良いですね。 サーバーサイドのコンテンツヘッダーもそのまま返せばいいですし。

参考として実際のNFTDriveのプレビューを張っておきます。
https://nft-drive-data-explorer.tk/data.html?id=16F881DE78ED5810&w=90vh

あとこちらはデータエクスプローラーです。(アドレスが持っているMOSAICを上記のプレビューにかけて表示しています。)
https://nft-drive-data-explorer.tk/?address=NCYRHFYAW7W6MNOPNUC3B2BBCXP3KHO3TPTONCA

あとはサーバーサイドのPHPデコーダーです。
※ちなみにこのNFTは参照型なのでオンチェーンに参照先URLが書いていてそれをデコーダーが引っ張て来ています。
変更可能なNFT添付ファイル型とでも言いましょうか。。。普通のNFTですね。

サーバーサイドではコンテンツヘッダーをBase64でそのまま取ってきてるのでリクエストすると適時そのファイルとして返信されてきます。
なのでいろいろNFTを外部アプリケーションで利用したいならこの方式が良いと思います。

プレビュー機能に疑似的なオークション機能が備わっています。
パーシャル状態のTXを入札状態に見立てて参考価格として表示。
URLワンクリックでIchIGowalletとの交換請求連携実装など詳しくは動画をご覧ください。
https://www.youtube.com/watch?v=mDPyrU4JiHw

デコードの方法は公開していますので個人でなんやかんやするのは全然OKです。
デコーダーソフトとして一般に公開する場合には申し訳ないのですが、
公式HPの規約通りにフィルターの実装と、こちらと意思疎通できるように提携してください。
https://nft-drive.localinfo.jp/posts/23874701

理由は違法アップロードとりわけ【児童ポルノ】です。
実際に被害のことを考えるとこうやらざる負えないのはご理解ください。。。
私なりに健全にフルオンチェーンを構築しないといけないと思います。

いや、ちょっと長くなりましたが、
Symbolを使ってとても素晴らしいフルオンチェーンの世界が構築されていくことを願っています。
消えないことはほんとにロマンだし。嬉しいし。楽しい。そういう明るいイメージにしていければと思います。

30
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?