Как настроить и использовать блокчейн Kin в приложении Unity - шаг за шагом - PullRequest
4 голосов
/ 12 мая 2019

Что такое хорошее пошаговое объяснение о том, как использовать Kin Unity SDK в пустом проекте в Unity?

1 Ответ

6 голосов
/ 12 мая 2019

Вариант 1: использовать готовую обертку

Использовать обертку в этом примере кода и вызывать ее следующим образом:

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

Здесь - это подробное руководство по реализации оболочки.

Вариант 2. Создание собственной оболочки

Блокчейн Kin - это ветвь звездного протокола.Таким образом, операции в вашем приложении будут сводиться к следующему:

  1. Создание учетных записей в цепочке блоков
  2. Финансирование учетных записей в цепочке блоков
  3. Отправка платежей

Вы можете клонировать пример реализации здесь - или вы можете следовать приведенным ниже инструкциям, чтобы получить базовые знания.

Установка

Создание пустого Unityспроектируйте и установите плагин Kin Unity и измените файл Gradle, как описано здесь .

ПРИМЕЧАНИЕ: SDK работает только на Android/ iOS устройство или эмулятор.SDK не будет запускаться в редакторе Unity или Uni-Remote, поэтому вам нужно будет скомпилировать и запустить код в эмуляторе или устройстве.

Реализация

Созданиепустой сценарий MonoBehaviour - назовите его KinWrapper и объявите пространство имен Kin:

    using Kin;

Вы также можете включить слушателей блокчейна , добавив в свой MonoBehaviour следующее:

    public class KinWrapper : MonoBehaviour, IPaymentListener, IBalanceListener

Создание экземпляра

Следующее объявление экземпляров Kin Client и Kin Account

    private KinClient kinClient;
    private KinAccount kinAccount;

client обрабатывает собственный код в зависимости от платформыты используешь.(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: Вы можете сделать это вручную, вставив адрес на Служба друга-бота Кина .Это автоматически добавит вам учетную запись.

Вариант 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's python SDK или node 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);
        }
    }

ПРИМЕЧАНИЕ: У Кина две цепочки блоков. Производство и Тест . Тестовый блокчейн просто имеет «игровую валюту», на которой вы можете запускать тесты без затрат. Производственный блокчейн имеет реального значения Кин

Вызов других функций

GetBalance ()

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

DeleteAccount ()

    kinClient.DeleteAccount(0);

ПРИМЕЧАНИЕ: GetBalance () нуждается в обратном вызове, потому что он связывается с блокчейном онлайн. DeleteAccount () не делает, потому что он просто удаляет закрытый и открытый ключи на клиенте. После удаления эти ключи не могут быть восстановлены.

Обработка транзакций

Транзакции имеют следующие параметры:

  1. Напоминание: необязательная строка с дополнительная информация .

  2. Адрес: адрес получателя

  3. Сумма: сумма Кина, которую вы отправляете (без учета сборов)

  4. Комиссия: плата, которую вы заплатите за транзакцию , обработанную блокчейном . Текущая плата составляет 100/100000 КИН. Эта плата защищает блокчейн от спама.

ПРИМЕЧАНИЕ: Плата указана в наименьшей единице Кина. (Кварк). Также как самая маленькая единица доллара - это цент. Поэтому при вызове транзакции установите комиссию в 100 (кварков), что составляет 100/100000 КИН. Установка комиссии сообщает блокчейну, что вы явно согласны оплатить комиссию за транзакцию. Если вы установите слишком низкую комиссию, ваша транзакция будет отклонена.

Вы можете просмотреть все транзакции в блокчейне Кина по адресу: https://laboratory.kin.org/index.html#explorer?resource=payments

Чтобы отправить платеж, сначала создайте транзакцию локально:

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

Построение транзакции выполняет несколько операций на клиенте, чтобы авторизовать его и подписать. После того, как транзакция построена, используйте следующий обратный вызов, чтобы отправить ее в блокчейн Кина.

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

После того как вы отправили транзакцию в блокчейн Кина, вы можете прослушать ответ, чтобы убедиться, что он прошел правильно. Транзакция обычно занимает менее 10 секунд .

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

ПРИМЕЧАНИЕ: Вы должны использовать сопрограммы для функций, которые должны ждать. Это предотвратит зависание вашего кода во время ожидания ответов и улучшит взаимодействие с пользователем.

Отправка транзакций с нулевой комиссией

Вы можете отправлять транзакции с нулевой комиссией, будучи внесенными в белый список Kin Foundation. Чтобы попасть в белый список, просто зарегистрируйтесь в Kin Developer Program . После одобрения вы можете выполнить дополнительный шаг, чтобы позволить вашему клиенту отправлять транзакции с нулевой комиссией.

Чтобы отправить транзакцию с нулевой комиссией после построения транзакции:

  1. Клиенту необходимо связаться с вашим сервером из белого списка.

  2. Ваш сервер утвердит / подпишет транзакцию и отправит ее обратно клиенту.

  3. Затем клиент отправит эту утвержденную транзакцию в блокчейн Кина, и она будет обработана бесплатно.

Мы уже создали транзакцию, теперь мы добавляем ее в белый список

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

Наш сервер одобрил транзакцию и отправил обратно подписанную строку. Теперь мы отправляем эту подписанную строку в блокчейн Кина

    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
    }

Соберите все вместе

Этот код реализован на: https://github.com/hitwill/kin-sdk-unity-tutorial под лицензией MIT.

РазработчикPlaybook

Вы также можете проверить это Developer Playbook - для некоторых концепций более высокого уровня создания с Kin.

Лучшие практики

UX

(заполнитель)

Безопасность на стороне сервера

Вот отличная запись на стороне сервера.

Безопасность на стороне клиента

(заполнитель)

Сокращение количества вызовов к блокчейну

(заполнитель)

...