Unityでブロックチェーンに触れてみよう・送金編（Symbol）

送金も簡単にできるので、行ってみましょー

ベースは以前作ったものを使用していきます。（別に使う必要あまり無いけども）

https://qiita.com/feiton/items/f3f5df056afd8aeb5b85


# １.送金用にSDKを組み込み
送金のために必要なSDKを組み込んでいきます。
今回は、toshiさんが作られているSymbolCsDualSDKを使用させて貰います。

①以下のサイトから、CatSdk.dllとBouncyCastle.Crypto.dllをダウンロードします。
https://github.com/0x070696E65/symbol_cs_dual_sdk
Usageに書かれているとおり、Releaseのリンクに飛んでダウンロードすればOKです。

②UnityのAssetsにダウンロードしたdllをD&D
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/03a40880-a9e5-8446-cae4-f6e4a7ffc861.jpeg)
③組み込み完了

# ２.送金用のスクリプトを作成
送金のためのスクリプトを作成します。

①メニューバーのAssets->Create->C# Scriptを選択
ファイル名は何でも良いですが『SendXYM』としておきます。

②以下のコードをコピペして保存します。
※送金数量が1000000になっててびっくりするかもしれませんが、Symbolの通貨であるXYMは可分性の設定があり、1000000が1XYMになります。
これはトークンごとに違うので、数量１がそのまま１トークンを表すこともあるので、他のものを送りたい場合は可分性を確認して設定を行って下さい。
```cs:SendXYM.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using CatSdk.CryptoTypes;
using CatSdk.Facade;
using CatSdk.Utils;
using CatSdk.Symbol;
using CatSdk.Symbol.Factory;
using System.Text;
using System;
using Cysharp.Threading.Tasks;

public class SendXYM : MonoBehaviour
{
	[SerializeField]
	string m_PrivateKeyCode = "";

	public async void SendMosaicSimple( string sendAddress )
	{
		SymbolFacade facade = new SymbolFacade( CatSdk.Symbol.Network.MainNet );

		// 送信元アドレス、キー取得
		var alicePrivateKey = new PrivateKey( m_PrivateKeyCode );
		var alicekeyPair = new KeyPair( alicePrivateKey );
		var alicePublicKey = alicekeyPair.PublicKey;
		var aliceAddress = facade.Network.PublicKeyToAddress( alicePublicKey.ToString() );

		// 送信先アドレス取得
		var bobAddress = new UnresolvedAddress( Converter.StringToAddress( sendAddress ) );

		// 送信モザイク(1XYM)
		UnresolvedMosaic item1 = new UnresolvedMosaic();
		item1.MosaicId = new UnresolvedMosaicId( 0x6BED913FA20223F8 ); // <- ここで送信するトークン（モザイク）を設定してます
		item1.Amount = new Amount( 1 * 1000000 ); // <- ここで送信するトークン（モザイク）の数量を設定してます

		// トランザクションデータ用意
		var tx = new TransferTransactionV1
		{
			Network = NetworkType.MAINNET,
			RecipientAddress = new UnresolvedAddress( bobAddress.bytes ),
			Mosaics = new UnresolvedMosaic[]
				{
					item1
				},
			SignerPublicKey = alicePublicKey,
			Message = Converter.Utf8ToPlainMessage( "(っ'-')╮=͟͟͞͞ﾌﾞｫﾝ" ),
			Fee = new Amount( 100000 ),
			Deadline = new Timestamp( facade.Network.FromDatetime<NetworkTimestamp>( DateTime.UtcNow ).AddHours( 2 ).Timestamp )
		};
		tx.Sort();

		var signature = facade.SignTransaction( alicekeyPair, tx );
		var payload = TransactionsFactory.AttachSignature( tx, signature );
		var signed = TransactionsFactory.AttachSignatureTransaction( tx, signature );
		var hash = facade.HashTransaction( TransactionsFactory.AttachSignatureTransaction( tx, signature ) );

		// 送信
		string node = "http://wolf.importance.jp:3000";
		byte[] sendData = Encoding.UTF8.GetBytes( payload );
		using( UnityWebRequest www = UnityWebRequest.Put( node + "/transactions", sendData ) )
		{
			www.SetRequestHeader( "Content-Type", "application/json" );
			await www.SendWebRequest();
			var response = www.downloadHandler.text;
			Debug.Log( "response : " + response );
		}
	}
}

```
※上記スクリプトは、toshiさんが以前作られたSymnityから拝借しています

