В последние годы технология блокчейна быстро развивается, и все больше компаний и разработчиков изучают способы интеграции блокчейна в свои приложения. Разработчики Android не являются исключением, и интеграция блокчейна Ethereum в приложения Android может предложить множество преимуществ, таких как децентрализация, неизменность и прозрачность.

В этой статье мы рассмотрим, как интегрировать блокчейн Ethereum в приложения для Android с помощью библиотеки Web3j. Мы покажем, как подключиться к узлу блокчейна, создать кошелек Ethereum, получить адрес кошелька, проверить баланс и отправить средства с помощью библиотеки Web3j. Для подключения к узлу блокчейна мы будем использовать Infura API, который позволяет нам взаимодействовать с сетью Ethereum без запуска собственного узла.

Следуя этому руководству, вы получите четкое представление о том, как интегрировать блокчейн Ethereum в приложения для Android с помощью библиотеки Web3j. Вы узнаете, как взаимодействовать с сетью Ethereum и как создавать безопасные децентрализованные приложения, использующие возможности технологии блокчейн.

Чтобы интегрировать блокчейн Ethereum в наше приложение для Android, нам нужно сделать несколько начальных шагов. Первый из них — настроить наше подключение к Infura API, что позволит нам взаимодействовать с сетью Ethereum без запуска полного узла на наших собственных серверах.

Инфура

Infura предоставляет разработчикам удобный способ взаимодействия с блокчейном Ethereum без необходимости поддерживать собственный локальный узел. С помощью Infura разработчики могут использовать его API для подключения к сети Ethereum и выполнения различных операций, таких как чтение и запись в блокчейн, запрос данных смарт-контракта и многое другое. Чтобы получить доступ к API Infura, разработчикам нужен ключ API, который позволяет им безопасно взаимодействовать с блокчейном Ethereum.

Создание ключа API Infura:

1. Создайте учетную запись.

  1. Завести аккаунт.

2.Создайте проект.

3. Получите ключ API.

После того, как вы создали свой проект, вы можете получить URL-адрес конечной точки, который используется для отправки запросов API из ваших децентрализованных приложений и служит основной точкой подключения к блокчейну Ethereum. Важно отметить, что URL-адрес конечной точки может измениться после получения нового ключа, поэтому обязательно обновите его соответствующим образом.

- После настройки подключения к API Infura следующим шагом будет внедрение Web3j в ваше приложение для Android.

Web3j

Web3j — это библиотека для Java и Android, предоставляющая простой и удобный интерфейс для работы с сетью Ethereum и смарт-контрактами. Это легкая, модульная и реактивная библиотека, которая позволяет разработчикам взаимодействовать с клиентами Ethereum.

Чтобы начать работу с Web3j, вам нужно добавить библиотеку Web3j в зависимости вашего проекта. После добавления библиотеки вы можете использовать API Web3j для подключения к сети Ethereum, загрузки смарт-контрактов и выполнения транзакций.

Добавьте зависимости.

Чтобы загрузить стороннюю библиотеку web3j, вам нужно добавить ее зависимость в файл build.gradle в модуле приложения, а затем синхронизировать файл.

dependencies {
 
    implementation 'androidx.core:core-ktx:1.10.0'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
    implementation 'androidx.activity:activity-compose:1.7.1'
    implementation "androidx.compose.ui:ui:$compose_ui_version"
    implementation "androidx.compose.ui:ui-graphics:$compose_ui_version"
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"
    implementation 'com.google.android.material:material:1.8.0'
 
    implementation 'androidx.compose.material:material:1.4.2'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version"
    debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version"
    debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version"
 
    //Web3J
    implementation 'org.web3j:core:4.1.0-android'
 
}

Давайте начнем наше путешествие: создание приложений кошелька Ethereum с помощью Web3J

Теперь, когда мы успешно сгенерировали ключ API Infura и интегрировали Web3J в наш проект, мы готовы начать наше увлекательное путешествие. Важно отметить, что в этой статье основное внимание будет уделено аспектам реализации серверной части и исключены компоненты, связанные с пользовательским интерфейсом. Но не волнуйтесь! В конце статьи вы найдете репозиторий GitHub, содержащий подробные примеры кода. Этот пример не только демонстрирует, как подключиться к сети Ethereum, создать кошелек и восстановить баланс с помощью Web3J, но также включает элементы пользовательского интерфейса, обеспечивающие более полное понимание процесса реализации. начнем с добавления необходимых разрешений.

Добавьте разрешения приложения.

