unity3d - 如何在Unity应用中设置和使用Kin区 block 链-逐步

标签 unity3d sdk blockchain kin

关于如何在Unity中的空项目中使用Kin Unity SDK的逐步说明,有什么很好的解释?

最佳答案

选项1:使用预制包装纸

在此10 minute set up code(客户端和服务器)中使用包装器,并按以下方式调用它:

    kinWrapper.SendPayment(1.00M, "test send", address);
    kinWrapper.Balance();
    //etc


Here是有关实现包装器的详细教程。

选项2:创建自己的包装器

Kin blockchainfork of the stellar protocol。因此,您应用程序中的操作可归结为以下内容:


在区块链上创建账户
区块链上的资金账户
汇款


您可以克隆示例实现here-或可以按照以下步骤进行基本了解。

安装

创建一个空的Unity项目,然后安装Kin Unity Plugin并按照here所述修改gradle文件。

注意:SDK仅在Android / iOS设备或模拟器上运行。 SDK不会在统一编辑器或统一远程中运行-因此您需要在仿真器或设备中编译并运行代码。

实作

创建一个空的MonoBehaviour脚本-将其命名为KinWrapper,并声明Kin命名空间:

    using Kin;


您还可以通过将以下内容添加到MonoBehaviour中来启用blockchain listeners

    public class KinWrapper : MonoBehaviour, IPaymentListener, IBalanceListener


实例化

接下来声明Kin客户和Kin帐户的实例

    private KinClient kinClient;
    private KinAccount kinAccount;


客户端根据您使用的平台来处理本机代码。 (Android或iOS)。该帐户是您将要使用的主界面。

创建一个账户

在使用该帐户之前,您首先必须通过客户端实例化它。

    kinClient = new KinClient(Kin.Environment.Test, "appId");
    if (!kinClient.HasAccount()) 
    {
        kinAccount = kinClient.AddAccount();
    }else{
        kinAccount = kinClient.GetAccount(0);
    }


上面的代码首先检查设备上是否存在本地帐户。如果不是,它将在设备上创建一个帐户,并将其作为参考返回。

注意:“创建的帐户”只是设备上生成的public key and private key。这些本地密钥使设备能够与区块链进行通信。

现在,您可以通过调用以下命令获取公钥(客户的区块链地址):

    kinAccount.GetPublicAddress();


入职/为帐户注资

由于此密钥仅在本地存在,因此您需要将其“加载”到区块链中。换句话说,需要调用一个特殊功能来在线进行资助和注册。在完成此步骤之前,该地址在区块链上被视为无效,无法接收或进行交易。这是avoid spam and unnecessary account creation恒星协议的一部分。

您可以通过调用以下功能来检查该帐户是否已注册并注资:

    kinAccount.GetStatus(GetStatusCallback)
    void GetStatusCallback(KinException ex, AccountStatus status)
    {
         if (status == AccountStatus.Created)
         {

         }
          else
         {

         }
    }


要在测试区块链上注册帐户并为其提供资金,您有3种选择:

选项1:您可以通过将地址粘贴到Kin's friend-bot service上来手动执行此操作。这将自动为您注册该帐户。

选项2:您可以将您的代码作为http请求通过代码调用友好机器人
https://friendbot-testnet.kininfrastructure.com/?addr=address_here

    public static IEnumerator FundAccount( string publicAddress, Action<bool> onComplete = null )
    {
        var url = "http://friendbot-testnet.kininfrastructure.com/?addr=" + publicAddress;
        var req = UnityWebRequest.Get( url );

        yield return req.SendWebRequest();

        if( req.isNetworkError || req.isHttpError )
        {
            Debug.Log( req.error );
            if( onComplete != null )
                onComplete( false );
        }
        else
        {
            Debug.Log( "response code: " + req.responseCode );
            Debug.Log( req.downloadHandler.text );
            if( onComplete != null )
                onComplete( true );
        }
    }


选项3:您可以使用服务器端代码自己提供资金(在生产环境中必须这样做)。基本上,您的客户将需要致电您的服务器并要求加入。然后,您的服务器可以使用Kin的python SDKnode SDK来执行入职。

这是您可以用于服务器的便捷的python implementationNode.js implementation