# ３.送金用ボタンを用意
ボタンを押したら送金されるようにボタンを用意します。

①Hierarchyウィンドウで右クリックを押して、Buttonを選択します
※TMP Importerウィンドウが表示された場合は、Import TMP Essentials と Import TMP Examples&Extrasもクリックして、ウィンドウを閉じて下さい。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/40001bed-9dff-e5fb-0ff0-711a339b0fd4.jpeg)
②一緒に生成されたcanvasを選択して、RenderModeをScreenSpace Overlayに変更する
![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/b6442959-53d7-302d-5fc9-1c8946d464e4.jpeg)
③ButtonのPosX,PosYを0にしておきます
![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/a00b09b1-13ac-490d-23cd-3cdffe7ece24.jpeg)

# ４.送金用ボタンに送金用スクリプトを設定
送金用ボタンに送金用スクリプトを設定して、ボタンを押したら送金が行われるようにします。

①Buttonを選択し、AddComponentでSendXYMスクリプトを追加します。
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/da184996-c777-c514-47b6-f0a57fee9cc8.jpeg)
②追加したSendXYMのPrivateKeyCodeに秘密鍵を記載します。
![9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/2b4f8496-3100-f500-8bd1-c23db1449808.jpeg)
③ButtonのOnClickの＋をクリックして、クリック時の処理を追加できるようにします
![10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/f0cf29a3-5ef4-0fc8-73ae-cf3484c1c3e8.jpeg)
④OnClickにButtonをD&Dして登録します。
![11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/b0c245da-b8ab-c62e-6abf-ad71fbad822d.jpeg)
⑤NoFunctionをSendMosaicSimpleにします。
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/ea310a2e-f376-bc19-3352-61cfe27f09db.jpeg)
⑥画像の指定部分に送信先のアドレスを設定します。
![13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/283d53a0-dd21-5188-381a-19c582131281.jpeg)

# ５.プロジェクトを実行して、結果を確認
プロジェクトを実行して、送金を試します。

①再生ボタンをクリックし実行
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666230/c95576c7-487c-6a12-f659-71441f210e5e.png)
②送金ボタンをクリックします。
③各種ウォレットで送金が行われていることを確認します。

# ６.おわり
これで送金ができるようになったかと思います。

今回書いてきた記事達は説明無しのやり方のみ記載した形となりますので、興味を持たれた方は他に色々充実した情報を記載していただいている記事がたくさんありますので、ぜひ勉強がてら調べてみて下さい。
Symbolだと、速習Symbolという素晴らしい記事がありますので、そちらを見てみることをオススメします。
https://github.com/xembook/quick_learning_symbol

<font color="Red">__※今回の記事で秘密鍵を入力する部分がありますが、秘密鍵は他人に知られてしまうとウォレット内の資産を自由にされてしまうので絶対に他人に知られないように注意して下さい！__</font>
<font color="Red">__自作したプログラム内に秘密鍵を記載したまま、ついうっかり公開しちゃったりとか。__</font>
<font color="Red">__完成したゲームやツールなどに埋め込んでいる場合も解析されると秘密鍵は漏洩します。__</font>
<font color="Red">__暗号化するなど対策はありますが、とりあえず秘密鍵はバレたら終わると覚えておいてください。__</font>

さて、最後に怖いことも書きましたが、色々遊んでいるうちに分かってくると思うので、必要以上に怯えず、まずは楽しんでゲームやツールを作っていきましょう！
↓以下のサイトでSymbolで作られた色々なゲームが見れますので、ぜひ参考にしてみて下さい。
https://symbol-community.com/community/1