在5分钟内构建一个cNFT铸造移动应用程序

  • Helius
  • 发布于 2024-03-21 20:14
  • 阅读 10

本文介绍了如何使用Helius Mint API构建一个NFT铸造的Android应用程序,用户可以轻松捕捉图像并在Solana上铸造压缩NFT。文章详细讲解了应用的搭建、Mint逻辑的实现以及如何与之前的功能交互,适合具备基本Android和Solana知识的开发者阅读。

5分钟阅读

2024年3月19日

期待的内容

本教程介绍如何构建一个NFT(非同质化代币)铸造Android应用程序。目的是让用户轻松捕捉图像并在Solana上铸造压缩的NFT。为实现此目的,我们将使用Helius Mint API。这个API加速了压缩NFT的铸造,并减少了模板代码,为你节省了大量时间和计划。我们的Android应用程序将采用KotlinJetpack Compose进行开发。

什么是压缩的NFT?

压缩NFT(cNFTs)使用状态压缩和并发Merkle树来降低存储成本。压缩的NFT比其未压缩的对应物便宜2400到24000倍,同时仍然保留相同的结构。

前提条件

在深入本教程之前,你应该对使用Kotlin进行Android开发有基本的了解,并且对Solana有一定的熟悉度。

工具

  • Android Studio:Giraffe | 版本 2022.3.1
  • 模拟器或移动设备:将用于测试应用程序。确保安装了MWA兼容的钱包应用程序(推荐Solflare)。

API密钥

要使用Helius Mint API,你需要一个API密钥。以下是获取API密钥的步骤:

  1. 访问Helius开发者门户
  2. 使用你的Solana钱包、Google或GitHub帐户创建一个帐户。
  3. 登录后,按照提示生成API密钥。
  4. 确保安全存储此密钥,因为在整个教程中将使用此密钥进行API调用。

构建应用

步骤1:项目设置

我们为该项目准备了一个起始代码包。

要开始,请按照以下步骤操作:

  1. 访问GitHub上的起始包
  2. 将仓库分叉并克隆到本地环境。

在将代码下载到本地后,请继续以下操作:

  1. Android Studio中打开项目。
  2. 允许Gradle完成构建过程。
  3. 运行代码。

浏览起始应用以熟悉其功能。注意集成到应用中的钱包连接按钮。这使你可以连接任何移动钱包适配器(MWA)兼容的钱包应用。移动钱包适配器(MWA)是连接移动dApp与移动钱包应用的协议规范,支持Solana交易和消息签署的通信。移动钱包适配器支持这些钱包。此外,你还会发现“拍照”按钮,目前允许你捕捉图片。

要在代码库中安全存储Helius API密钥,请导航至local.properties文件并添加API密钥。此文件专门用于包含敏感信息,并被Git忽略,确保你的API密钥的机密性。

api_key=<你的-api-key>

接下来,我们将深入编码逻辑,以将捕获的图像作为压缩NFT(cNFT)进行铸造。

步骤2:铸造逻辑

我们的目标是将“拍照”按钮与相机功能集成。集成这个按钮将允许用户捕捉图像并将其铸造为NFT。我们提供了一个启动代码来打开相机并捕捉图像。现在,我们的重点是创建一个函数来管理铸造过程。

Helius的Mint API

此方法铸造一个压缩的NFT。执行时,它将暂停,直到交易被确认,这在网络活动高峰期可能需要长达60秒的时间。请访问文档了解更多。

首先,导航至java/com/example/hmint/MainViewModel.kt,并在MainViewModel类中创建mintCNft函数:

代码

@HiltViewModel
class MainViewModel @Inject constructor(
    private val walletAdapter: MobileWalletAdapter,
    private val walletConnectionUseCase: WalletConnectionUseCase,
) : ViewModel() {

    // ...

    fun mintCNft(imageUri: Uri, nftName: String, user: String) =
        viewModelScope.launch {
            _state.update {
                _state.value.copy(
                    isLoading = true,
                )
            }
        }

}

我们将启动一个协程来处理此函数中的铸造逻辑。最初,我们将检索API密钥,定义所需的变量和requestBody。稍后,你可以根据需要自定义requestBody,以包含其他属性和数据:

代码