Для выполнения транзакций и получения баланса требуется подключение к Интернету. Поэтому необходимо включить разрешение на доступ к Интернету в файл AndroidManifest.xml, чтобы приложение могло беспрепятственно подключаться к Интернету.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
 
    //Internet Permission
    <uses-permission android:name="android.permission.INTERNET" />
 
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.EthereumWallet"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:theme="@style/Theme.EthereumWallet">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>

Интеграция Ethereum в наш проект, выполнив следующие шаги:

Шаг 1: Начните с интеграции криптопакета Bouncy Castle, который включает в себя важные криптографические алгоритмы для повышения безопасности блокчейна.

Шаг 2: Затем установите соединение с узлом Ethereum, чтобы обеспечить беспрепятственную связь с сетью Ethereum.

Шаг 3: Реализуйте создание кошелька Ethereum.

Шаг 4: Включите функцию отправки средств путем создания. Укажите адрес получателя, сумму и параметры газа, чтобы обеспечить безопасные переводы.

Шаг 5: Наконец, получите информацию о балансе кошелька Ethereum в режиме реального времени, что позволит нам динамически отслеживать средства на счете.

Следуя этим шагам, мы успешно интегрируем Ethereum в наш проект и используем его возможности для функциональности на базе блокчейна.

Примечание:

Если вы решили делать запросы в основном потоке, важно использовать класс StrictMode. Это позволяет вам получать доступ к сети непосредственно в основном потоке, обеспечивая правильную связь и избегая потенциальных проблем с сетевыми операциями.

private fun strictMode(){
        val policy = ThreadPolicy.Builder().permitAll().build()
        StrictMode.setThreadPolicy(policy)
  }

Кроме того, прежде чем мы приступим к выполнению шагов, давайте добавим метод с именем showToast. Этот метод будет принимать строковый параметр, который будет сообщением, отображаемым во всплывающем уведомлении, когда нам нужно показать результаты пользователю.

private fun showToast(message:String){
        Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}

1. Надувной замок.

Криптопакет Bouncy Castle необходим для обеспечения надежной безопасности блокчейна, поскольку он реализует необходимые криптографические алгоритмы. В частности, для интеграции с Web3J нам требуется алгоритм ECDSA, отвечающий за безопасность цифровых подписей. Этот алгоритм реализуется провайдером безопасности в классе Security, который централизует свойства безопасности и управляет различными криптографическими провайдерами, такими как DSA, RSA, MD5 и SHA-1.

//set up the security provider
  private fun setupBouncyCastle() {
      val provider = Security.getProvider(BouncyCastleProvider.PROVIDER_NAME)
          ?: // Web3j will set up a provider when it's used for the first time.
          return
      if (provider.contains(BouncyCastleProvider::class.java)) {
          return
      }
      //There is a possibility  the bouncy castle registered by android may not have all ciphers
      //so we  substitute with the one bundled in the app.
      Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)
      Security.insertProviderAt(BouncyCastleProvider(), 1)
  }

2.Подключение к узлу Ethereum.

Чтобы установить соединение с сетью Ethereum, вызовите метод build(), предоставленный Web3j. Для этого метода требуется параметр HttpService, который указывает URL-адрес сети Ethereum, к которой вы хотите подключиться.

  • URL-адрес: скопируйте URL-адрес конечной точки из Infura. Этот URL-адрес будет служить конечной точкой для подключения к сети Ethereum через инфраструктуру Infura.

После вызова Web3j попытается подключиться к указанной сети Ethereum, используя предоставленный URL-адрес. Если версия клиента, полученная из сети, не содержит ошибок, соединение будет успешным, предоставляя пользователю доступ к сети Ethereum. Однако, если есть какие-либо ошибки или проблемы с версией клиента, подключение может быть ограничено или отклонено. Чтобы гарантировать будущий доступ и использование, сохраните объект Web3j в переменной для будущего использования. Этот объект понадобится для выполнения транзакций.

//connect to Ethereum node
  private fun connectToEthNetwork() {
       web3 =
          Web3j.build(HttpService("https://mainnet.infura.io/v3/API Key"))
      try {
          //if the client version has an error the user will not gain access if successful the user will get connected.
          val clientVersion = web3.web3ClientVersion().sendAsync().get()
          if (!clientVersion.hasError()) {
              showToast("Connected")
          } else {
              showToast(clientVersion.error.message)
          }
      } catch (e: Exception) {
          showToast(e.message.toString())
      }
  }

3. Создание кошелька Ethereum.

