簡體   English   中英

如何在Unity應用程序中設置和使用Kin區塊鏈 - 一步一步

[英]How to set up and use the Kin blockchain in a Unity app - Step by step

有關如何在Unity中的空項目中使用Kin Unity SDK的一步一步解釋是什么?

選項1:使用預制的包裝紙

使用此示例代碼中的包裝器並按如下方式調用它:

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

是關於實現包裝器的詳細教程。

選項2:創建自己的包裝器

Kin區塊鏈恆星協議的一個分支 因此,您應用中的操作將歸結為以下內容:

  1. 在區塊鏈上創建帳戶
  2. 區塊鏈的資金賬戶
  3. 發送付款

您可以在此處克隆示例實現 - 或者您可以按照以下步驟進行基本了解。

安裝

創建一個空的團結項目,並安裝健Unity插件並按照上述方法修改文件的gradle 這里

注意: SDK僅在Android / iOS設備或模擬器上運行。 SDK 不會在統一編輯器或統一遠程中運行 - 因此您需要在模擬器或設備中編譯和運行代碼。

履行

創建一個空的MonoBehaviour腳本 - 將其命名為KinWrapper ,並聲明Kin命名空間:

    using Kin;

您還可以通過將以下內容添加到MonoBehaviour來啟用區塊鏈監聽器

    public class KinWrapper : MonoBehaviour, IPaymentListener, IBalanceListener

實例化

接下來聲明Kin Client和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的friend-bot服務上的地址來手動執行此操作。 這將自動為您提供帳戶。

選項2:您可以通過代碼作為http請求調用friend-bot 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

調用其他功能

為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()不會,因為它只刪除客戶端上的私鑰和公鑰。 刪除后,這些密鑰無法恢復。

處理交易

事務具有以下參數:

  1. 備注:帶有額外信息的可選字符串。

  2. 地址:收件人的地址

  3. 金額:您發送的Kin 金額 (不包括費用)

  4. 費用:您將為區塊鏈處理的交易支付的費用。 目前的費用是100/100000 KIN。 此費用可保護區塊鏈免受垃圾郵件的侵害。

注意:費用以Kin的最小單位計算。 (誇克)。 就像一美元的最小單位是一分錢。 因此,在調用交易時,將費用設置為100(誇克) - 即100/100000 KIN。 設置費用告訴區塊鏈您明確同意支付交易費用。 如果您將費用設置得太低,您的交易將被拒絕。

您可以在以下網址查看Kin的區塊鏈上的所有交易: https ://laboratory.kin.org/index.html#explorer resources = 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 Developer Program即可 獲得批准后,您可以執行額外步驟,讓您的客戶以零費用發送交易。

在構建交易后發送零費用交易:

  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創建的更高級別概念。

最佳做法

UX

(占位符)

服務器端安全性

這是服務器端安全性的一個很好的寫法

客戶端安全性

(占位符)

減少對區塊鏈的調用

(占位符)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM