调用合约方法返回 CompilationError(PrepareError(Instantiate)),是代码哪里不对吗?

新手上路,请多包涵

报错截图:
image.png

合约内容:

use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
use near_sdk::collections::LookupMap;
use near_sdk::collections::Vector;
use near_sdk::serde::{Deserialize, Serialize};
use near_sdk::{near_bindgen, setup_alloc};
use uuid::Uuid;

setup_alloc!();

#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize)]
pub struct TreeHole {
    secrets: LookupMap<String, Secret>,
    queue: Vector<String>,
}

impl Default for TreeHole {
    fn default() -> Self {
        Self {
            secrets: LookupMap::new(b"s".to_vec()),
            queue: Vector::new(b"q".to_vec()),
        }
    }
}

#[derive(BorshDeserialize, BorshSerialize, Debug, Serialize, Deserialize)]
#[serde(crate = "near_sdk::serde")]
pub struct Secret {
    id: String,
    name: String,
    content: String,
}

const PAGE_SIZE: usize = 10;

#[near_bindgen]
impl TreeHole {
    pub fn add_secret(&mut self, name: String, content: String) {
        let my_uuid = Uuid::new_v4();
        let s = Secret {
            id: my_uuid.to_string(),
            name,
            content,
        };

        self.secrets.insert(&s.id, &s);
        self.queue.push(&s.id)
    }

    pub fn get_secrets(&self, page_num: usize) -> Vec<Secret> {
        assert!(page_num > 0, "invalid page_num: {}", page_num);
        let ids: Vec<String> = self
            .queue
            .iter()
            .skip((page_num - 1) * PAGE_SIZE)
            .take(PAGE_SIZE)
            .collect();

        let mut ss = vec![];
        for id in ids {
            let s = self.secrets.get(&id).unwrap();
            ss.push(s);
        }
        ss
    }
}
阅读 2.4k
2 个回答
新手上路,请多包涵

额,你是不是在同一个地址上上部署了多次合约,如果是的话可以试试使用near dev-deploy来部署,可以避免很多问题。

新手上路,请多包涵

晕,找到问题了。是这个 crate uuid::Uuid 的问题,加上这个就会报错。不过在 near 里有现成的 UUID 生成的方法吗,我又用了时间戳,结果又提示 “time not implemented on this platform”。又用了 rand crate,结果还是不支持。。晕了,最后无奈用了一个 id 字段,每次调用时手动 +1。但是这样肯定会有 data race 问题吧,不知道在区块链上,有没有这种问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进