从Unity调用实现很简单,如下所示:

    public IEnumerator FundMe(decimal amount, Action<bool> fundCallback = null)
    {
        WWWForm form = new WWWForm();
        form.AddField("address", kinAccount.GetPublicAddress());
        form.AddField("amount", amount.ToString());
        reqUrl = "http://address.to.your.server";
        var req = UnityWebRequest.Post(reqUrl, form);
        yield return req.SendWebRequest();

        if (req.isNetworkError || req.isHttpError)
        {
            Debug.LogError(req.error);
            fundCallback(false);
        }
        else
        {
            fundCallback(true);
        }
    }


注意:Kin有两个区块链。 ProductionTest。测试区块链仅具有“运行货币”,您可以在不产生成本的情况下运行测试。生产区块链具有real world value Kin

调用其他功能

GetBalance()

    account.GetBalance(GetBalanceCallback);
    void GetBalanceCallback(KinException ex, decimal balance)
    {
        if (ex == null)
        {
            Debug.Log( "Balance: " + balance );
        }
        else
        {
            Debug.LogError( "Get Balance Failed. " + ex );
        }
    }


删除帐户()

    kinClient.DeleteAccount(0);


注意:GetBalance()需要回调,因为它正在与区块链在线通信。 DeleteAccount()不会,因为它只是删除客户端上的私钥和公钥。一旦删除,这些密钥将无法恢复。

处理交易

事务具有以下参数:


备注:带有extra information的可选字符串。
地址:收件人的地址
金额:您发送的亲戚金额(不包括费用)
费用:您为交易支付的费用为processed by the blockchain。当前费用为100/100000 KIN。该费用可保护区块链免受垃圾邮件的侵害。


注意:费用以Kin的最小单位表示。 (夸克)。就像一美元的最小单位是一分。因此,在进行交易时,将费用设置为100(夸克)-100/100000 KIN。设置费用告诉区块链您明确同意支付交易费用。如果您将费用设置得太低,则交易将被拒绝。

您可以在以下位置查看Kin的区块链上的所有交易:

要发送付款,请先在本地构建交易:

    kinAccount.BuildTransaction(address, amount, fee, memo, BuildTransactionCallBack);


建立交易会在客户端执行https://laboratory.kin.org/index.html#explorer?resource=payments来授权并签名。建立交易后,使用以下回调将其发送到Kin的区块链。

    void BuildTransactionCallBack(KinException ex, Transaction transaction)
    {
        if (ex == null)
        {
            kinAccount.SendTransaction(transaction, SendTransactionCallback);
        }
        else
        {
            Debug.LogError("Build Transaction Failed. " + ex);
        }
    }


将交易发送到Kin的区块链后,您可以监听响应,以确保交易正确进行。事务通常需要several operations才能完成。

    void SendTransactionCallback(KinException ex, String transactionId)
    {
        if (ex == null)
        {
            //Success
        }
        else
        {
            Debug.LogError("Send Transaction Failed. " + ex);
        }
    }


注意:您应将less than 10 seconds用于需要等待的功能。这可以防止您的代码在等待响应时挂起,并可以提供更好的用户体验。

以零费用发送交易

您可以被Kin基金会列入白名单,以零费用发送交易。要列入白名单,只需在co-routines中注册。获得批准后,您可以执行额外的步骤,让您的客户以零费用发送交易。

在构建交易后发送零费用交易:


客户需要联系您列入白名单的服务器。
您的服务器将批准/签署交易,并将其发送回客户端。
然后,客户将把这笔批准的交易发送到Kin的区块链上,并免费进行处理。


我们已经建立了交易,现在我们将其列入白名单

    void BuildTransactionCallBack(KinException ex, Transaction transaction)
    {
        if (ex == null)
        {
            StartCoroutine(WhitelistTransaction(transaction, WhitelistTransactionCallback))
        }
        else
        {
            Debug.LogError("Build Transaction Failed. " + ex);
        }
    }



