【问题标题】:How to query all NFts for a given account?如何查询给定帐户的所有 NFts?
【发布时间】:2022-10-04 20:04:35
【问题描述】:

我同时使用 Accounts 和 Tokens SDK。使用流创建 NFT 后,我需要列出该帐户在后端的所有 NFT。

CreateNFTHouseTokenFlow.kt

@StartableByRPC
class CreateNFTHouseTokenFlow(
    private val noOfBedRooms: Short,
    private val address: String,
    private val price: Int,
    private val icon: String,
    private val name: String,
    private val holder: PublicKey
) : FlowLogic<Unit>() {
  @Suspendable
  @Throws(FlowException::class)
  override fun call() {
    val houseTokenState = HouseTokenState(/* ...arguments */)

    val transactionState = houseTokenState.withNotary(notary)
    subFlow(CreateEvolvableTokens(transactionState))

    val issuedHouseToken = houseTokenState
        .toPointer<HouseTokenState>()
        .issuedBy(ourIdentity)
        .heldBy(AnonymousParty(holder))

    subFlow(IssueTokensFlow(issuedHouseToken))
  }
}

现在,在后台:Controller.kt

@GetMapping("/tokens/{user}")
    fun getUserTokens(@PathVariable user: UUID): ResponseEntity<String> {
        return try {
            val criteria = QueryCriteria
                .VaultQueryCriteria()
                .withExternalIds(listOf(user))

            val userNFTs = proxy
                .vaultQueryByCriteria(criteria, NonFungibleToken::class.java)
                .states

            ResponseEntity
                .status(HttpStatus.ACCEPTED)
                .body("tokens: $userNFTs")
        } catch (e: Exception) {
            ResponseEntity
                .status(HttpStatus.BAD_REQUEST)
                .body("exception: ${e.message}")
        }
    }

上面的代码返回一个空数组。这个问题似乎与标准有关。出于某种原因,Corda 无法将 withExternalIds(listOf(user)) 方法与 NonFungibleToken::class.java 方法结合使用。如果我删除条件,Corda 可以获取所有 NonFungibleToken 令牌(甚至是其他用户拥有的令牌)。

【问题讨论】:

    标签: corda


    【解决方案1】:

    为了通过帐户查询状态,您的状态应该有 participants 列表属性,其中包含您要查询的帐户:

    状态:

    @BelongsToContract(HouseTokenStateContract::class)
    data class HouseTokenState(
        override val maintainers: List<Party>,
        override val fractionDigits: Int = 0,
        override val linearId: UniqueIdentifier = UniqueIdentifier(),
        override val participants: List<AbstractParty>,
        // ... other class properties
    ) : EvolvableTokenType()
    

    现在在实例化类状态时:

    val houseTokenState= HouseTokenState(
        // ... other properties
        participants = listOf(AnonymousParty(ownerAccountPublicKey), ourIdentity)
    )
    

    请注意,参与者默认使用 state 类的 maintainers 属性(即运行流程的 Party)。如果您覆盖 participants 属性,您应该传递您想要的帐户 + maintainers 成员。

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      相关资源
      最近更新 更多