【问题标题】:How to read Elrond NFT attributes from smartcontract endpoint如何从智能合约端点读取 Elrond NFT 属性
【发布时间】:2021-11-28 11:30:50
【问题描述】:

我有一个关于智能合约的设计问题。 我想创建一个处理 SFT 和 NFT 的端点,并且必须访问那里的属性来计算结果。 基本上,用户发送两个 NFT,取决于那里的属性,它是否会收到一个新的 NFT。 在这两种情况下,我们都会返回用户的 NFT。

在这种情况下,是否可以只向端点发送令牌标识符而不是 NFT(通过支付)并直接从智能合约中检索 NFT 信息? 每次从智能合约中发回 NFT 似乎都是样板和消耗量

【问题讨论】:

  • 您绝对应该在交易中发送 NFT,因为如果 nft 当前所有者位于不同的分片上,则合约无法读取数据。

标签: elrond


【解决方案1】:

为了检索在属性字段中编码的数据,您必须将该数据解码回结构。

假设您定义了结构体YourStruct,如下所示:

#[derive(NestedEncode, NestedDecode, TopEncode, TopDecode, TypeAbi)]
pub struct YourStruct<M: ManagedTypeApi> {
    pub name: ManagedBuffer<M>,
    pub timestamp: u64,
    pub amount: BigUint<M>,
}

然后要检索它,在您的端点中,您可以执行以下操作:

let nft_info = self.blockchain().get_esdt_token_data(
    &self.blockchain().get_sc_address(),
    &token_identifier,
    token_nonce,
);

let attributes = nft_info.decode_attributes::<YourStruct<Self::Api>>()?;

对于您的第二个问题,我认为这取决于您的特定用例。但将这些 NFT 代币发送到您的合约将被认为是最佳实践。

【讨论】:

  • 感谢您对此的回复。帮助很大。但是当我去测试它时,我遇到了“用户错误”(“输入太短”)。 YourStruct 示例的有效属性是什么?我正在使用name:elrond;timestamp:0;amount:0x1
  • 感谢您的回复。它确实适用于 Elrond SDK 编解码器。如果你想使用“清晰”分号”/“冒号”格式,你必须自己解码。属性是一个 ManagedBuffer,可以转换为 BoxedByte,然后转换为 u8 数组(attributes.to_boxed_bytes()。 as_slice() )
猜你喜欢
  • 2022-11-29
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 2022-09-25
  • 2022-08-14
  • 2021-11-23
  • 1970-01-01
相关资源
最近更新 更多