Skip to content

Commit

Permalink
shard count in get work
Browse files Browse the repository at this point in the history
  • Loading branch information
guoxbin committed Jun 28, 2020
1 parent d7d3707 commit acf837f
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 19 deletions.
46 changes: 31 additions & 15 deletions switch/mining2/src/work_manager.rs
Expand Up @@ -49,22 +49,24 @@ use crate::error;
use log::{info, debug};
use futures::future;
use jsonrpc_core::BoxFuture;
use yee_runtime::BlockNumber;

const EXTRA_DATA: &str = "yee-switch";
const RAW_WORK_LIFE: Duration = Duration::from_secs(60);
const REFRESH_JOB_DELAY: Duration = Duration::from_secs(2);

pub trait WorkManager {
type Hashing: HashT;
type Number: Debug + Clone;

// notice that work may not refresh
fn get_work(&self) -> error::Result<Work<<Self::Hashing as HashT>::Output>>;
fn get_work(&self) -> error::Result<Work<<Self::Hashing as HashT>::Output, Self::Number>>;

fn get_work_by_merkle(&self, root: <Self::Hashing as HashT>::Output) -> error::Result<Work<<Self::Hashing as HashT>::Output>>;
fn get_work_by_merkle(&self, root: <Self::Hashing as HashT>::Output) -> error::Result<Work<<Self::Hashing as HashT>::Output, Self::Number>>;

fn submit_work(&self, work: Work<<Self::Hashing as HashT>::Output>) -> error::Result<()>;
fn submit_work(&self, work: Work<<Self::Hashing as HashT>::Output, Self::Number>) -> error::Result<()>;

fn submit_work_future(&self, work: Work<<Self::Hashing as HashT>::Output>) -> Box<dyn Future<Item=(), Error=error::Error> + Send>;
fn submit_work_future(&self, work: Work<<Self::Hashing as HashT>::Output, Self::Number>) -> Box<dyn Future<Item=(), Error=error::Error> + Send>;
}