我们正在呼叫列入白名单的服务器以授权交易

    IEnumerator WhitelistTransaction(Transaction transaction, Action<string, string> onComplete)
    {
        var postDataObj = new WhitelistPostData(transaction);
        var postData = JsonUtility.ToJson(postDataObj);
        var rawPostData = Encoding.UTF8.GetBytes(postData);

        // UnityWebRequest does not work correclty when posting a JSON string so we use a byte[] and a hacky workaround
        var req = UnityWebRequest.Post(baseURL + whitelistURL, "POST");
        req.SetRequestHeader("Content-Type", "application/json");
        req.uploadHandler = new UploadHandlerRaw(rawPostData);

        yield return req.SendWebRequest();

        if (req.isNetworkError || req.isHttpError)
        {
            Debug.LogError(req.error);
            onComplete(null, null);
        }
        else
        {
            onComplete(req.downloadHandler.text, transaction.Id);
        }
    }



我们的服务器已批准交易,并发送回签名字符串。现在,我们将此签名的字符串发送到Kin的区块链

    void WhitelistTransactionCallback(string whitelistTransaction, string transactionId)
    {
        if (whitelistTransaction != null)
        {
            kinAccount.SendWhitelistTransaction(transactionId, whitelistTransaction, SendTransactionCallback);
        }
        else
        {
            Debug.LogError("Whitelisting Transaction Failed. ");
        }
    }


和往常一样,我们等待交易是否成功

    void SendTransactionCallback(KinException ex, String transactionId)
    {
        if (ex == null)
        {
            //Success
        }
        else
        {
            Debug.LogError("Send Transaction Failed. " + ex);
        }
    }


在服务器被批准列入白名单之前,您可以在TEST环境中使用此预先批准的服务器。 Kin Developer Program

    public static IEnumerator WhitelistTransaction( Transaction transaction, Action<string> onComplete = null )
    {
        var postDataObj = new WhitelistPostData( transaction );
        var postData = JsonUtility.ToJson( postDataObj );
        var rawPostData = Encoding.UTF8.GetBytes( postData );
        // UnityWebRequest does not work correclty when posting a JSON string so we use a byte[] and a hacky workaround
        var url = "http://34.239.111.38:3000/whitelist";
        var req = UnityWebRequest.Post( url, "POST" );
        req.SetRequestHeader( "Content-Type", "application/json" );
        req.uploadHandler = new UploadHandlerRaw( rawPostData );

        yield return req.SendWebRequest();

        if( req.isNetworkError || req.isHttpError )
        {
            Debug.Log( req.error );
            if( onComplete != null )
                onComplete( null );
        }
        else
        {
            Debug.Log( "response code: " + req.responseCode );
            Debug.Log( req.downloadHandler.text );
            if( onComplete != null )
                onComplete( req.downloadHandler.text );
        }
    }


批准后,您可以使用示例http://34.239.111.38:3000/whitelistpython implementation批准服务器上的事务。您也可以使用node.js SDK。

聆听区块链上的事件

您可以添加侦听器,以防止您的客户端过度查询区块链。只需添加以下代码

    kinAccount.AddPaymentListener(this);
    kinAccount.AddBalanceListener(this);

   public void OnEvent(PaymentInfo data)
   {
         //Listening for incoming and outgoing payments
   }

    public void OnEvent(decimal balance)
    {
        //Listening for changes in client's balance
    }


全部放在一起

您可以在MIT许可证下的Node.js implementation上找到实现的代码。

开发者手册

您也可以检查https://github.com/hitwill/kin-sdk-unity-tutorial-有关使用Kin创建的一些高级概念。

最佳实践

用户体验

(占位符)

服务器端安全

这是服务器端安全性上的Developer Playbook

客户端安全

(占位符)

减少对区块链的呼叫

(占位符)

关于unity3d - 如何在Unity应用中设置和使用Kin区 block 链-逐步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56096526/

相关文章:

kubernetes - 在将Hyperledger Fabric对等方部署到Kubernetes时获取 “cannot init crypto”

c# - 如何使用 GetComponent 语法

unity3d - RectTransform坐标根据TextMesh Pro文字大小

opencv - Microsoft HoloLens Spectator View Rig - 使用与文档所述不同的相机

sdk - 寻找 Livescribe SDK,和/或破解 Pulse Smartpen 的方法

Android 模拟器未与我的 React Native 应用程序一起运行

ios - 如何使用 web3swift 创建原始交易?

go - 如何在仅最后几个字节发生变化的golang数据中有效地散列(SHA 256)

.net - 如何设置 DotNetty(Netty) Bootstrap.ConnectAsync 超时?

android-studio - Android studio sdk 不包含任何平台