Работа с кошельками Ethereum предполагает предоставление пароля и пути к файлу. Класс WalletUtils предоставляет служебные функции для работы с файлами Wallet. Мы будем использовать его методы, которые:

  • Метод generateLightNewWalletFile() создает кошелек Ethereum и соответствующий файл JSON, предоставляя желаемый пароль и путь к файлу.
  • Метод loadCredentials() принимает пароль и путь к файлу кошелька. Это позволяет нам получить учетные данные, связанные с указанным путем и паролем кошелька.
  • getAddress() объекта учетных данных, мы можем получить адрес кошелька, связанный с кошельком Ethereum.

Эти методы в классе WalletUtils позволяют нам эффективно управлять кошельками Ethereum, предоставляя доступ к учетным данным, создавая новые кошельки и получая адреса кошельков.

Начнем с создания файла для хранения данных кошелька Ethereum.

Для хранения данных кошелька мы создадим файл. Перед созданием файла важно проверить, существует ли каталог. Если каталог не существует, мы можем создать его с помощью метода mkdirs(). Это гарантирует наличие необходимой структуры каталогов для безопасного хранения файла кошелька.

private fun createWalletFile(name: String){
 
     val file = File(this.filesDir.toString() + name) // the Ethereum wallet location
 
      //create the directory if it does not exist
     if (!file.exists()) {
          file.mkdirs()
          showToast("Directory Created")
      } else {
         showToast("Directory already created")
      }
  }

После создания файла для хранения данных кошелька Ethereum мы можем приступить к созданию кошелька Ethereum с помощью метода generateLightNewWalletFile(). Для этого нам нужно предоставить созданный файл и пароль в качестве параметров метода. После создания кошелька мы можем получить связанные учетные данные с помощью метода loadCredentials() и сохранить их в переменной. Эти учетные данные понадобятся на следующем этапе — отправке средств.

private fun createWallet(file: File, password: String) {
   try {
        // generating the ethereum wallet
        val walletName = WalletUtils.generateLightNewWalletFile(password, file)
        credentials = WalletUtils.loadCredentials(password, "$file/$walletName")
        showToast("Wallet Created")
    } catch (e: Exception) {
        showToast("failed: ${e.message}")
    }
}

4.Отправка средств.

Чтобы инициировать перевод средств, мы используем метод sendFunds(), который требует несколько параметров. Эти параметры включают в себя объект web3j, представляющий наше подключение к сети Ethereum, учетные данные кошелька отправителя, адрес назначения, на который будут переведены средства, сумму средств, которые необходимо отправить, и единицу измерения, в которой указано значение. Указав эти параметры, мы можем выполнить транзакцию и перевести указанную сумму средств предполагаемому получателю.

private fun makeTransaction(address:String, amount:Double) {
       // get the amount of eth value the user wants to send
       try {
           val receipt = Transfer.sendFunds(
               web3,
               credentials,
               address,
               BigDecimal.valueOf(amount),
               Convert.Unit.ETHER
           ).send()
           showToast("Transaction successful: ${receipt.transactionHash}")
       } catch (e: Exception) {
           showToast("low balance")
       }
}

В процессе совершения транзакции в блокчейне Ethereum важно учитывать, что будет взиматься стоимость газа. Газ представляет собой комиссию, необходимую для успешного выполнения транзакции в сети Ethereum. Эта плата необходима для компенсации участникам сети их вычислительных усилий и определения приоритетов транзакций в блокчейне.

5.Получение баланса кошелька.

Для получения баланса кошелька нужно использовать метод ethGetBalance и передать адрес кошелька вместе с параметром DefaultBlockParameterName.LATEST. Этот метод доступен в классе EthGetBalance, и вы можете получить баланс, вызвав его метод getBalance().

//get wallet's balance
  private fun retrieveBalance(walletAddress: String) {
       try {
          val balanceWei = web3.ethGetBalance(
              walletAddress,
              DefaultBlockParameterName.LATEST
          ).sendAsync().get()
          showToast("your balance is:${balanceWei.balance}")
      } catch (e: Exception) {
          showToast("Balance Failed")
      }
  }

Мы успешно интегрировали блокчейн Ethereum в наше приложение для Android с помощью библиотеки Web3j. Если вы хотите изучить полную реализацию, мы приглашаем вас посетить репозиторий GitHub.



В заключение

В этой статье мы рассмотрели процесс интеграции блокчейна Ethereum в приложение для Android. Мы узнали, как установить соединение с блокчейном, создать кошельки, получить адреса кошельков, контролировать баланс счета и безопасно отправлять и получать средства.