impl<Number, AuthorityId, Hashing> WorkManager for DefaultWorkManager<Number, AuthorityId, Hashing> where
Expand All @@ -74,8 +76,9 @@ impl<Number, AuthorityId, Hashing> WorkManager for DefaultWorkManager<Number, Au
Hashing::Output: Ord + Encode + Decode,
{
type Hashing = Hashing;
type Number = Number;

fn get_work(&self) -> error::Result<Work<<Self::Hashing as HashT>::Output>> {
fn get_work(&self) -> error::Result<Work<<Self::Hashing as HashT>::Output, Self::Number>> {
let jobs = &*self.jobs.read();

debug!("jobs: {:?}", jobs);
Expand Down Expand Up @@ -145,35 +148,38 @@ impl<Number, AuthorityId, Hashing> WorkManager for DefaultWorkManager<Number, Au
Ok(raw_work.work.expect("qed"))
}

fn get_work_by_merkle(&self, root: <Self::Hashing as HashT>::Output) -> error::Result<Work<<Self::Hashing as HashT>::Output>> {
fn get_work_by_merkle(&self, root: <Self::Hashing as HashT>::Output) -> error::Result<Work<<Self::Hashing as HashT>::Output, Self::Number>> {
let raw_work = Self::get_cache(self.work_cache.clone(), &root).ok_or(error::Error::from(error::ErrorKind::WorkExpired))?;
match raw_work.work {
Some(work) => Ok(work),
None => Err(error::ErrorKind::WorkExpired.into())
}
}

fn submit_work(&self, work: Work<<Self::Hashing as HashT>::Output>) -> error::Result<()> {
fn submit_work(&self, work: Work<<Self::Hashing as HashT>::Output, Self::Number>) -> error::Result<()> {
self.accept_work(work)
}

fn submit_work_future(&self, work: Work<<Self::Hashing as HashT>::Output>) -> Box<dyn Future<Item=(), Error=error::Error> + Send> {
fn submit_work_future(&self, work: Work<<Self::Hashing as HashT>::Output, Self::Number>) -> Box<dyn Future<Item=(), Error=error::Error> + Send> {
self.accept_work_future(work)
}
}

#[derive(Serialize, Deserialize)]
#[derive(Debug, Clone)]
pub struct Work<Hash> {
pub struct Work<Hash, Number> {
pub merkle_root: Hash,
pub extra_data: Vec<u8>,
pub target: PowTarget,
pub shard_count: u16,
pub shard_block_number: HashMap<u16, Number>,
pub nonce: Option<u64>,
pub nonce_target: Option<PowTarget>,
}

#[derive(Debug, Clone)]
pub struct RawWork<Number: SerdeHex, AuthorityId, Hashing> where
pub struct RawWork<Number, AuthorityId, Hashing> where
Number: SerdeHex,
Hashing: HashT,
Hashing::Output: Ord + Encode + Decode,
{
Expand All @@ -188,11 +194,12 @@ pub struct RawWork<Number: SerdeHex, AuthorityId, Hashing> where
merkle_tree: Option<MerkleTree<MiningHash<Hashing>, MiningAlgorithm<Hashing>>>,

// pow work
work: Option<Work<Hashing::Output>>,
work: Option<Work<Hashing::Output, Number>>,

}

impl<Number: SerdeHex, AuthorityId, Hashing> RawWork<Number, AuthorityId, Hashing> where
impl<Number, AuthorityId, Hashing> RawWork<Number, AuthorityId, Hashing> where
Number: SerdeHex + Clone,
Hashing: HashT,
Hashing::Output: Ord + Encode + Decode,
{
Expand All @@ -213,13 +220,21 @@ impl<Number: SerdeHex, AuthorityId, Hashing> RawWork<Number, AuthorityId, Hashin

let max_target = item_and_target_list.iter().map(|(_, target)| target).max().expect("qed").clone();

let shard_count = self.shard_count;

let shard_block_number = self.shard_jobs.iter().map(|(k,(_, v))| {
(*k, v.header.number.clone())
}).collect::<HashMap<_, _>>();

let merkle_tree: MerkleTree<MiningHash<Hashing>, MiningAlgorithm<Hashing>> =
MerkleTree::from_iter(item_list);

let work = Work {
merkle_root: merkle_tree.root(),
extra_data: EXTRA_DATA.as_bytes().to_vec(),
target: max_target,
shard_count,
shard_block_number,
nonce: None,
nonce_target: None,
};
Expand All @@ -229,7 +244,8 @@ impl<Number: SerdeHex, AuthorityId, Hashing> RawWork<Number, AuthorityId, Hashin
}
}

pub struct DefaultWorkManager<Number: SerdeHex, AuthorityId, Hashing> where
pub struct DefaultWorkManager<Number, AuthorityId, Hashing> where
Number: SerdeHex + Clone,
Hashing: HashT,
Hashing::Output: Ord + Encode + Decode,
{
Expand Down Expand Up @@ -292,7 +308,7 @@ impl<Number, AuthorityId, Hashing> DefaultWorkManager<Number, AuthorityId, Hashi
Ok(())
}

fn accept_work(&self, work: Work<Hashing::Output>) -> error::Result<()> {
fn accept_work(&self, work: Work<Hashing::Output, Number>) -> error::Result<()> {
let nonce = work.nonce.expect("qed");
let nonce_target = work.nonce_target.expect("qed");
let target = work.target.clone();
Expand Down Expand Up @@ -381,7 +397,7 @@ impl<Number, AuthorityId, Hashing> DefaultWorkManager<Number, AuthorityId, Hashi
Ok(())
}

fn accept_work_future(&self, work: Work<Hashing::Output>) -> Box<dyn Future<Item=(), Error=error::Error> + Send> {
fn accept_work_future(&self, work: Work<Hashing::Output, Number>) -> Box<dyn Future<Item=(), Error=error::Error> + Send> {
let nonce = work.nonce.expect("qed");
let nonce_target = work.nonce_target.expect("qed");

Expand Down
2 changes: 1 addition & 1 deletion switch/mining2/src/worker.rs
Expand Up @@ -56,7 +56,7 @@ impl<WM> Worker<WM> where

let _thread = thread::Builder::new().name("miner".to_string()).spawn(move || {

let mut old_work : Option<Work<<WM::Hashing as HashT>::Output>> = None;
let mut old_work : Option<Work<<WM::Hashing as HashT>::Output, WM::Number>> = None;
let mut old_nonce_start = 0u64;

loop {
Expand Down
17 changes: 14 additions & 3 deletions switch/rpc/src/pow/mod.rs
Expand Up @@ -8,7 +8,7 @@ use serde::de::DeserializeOwned;
use parity_codec::{KeyedVec, Codec, Decode, Encode, Input, Compact};
use sr_io::blake2_256;
use num_bigint::BigUint;
use yee_runtime::AccountId;
use yee_runtime::{AccountId, BlockNumber};
use yee_sharding_primitives::utils::shard_num_for_bytes;
use crate::errors;
use jsonrpc_core::{BoxFuture, Error, ErrorCode};
Expand All @@ -31,6 +31,7 @@ use tokio::runtime::{Runtime, TaskExecutor};
use std::time::{Instant, Duration};
use log::{info, debug};
use std::ptr::read_unaligned;
use parity_codec::alloc::collections::HashMap;

#[rpc]
pub trait PowApi<Hash> {
Expand All @@ -46,6 +47,8 @@ pub struct Job<Hash> {
pub merkle_root: Hash,
pub extra_data: Vec<u8>,
pub target: PowTarget,
pub shard_count: u16,
pub shard_block_number: HashMap<u16, BlockNumber>,
}

#[derive(Default, Debug)]
Expand Down Expand Up @@ -75,7 +78,7 @@ impl<WM: WorkManager> Pow<WM> where
}

impl<WM> PowApi<<WM::Hashing as HashT>::Output> for Pow<WM> where
WM: WorkManager + Send + Sync + 'static,
WM: WorkManager<Number=BlockNumber> + Send + Sync + 'static,
<WM::Hashing as HashT>::Output: Decode + Encode,
{
fn get_work(&self) -> errors::Result<Job<<WM::Hashing as HashT>::Output>> {
Expand All @@ -87,7 +90,15 @@ impl<WM> PowApi<<WM::Hashing as HashT>::Output> for Pow<WM> where
debug!("work exist {:?}", work);
}

Ok(Job { merkle_root: work.merkle_root, extra_data: work.extra_data, target: work.target })
let job = Job {
merkle_root: work.merkle_root,
extra_data: work.extra_data,
target: work.target,
shard_count: work.shard_count,
shard_block_number: work.shard_block_number,
};

Ok(job)
}

fn submit_work(&self, data: String) -> BoxFuture<()> {
Expand Down

0 comments on commit acf837f

Please sign in to comment.