【发布时间】:2022-12-04 04:28:58
【问题描述】:
我有一个如下所示的实现:
use crate::queue::{Task, WorkQueue};
use digest::consts::U32;
use digest::generic_array::typenum::Pow;
use sha2::digest::generic_array::GenericArray;
use sha2::{Digest, Sha256};
use std::fmt::Write;
use std::ops::Add;
use std::sync;
pub type Hash = GenericArray<u8, U32>;
#[derive(Debug, Clone)]
pub struct Block {
pub prev_hash: Hash,
pub generation: u64,
pub difficulty: u8,
pub data: String,
pub proof: Option<u64>,
}
impl Block {
pub fn mine_range(self: &Block, workers: usize, start: u64, end: u64, chunks: u64) -> u64 {
// TODO: with `workers` threads, check proof values in the given range, breaking up
// into `chunks` tasks in a work queue. Return the first valid proof found.
// HINTS:
// - Create and use a queue::WorkQueue.
// - Use sync::Arc to wrap a clone of self for sharing.
unimplemented!()
}
pub fn mine_for_proof(self: &Block, workers: usize) -> u64 {
let range_start: u64 = 0;
let range_end: u64 = 8 * (1 << self.difficulty); // 8 * 2^(bits that must be zero)
let chunks: u64 = 2345;
self.mine_range(workers, range_start, range_end, chunks)
}
pub fn mine(self: &mut Block, workers: usize) {
self.proof = Some(self.mine_for_proof(workers));
}
}
struct MiningTask {
block: sync::Arc<Block>,
// TODO: more fields as needed
workers: usize
}
impl Task for MiningTask {
type Output = u64;
fn run(&self) -> Option<u64> {
// TODO: what does it mean to .run?
self.block.mine(self.workers);
let result = self.block.proof;
return result;
}
}
现在,如果我像这样从运行中取出返回状态:
impl Task for MiningTask {
type Output = u64;
fn run(&self) -> Option<u64> {
// TODO: what does it mean to .run?
self.block.mine(self.workers);
let result = self.block.proof;
//return result;
}
}
没有借用错误但是像这样:
impl Task for MiningTask {
type Output = u64;
fn run(&self) -> Option<u64> {
// TODO: what does it mean to .run?
self.block.mine(self.workers);
let result = self.block.proof;
return result;
}
}
它给了我:
不能借用 Arc 中的数据作为可变数据
trait DerefMut需要通过dereference修改,Arc<Block>没有实现
我不明白为什么归还东西会导致借用,我该如何解决?最好没有 Mutex 库或没有借用?即使我尝试克隆自我它仍然执行借用,我很困惑。
【问题讨论】:
标签: rust