调用合约方法返回 CompilationError(PrepareError(Instantiate)),是代码哪里不对吗?
报错截图:
合约内容:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
额,你是不是在同一个地址上上部署了多次合约,如果是的话可以试试使用
near dev-deploy
来部署,可以避免很多问题。晕,找到问题了。是这个 crate uuid::Uuid 的问题,加上这个就会报错。不过在 near 里有现成的 UUID 生成的方法吗,我又用了时间戳,结果又提示 “time not implemented on this platform”。又用了 rand crate,结果还是不支持。。晕了,最后无奈用了一个 id 字段,每次调用时手动 +1。但是这样肯定会有 data race 问题吧,不知道在区块链上,有没有这种问题