В последние годы технология блокчейна быстро развивается, и все больше компаний и разработчиков изучают способы интеграции блокчейна в свои приложения. Разработчики 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. Создайте учетную запись.
- Завести аккаунт.
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. Мы узнали, как установить соединение с блокчейном, создать кошельки, получить адреса кошельков, контролировать баланс счета и безопасно отправлять и получать средства.