withContext(viewModelScope.coroutineContext + Dispatchers.IO) {
    val apiKey = System.getProperty("api_key") ?: ""
    val url = URL("https://mainnet.helius-rpc.com/?api-key=$apiKey")
    val mediaType = "application/json".toMediaTypeOrNull()
    val requestBody = """
        {
            "jsonrpc": "2.0",
            "id": "helius-test",
            "method": "mintCompressedNft",
            "params": {
                "name": "$nftName",
                "symbol": "HM",
                "owner": "$user",
                "description": "这是一个通过hMint应用铸造的测试cNFT",
                "attributes": [\
                    {\
                        "trait_type": "hMint",\
                        "value": "1"\
                    }\
                ],
                "imageUrl": "$imageUri",
                "sellerFeeBasisPoints": 6900
            }
        }
        ""${'"'}.trimIndent()

}

然后,我们将构建请求并初始化一个OkHttpClient

代码

val body = requestBody.toRequestBody(mediaType)
val request = Request.Builder()
    .url(url)
    .post(body)
    .addHeader("accept", "application/json")
    .addHeader("content-type", "application/json")
    .build()
val client = OkHttpClient()

在调用客户端之前,让我们在数据类中定义响应。创建一个名为data的新包,并在其中新建一个文件NFTResponse.kt来定义从API调用中接收到的响应的结构。

代码

package com.example.hmint.data

data class NftMintResponse(
    val jsonrpc: String,
    val id: String,
    val result: MintResult
)

data class MintResult(
    val signature: String,
    val minted: Boolean,
    val assetId: String
)

然后,在MainViewModel类中,增加WalletViewState数据类的一个附加值mintResponse。我们将在接收到响应时更新此值:

代码

data class WalletViewState(
    // ...
    val mintResponse: String = ""
)

回到mintCNft函数中,利用客户端,我们将执行请求,并相应地处理任何失败或响应。在收到响应后,我们将使用Gson将数据解析为之前创建的NFTMintResponse数据类,并相应更新mintResponse的值:

代码

client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        // 处理失败
        e.printStackTrace()
        Log.d(TAG, "NFT铸造失败")
        _state.update {
            _state.value.copy(
                isLoading = false,
                mintResponse = "铸造失败"
            )
        }
    }

    override fun onResponse(call: Call, response: Response) {
        if (response.isSuccessful) {
            val responseBody = response.body?.string() ?: ""
            val gson = Gson()
            val nft = gson.fromJson(responseBody, NftMintResponse::class.java)
            Log.d(TAG, "NFT铸造成功: $nft")
            _state.update {
                _state.value.copy(
                    isLoading = false,
                    mintResponse = "铸造成功"
                )
            }

        } else {
            // 处理非成功响应
            Log.d(TAG, "NFT铸造失败: ${response.code}")
            _state.update {
                _state.value.copy(
                    isLoading = false,
                    mintResponse = "铸造失败"
                )
            }
        }
    }
})

在我们的UI中,我们希望向用户提供有关铸造功能结果的反馈。因此,请导航至java/com/example/hmint/composables/MintButton.kt,其中包含了具有图像捕捉的UI代码和逻辑的可组合函数。在MintButton中,在哪里声明cameraLauncher时,我们将调用我们的mintCNft函数。此外,包含代码以在更新mintResponse时显示Toast。

代码

@Composable
fun MintButton(
    mainViewModel: MainViewModel = hiltViewModel()
) {

    val cameraLauncher =
        rememberLauncherForActivityResult(ActivityResultContracts.TakePicture()) {
            // ...
            mainViewModel.mintCNft(uri, "hMint", viewState.userAddress)
        }

    viewState.mintResponse.let { message ->
        if(message.isNotEmpty()){
            Toast.makeText(LocalContext.current, message, Toast.LENGTH_SHORT).show()
        }
    }

    // ...
}

步骤3:运行应用

我们已经完成了编码阶段,因此让我们运行应用程序。首先连接你的钱包,然后捕捉图像,看看应用程序是如何无缝铸造NFT的。

HMint应用程序:铸造一个压缩NFT

结论

干得好!你已经成功开发了一个Android应用程序,能够让用户铸造压缩的NFT。多亏了Helius Mint API,铸造cNFT变得从未如此简单,仅需一次调用即可。

接下来的步骤?

还有很多东西可以探索和增强这个应用。一个这样的增强就是集成DAS API。数字资产标准(DAS)API是一个开源规范和系统,提供与数字资产,包括代币和NFT的统一接口。它支持各种资产类型,包括同质化代币、标准NFT和压缩NFT。使用该API,你可以获取所有铸造的压缩NFT,并在你的应用程序中展示它们,为用户提供他们数字资产的全面概览。

相关资源

要加深你在Jetpack Compose的Android开发、Solana区块链集成和API交互方面的专业知识,可以深入研究以下资源:

如果你需要任何帮助或支持,请随时通过Discord联系我们。完整的代码库可以在GitHub上找到,以便进一步参考。

  • 原文链接: helius.dev/blog/build-a-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/