4

What is a good step by step explanation on how to use the Kin Unity SDK in an empty project in Unity?

4

1 回答 1

6

选项 1:使用预制包装

在这10 分钟的设置代码(客户端和服务器)中使用包装器,并按如下方式调用它:

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

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

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

Kin 区块链是恒星协议的一个分支。因此,您的应用程序中的操作将归结为以下内容:

  1. 在区块链上创建账户
  2. 区块链上的资金账户
  3. 发送付款

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

安装

创建一个空的 Unity 项目,安装Kin Unity 插件并按照此处所述修改您的 gradle 文件。

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

执行

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

    using Kin;

您还可以通过将以下内容添加到 MonoBehaviour 来启用区块链侦听器:

    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);
    }

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

注意: “创建的帐户”只是设备上生成的公钥和私钥。这些本地密钥使设备能够与区块链通信。

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

    kinAccount.GetPublicAddress();

入职/为帐户注资

由于此密钥仅存在于本地,因此您需要将其“载入”到区块链中。换句话说,需要调用一个特殊的函数,进行在线注资和注册。在此步骤完成之前,该地址在区块链上被认为是无效的,并且无法接收或进行交易。这是避免垃圾邮件和不必要的帐户创建的恒星协议的一部分。

您可以通过调用以下函数检查帐户是否已注册并入金:

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

         }
          else
         {

         }
    }

要在测试区块链上注册并为账户注资,您有 3 个选项:

选项 1:您可以通过将地址粘贴到Kin 的朋友机器人服务上手动执行此操作。这将自动为您注册帐户。

选项 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 SDK节点 SDK来执行载入。

这是一个方便的 python 实现Node.js 实现 ,您可以将其用于您的服务器。

从 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 有两个区块链。生产测试。测试区块链仅具有“游戏货币”,您可以在其上运行测试而不会产生成本。生产区块链具有现实世界价值 Kin

调用其他函数

获得平衡()

    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() 不会,因为它只是删除客户端上的私钥和公钥。一旦删除,这些密钥将无法恢复。

处理交易

事务具有以下参数:

  1. 备注:带有额外信息的可选字符串。

  2. 地址:收件人地址

  3. 金额:您发送的 Kin 数量(不包括费用)

  4. 费用:您为由区块链处理的交易支付的费用。当前费用为 100/100000 KIN。这笔费用可以保护区块链免受垃圾邮件的侵害。

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

您可以在以下网址查看 Kin 区块链上的所有交易:https ://laboratory.kin.org/index.html#explorer?resource=payments

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

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

构建事务在客户端上执行多个操作以对其进行授权和签名。交易建立后,使用以下回调将其发送到 Kin 的区块链。

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

将交易发送到 Kin 的区块链后,您可以监听响应,以确保它正确通过。一个事务通常需要不到 10 秒的时间来完成。

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

注意:对于需要等待的函数,您应该使用协程。这将防止您的代码在等待响应时挂起,并创造更好的用户体验。

以零费用发送交易

您可以通过被 Kin 基金会列入白名单以零费用发送交易。要获得白名单,只需注册Kin 开发者计划。一旦获得批准,您可以执行一个额外的步骤,让您的客户以零费用发送交易。

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

  1. 客户端将需要联系您的白名单服务器。

  2. 您的服务器将批准/签署交易并将其发送回客户端。

  3. 然后,客户将这个批准的交易发送到 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 环境中使用此预先批准的服务器。 http://34.239.111.38:3000/whitelist

    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 );
        }
    }

一旦获得批准,您就可以使用示例 python 实现Node.js 实现来批准服务器上的事务。您还可以使用 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 许可下在https://github.com/hitwill/kin-sdk-unity-tutorial上找到此代码。

开发者手册

您还可以查看此开发人员手册- 了解使用 Kin 进行创建的一些更高级别的概念。

最佳实践

用户体验

(占位符)

服务器端安全

这是关于服务器端安全性的精彩文章。

客户端安全

(占位符)

减少对区块链的调用

(占位符)

于 2019-05-12T05:45:06.777 回答