//tips
//unity/web連動イーサ送金デモ
Panelでのイーサ送金デモをベースにバックグラウンドで機能を実装し、オブジェクトの接触反応をTransferボタンクリックと同じ効果を持たせる。
送料や送信元、宛先などは固定で考えていく。
まずはinfuraの登録がまだ生きているかを確認。
https://infura.io/dashboard
EtherTransfer2のurl変数にhttps://ropsten.infura.io/v3…を代入。
Metamaskの送信元の秘密鍵をコピーしてprivatekey部分に挿入。送信先のmetamask公開鍵も代入。
public void TransferRequest()
{
StartCoroutine(TransferEther());
}
をOnCollisionEnterに紐付ける。
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.name == "Sphere")
{
Debug.Log("Hit");
//APIPOSTUP.jsonGO();
EtherTransfer2.TransferRequest();
}
}
EtherTransferスクリプトだけではなくその周辺のスクリプトも修正が必要なのでそちらにも手を加える。
送信元のmetamaskを確認すると0.8965から0.8955になっていたので送信は行われていそう。
ただ、受け取り側は0.1のまま変化していないのでもう少し時間をおいて確認してみる。
今回は単純にスクリプトに全ての送信情報を先に入力しておきinputfield部分からの受け取りと反映を無くした。
public void TransferRequest()
{
StartCoroutine(TransferEther());
Debug.Log("TransferRequest");
}
public IEnumerator TransferEther()
{
var ethTransfer = new EthTransferUnityRequest(Url, PrivateKey);
var receivingAddress = AddressTo;
yield return ethTransfer.TransferEther(receivingAddress, Amount, GasPriceGwei);
if (ethTransfer.Exception != null)
{
Debug.Log(ethTransfer.Exception.Message);
yield break;
}
Debug.Log("Transfer");
TransactionHash = ethTransfer.Result;
Debug.Log("Transfer transaction hash:" + TransactionHash);
var transactionReceiptPolling = new TransactionReceiptPollingRequest(Url);
yield return transactionReceiptPolling.PollForReceipt(TransactionHash, 2);
Debug.Log("Transaction mined");
var balanceRequest = new EthGetBalanceUnityRequest(Url);
yield return balanceRequest.SendRequest(receivingAddress, BlockParameter.CreateLatest());
BalanceAddressTo = UnitConversion.Convert.FromWei(balanceRequest.Result.Value);
Debug.Log("Balance of account:" + BalanceAddressTo);
}
送金の方は確認できたが受領側は確認できないので問題点を見つけていく。
Deployment transaction hashのデバッグは確認できているので、このコードを書き込んであるTokenDeployAndSendCoroutinesUnityWebRequestスクリプトの続き部分を確認する。
次のデバッグは
//create a poll to get the receipt when mined
var transactionReceiptPolling = new TransactionReceiptPollingRequest(url);
//checking every 2 seconds for the receipt
yield return transactionReceiptPolling.PollForReceipt(transactionHash, 2);
var deploymentReceipt = transactionReceiptPolling.Result;
Debug.Log("Deployment contract address:" + deploymentReceipt.ContractAddress);
となっているのでこちらのどこかでつまづいている可能性が高い。
https://mainnet.infura.io
にurlを戻して実行を確認する。
今度はHTTP/1.1 403 Forbiddenの表示がされてしまった。
Smart contranctの流れを確認する必要を感じたので下記を確認していく。
https://docs.nethereum.com/en/latest/unity3d-smartcontracts-getting-started/
var transactionReceiptPolling = new TransactionReceiptPollingRequest(url);
Debug.Log("1");
yield return transactionReceiptPolling.PollForReceipt(transactionHash, 2);
Debug.Log("2");
var deploymentReceipt = transactionReceiptPolling.Result;
とデバッグログを入れたところ1は返ってくるが2が返らないことが分かった。
If no errors have occurred we can retrieve the transaction hash from the Request and Poll every 2 seconds to wait for the transaction to be mined.とあるのでthe transaction to be minedされていないことが問題となっている。
public class HitBall : MonoBehaviour
{
[SerializeField]
APIPOSTUP APIPOSTUP;
[SerializeField]
EtherTransfer2 EtherTransfer2;
の部分のスクリプトの保存ができておらず、unity側でSerializeFieldのEtherTransfer2の登録がされていなかったのが問題かもしれない。
再度実行。もう少し待機して変化を確認する。無事に送金が行えていた。即座にではないが1分後には反映されていたように思う。
この送金内容をwebの方に反映するにはOnCollisionEnter(Collision collision)にAPIPOSTUP.jsonGO();を復活させ、
public class APIPOSTUP : MonoBehaviour
{
double count =0.01;
public void jsonGO()
{
StartCoroutine(Upload());
}
IEnumerator Upload()
{
WWWForm form = new WWWForm();
//form.AddField("myField", "myData");
form.AddField("name", "送金額");
form.AddField("message", count+"ETH");
のように表示内容を変えた。ただ、0.01が微妙な数字であるため、これはjsの方で加工することにする。
JSを修正し、下記のようにした。無事確認できた。
.done(function(json)
{
function calc()
{
var number=0;
//var obj =JSON.parse(json);
for(i = 0, len =json.length; i < len; i++)
{
var num = parseInt(json[i]['message']);
number = number + num;
}
return number;
}
result = calc();
$('#postsmen').text(result*0.01)
$('#mycount').text("送金額")