Возврат нескольких значений в функции контракта, близкого к протоколу

Я пытаюсь вернуть две переменные в смарт-контракте ближнего протокола

   pub fn get_product(&self, product_id: u128) -> (String, bool) {
        let product = self.product_map.get(&product_id).unwrap();
        (product.product_details_hash, product.product_expired)
    }

Код Javascript:

let hash = await nearcontract.contract.get_product({ product_id: 1 })

Это дает ошибку

Cannot deserialize value with Borsh

Кроме того, можно ли вернуть структуру напрямую? например

 pub fn get_product(&self, product_id: u128) -> Product {
        let product = self.product_map.get(&product_id).unwrap();
        product
    }

Это тоже дает ошибку:

the trait `avrit::create_profile::_IMPL_SERIALIZE_FOR_Input::_serde::Serialize` is not implemented for `avrit::avritstructs::Product 

1 ответ

Ваш первый путь должен работать нормально. ВCannot deserialize value with Borsh может исходить из product_map повреждены из-за конфликтов префиксов или состояние контракта было повторно использовано из-за повторного развертывания.

Второй путь требует serde::Serialize будет реализовано на Product. Вы можете сделать это с помощью derive при определенииProduct структура.

#[derive(serde::Serialize, serde::Deserialize)]
pub struct Product {
...
Другие вопросы по тегам