//tips
//unityでのブロックチェーンスクリプト確認
まずUnityで経済圏を持ったメタバースを作成していく際に必要になりそうなのでは、ネット上のサイトとの連動と情報の受け渡し部分であるといえる。
先のunityを用いた仮想通貨送金プログラムを見直し、ネット連動と情報の受け渡しの土台を調べていく。
下記のスクリプトから紐解いていく。
・TokenDeployAndSendCoroutinesUnityWebRequest
・EtherTransferCoroutinesUnityWebRequest
・GetLatestBlockVanillaNethereum
・GetLatestBlockCoroutine
まずは内容が先のブロックチェーンのpython構築のサイトと似ていたEtherTransferCoroutinesUnityWebRequest から確認していく。
UnityWebRequestとあるのでunityからEtherTransferへのwebリクエストであることがわかる。
UsingでNethereum関係の名前空間の取り込みを行なっており、ここでRPCを使っての連動を行う前準備を行なっていることがわかる。
using System.Collections;
using Nethereum.JsonRpc.UnityClient;
using Nethereum.RPC.Eth.DTOs;
using Nethereum.Util;
using UnityEngine;
using UnityEngine.UI;
public class EtherTransferCoroutinesUnityWebRequest : MonoBehaviour {
public string Url = "http://localhost:8545";
http://localhost:8545は下記のように説明されている。
http://localhost:8545 is the RPC port of your locally running Ethereum node software
Ethereumのネットワークと接続するエンドポイントを自身のPCに設定。
エンド ポイントはネットワーク上のコンピュータを特定するIPアドレスと、そのコンピュータ上のポートを特定するポート番号の組み合わせによって表される。
//秘密鍵
public string PrivateKey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7";
//公開鍵
public string AddressTo = "0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe";
//数量
public decimal Amount = 1.1m;
//送金の際の手数料
public decimal GasPriceGwei = 2;
public string TransactionHash = "";
public decimal BalanceAddressTo = 0m;
public InputField InputUrl;
public InputField InputPrivateKey;
public InputField InputAddressTo;
public InputField InputAmount;
public InputField ResultBalanceAddressTo;
public InputField ResultTxnHash;
上記のような可変の記入項目を設けておく。
void Start () {
URLなど記入項目を各InputFieldのテキスト部分に代入し、表示。
InputUrl.text = Url;
InputPrivateKey.text = PrivateKey;
InputAddressTo.text = AddressTo;
InputAmount.text = Amount.ToString();
}
TransferボタンをクリックするとTransferEther()のコルーチンを実行。
public void TransferRequest()
{
StartCoroutine(TransferEther());
}
public IEnumerator TransferEther()
{
Url = InputUrl.text;
PrivateKey = InputPrivateKey.text;//秘密鍵
AddressTo = InputAddressTo.text;//相手先公開鍵
Amount = System.Decimal.Parse(InputAmount.text);//stringからdecimalへ型変換
EthTransferUnityRequestのオブジェクトを新たに作成し、引数に自身のポート番号と秘密鍵を入れている。
//initialising the transaction request sender
var ethTransfer = new EthTransferUnityRequest(Url, PrivateKey);
公開鍵のオブジェクトを別途作成。
var receivingAddress = AddressTo;
オブジェクトのTransferEtherメソッドを実行。引数に公開鍵と数量、送金手数料を入れている。
yield return ethTransfer.TransferEther(receivingAddress, Amount, GasPriceGwei);
例外が発生している場合はコルーチン処理を中断して離脱。
if (ethTransfer.Exception != null)
{
Debug.Log(ethTransfer.Exception.Message);
yield break;
}
問題なければresultメソッドを使用してオブジェクトのハッシュを作成。
TransactionHash = ethTransfer.Result;
ResultTxnHash.text = TransactionHash;
Debug.Log("Transfer transaction hash:" + TransactionHash);
この段階で送付先の公開鍵と結合させているのかもしれない。
ここでマイニング待ちのトランザクションオブジェクトを作成。
//create a poll to get the receipt when mined
var transactionReceiptPolling = new TransactionReceiptPollingRequest(Url);
マイニング待ちのトランザクションとして2秒ごとにハッシュを引数とする申請を送る。
参考ページ:https://docs.nethereum.com/en/latest/unity3d-sending-ether/
//checking every 2 seconds for the receipt
yield return transactionReceiptPolling.PollForReceipt(TransactionHash, 2);
Debug.Log("Transaction mined");
残高の確認を行うためEthGetBalanceUnityRequestオブジェクトを新たに作成。
var balanceRequest = new EthGetBalanceUnityRequest(Url);
下記で残高確認とブロックチェーン最新版取得を行う。
yield return balanceRequest.SendRequest(receivingAddress, BlockParameter.CreateLatest());
BalanceAddressTo = UnitConversion.Convert.FromWei(balanceRequest.Result.Value);
これは名前空間の中身を見て描かれているメソッドを読まないと実際の処理内容はわからなさそう。
ResultBalanceAddressTo.text = BalanceAddressTo.ToString();
Debug.Log("Balance of account:" + BalanceAddressTo);
}
}