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

发布于 2022-09-13 01:14:25 字数 1787 浏览 29 评论 0

报错截图:
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
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

同展鸳鸯锦 2022-09-20 01:14:25

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

初见终念 2022-09-20 01:14:25

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文