Symbol Storage の使い方

# はじめに
本記事は、Symbol Storageで遊んでみたい方、Symbol Storageの技術的な話に興味がある方を対象に書かれています。大きく分けて二部構成とします。

[1.使い方](#1-使い方)
[2.技術的な話](#2-技術的な話)

# Symbol Storageとは
Symbol ブロックチェーンに削除可能なデータをアップロードするためのWebサービスです。データ保存のプロトコルにはMetalを使用しています。

また、データダウンロードにはSymbol Rest APIのデコードを活用しているため高速、かつ効率的にデータダウンロードが可能です。

:::note info
Metal version2 によってデータ書き込みが軽量化され、かつデータ以外の情報も記述可能になりました。それにあわせてREST APIでデータダウンロードが容易になったために、それらを体感してもらうべく本サービスを作成しました。

暗号化された秘密鍵はブラウザのCookieに保存するという極めて低セキュリティな状態という理由もあり、本サービスはテストネットでの使用しかできません。いずれ需要があればメインネットでも使用できるようにしたいとは思います。
:::

# 1. 使い方

こちらにアクセスしてください
https://symbol-storage.fly.dev/

## アカウント登録
事前にテストネットのアカウントを作成しておいてください。またデータ保存にはサイズに応じた手数料が必要なのでXYMを保有しているアカウントを使用してください。

Accountタブより秘密鍵とパスワードを設定し登録してください。

## Forge
Forgeすることでデータをアップロードすることができます。

データの種類に決まりはありません。画像、音声、動画、PDFはもちろん、zipファイル等の圧縮されたものでも単一のファイルであれば問題ありません。なので複数ファイルなどをアップロードしたい場合はフォルダにまとめて圧縮してください。

Metalタグをクリックし、メタデータタイプを選択してください。モザイクやネームスペースにForgeする場合は事前にそれらをデスクトップウォレットなどで用意しておく必要があります。

アカウント以外を選択した場合はTargetIDを入力する必要があります。これはモザイクならMosaicID、ネームスペースならNamespaceIDです

ファイルを選択しアカウントのパスワードを入力します。
なおFileNameは自動で設定されますが、変更したい場合は書き換えてください。

見積をクリックしてください。この時点では手数料はかかりません。ファイルの情報と必要な手数料が表示されます。問題なければ実行をクリックしてください。

ファイルサイズにあわせて、トランザクションがアナウンスされます。それらの状態が表示されます。
全て、待機中 -> 承認済みになればForge完了です。

エラーコードが表示された場合はなにか不具合があります、手数料が足りない、オーナーでないモザイクにForgeしようとしている、等

## Destroy
Forgeしたデータを削除することが可能です。メタルIDを選択しパスワード入力で見積、実行すれば削除できます。ただし、データサイズに応じた手数料が必要です。

## データ取得
Dataタブをクリックするとアップロードしたデータ一覧が表示されます。
MetalIDをクリックすることでリンクが下部に表示されます。

DLをONにすればデータ形式に関わらずファイルがダウンロードされるリンクとなります。
OFFの場合はブラウザで表示できる形式（例えば画像など）であれば表示、そうでない場合は（zipファイルなど）ダウンロードされます。

COPYはリンクをクリップボードにコピー、OPENは別タブで開きます

使い方は以上です。
モザイクに保存すればNFTになりますしアカウントであってもマルチシグでの譲渡などを考えればNFTとも呼べるかもしれません。

とにかくデータストレージとしてSymbolを使う容易な方法を体感してもらいたくこのサービスを作成しました。ぜひ一度触ってもらえれば嬉しいです！

あまり丁寧に作られていない（この記事も）ので不具合が出るかもしれませんがテストネットのみなのである程度ご理解いただければ嬉しいです！


# 2. 技術的な話

技術的というほどでも無いのですがエンジニア向けの話を少しだけ。

## MetalV2について

https://github.com/OPENSPHERE-Inc/metal-on-symbol/tree/master

Metalがversion2になったことによってバイナリでのデータ保存が可能になりました。また、テキストセクションが設けられたのでデータ以外の自由なテキストも記述することができます。

どんなテキストでもいいのですが、MetalSealというクラスが用意されており、ここにファイル名やMimeTypeなどを書き込めます。

## REST APIでのデコードについて
REST APIにてデコードが可能になりました。

::: note info
3/10現在、まだsymbolplatform/symbol-restはアップデートされていません、いずれアップデートされ、かつbootstrap等に標準搭載されれば他ノードでも使用できます。SymbolStorageでは僕のテストネットノードを使用しています。
:::

これにより、
`node/metadata/metal/:metalId`
というエンドポイントでデータをGETできるようになります。
また

`node/metadata/metal/:metalId?download=true`
というクエリの追加で、データをダウンロードするモードになります

テキストセクションについては
`Content-MetalText`というヘッダーで返します。

## SymbolStorageについて

SymbolStorageでは、登録アカウントがSourceAccountとなり、MetadataTypeがAccountの場合はTargetAccountには新たにランダムなアカウントを作成し設定しています。

これはソースとターゲットが同一の場合はDB上で検索ヒット数が膨大になるため、検索条件を狭めるためでMetalの仕様ではありません。
このターゲットの秘密鍵は漏れても問題がないためMetalSealのCommentスペースに記述し、デコード時に自動取得しています。

秘密鍵は暗号化していますが、暗号化後の文字列をブラウザにCookieで保存しています。この理由はただただ楽だからです。もし将来的にメインネットに対応する場合はDBを使う or 秘密鍵は毎度記入する。ようにしようかと考えていますがそんな日が来るかは分かりません

また、このサービスは.NET Blazor、つまりC#で書いています。

C#でMetalOnSymbolを使いたい方はこちら

https://www.nuget.org/packages/MetalOnSymbol

あまり丁寧に作ってないのでPR歓迎しています

なおC#でSymbolSDKを使いたい場合はこちら

https://www.nuget.org/packages/SymbolSdk

基本的な使い方

https://github.com/symbol-blockchain-community/symbol-sdk/tree/main/sdk/csharp/quick_learning_symbol_csharp

思いつくことを殴り書いているので、他になにかあれば追記します！