mirror of
https://github.com/0glabs/0g-storage-node.git
synced 2024-11-10 10:05:17 +00:00
Merge branch 'main' into prune_no_reward
This commit is contained in:
commit
9e0beb6e05
48
.github/workflows/abi.yml
vendored
Normal file
48
.github/workflows/abi.yml
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
name: abi-consistent-check
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "main"]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-compare:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Clone current repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Get the Git revision from the current repository
|
||||||
|
id: get-rev
|
||||||
|
run: echo "rev=$(cat ./storage-contracts-abis/0g-storage-contracts-rev)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Clone another repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: '0glabs/0g-storage-contracts'
|
||||||
|
path: '0g-storage-contracts'
|
||||||
|
|
||||||
|
- name: Checkout specific revision
|
||||||
|
working-directory: ./0g-storage-contracts
|
||||||
|
run: |
|
||||||
|
git fetch --depth=1 origin ${{ steps.get-rev.outputs.rev }}
|
||||||
|
git checkout ${{ steps.get-rev.outputs.rev }}
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: '18.17'
|
||||||
|
cache: 'yarn'
|
||||||
|
cache-dependency-path: ./0g-storage-contracts
|
||||||
|
|
||||||
|
- name: Run yarn in the cloned repository
|
||||||
|
working-directory: ./0g-storage-contracts
|
||||||
|
run: |
|
||||||
|
yarn
|
||||||
|
yarn build
|
||||||
|
|
||||||
|
- name: Compare files
|
||||||
|
run: |
|
||||||
|
./scripts/check_abis.sh ./0g-storage-contracts/artifacts/
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
|||||||
[submodule "0g-storage-contracts"]
|
|
||||||
path = 0g-storage-contracts
|
|
||||||
url = https://github.com/0glabs/0g-storage-contracts.git
|
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 8f8f906224f966651de0b745738fb8aab4f492c4
|
|
@ -3,16 +3,10 @@ use ethers::prelude::abigen;
|
|||||||
// run `cargo doc -p contract-interface --open` to read struct definition
|
// run `cargo doc -p contract-interface --open` to read struct definition
|
||||||
|
|
||||||
#[cfg(not(feature = "dev"))]
|
#[cfg(not(feature = "dev"))]
|
||||||
abigen!(
|
abigen!(ZgsFlow, "../../storage-contracts-abis/Flow.json");
|
||||||
ZgsFlow,
|
|
||||||
"../../0g-storage-contracts/artifacts/contracts/dataFlow/Flow.sol/Flow.json"
|
|
||||||
);
|
|
||||||
|
|
||||||
#[cfg(not(feature = "dev"))]
|
#[cfg(not(feature = "dev"))]
|
||||||
abigen!(
|
abigen!(PoraMine, "../../storage-contracts-abis/PoraMine.json");
|
||||||
PoraMine,
|
|
||||||
"../../0g-storage-contracts/artifacts/contracts/miner/Mine.sol/PoraMine.json"
|
|
||||||
);
|
|
||||||
|
|
||||||
#[cfg(not(feature = "dev"))]
|
#[cfg(not(feature = "dev"))]
|
||||||
abigen!(
|
abigen!(
|
||||||
|
@ -9,6 +9,7 @@ mod loader;
|
|||||||
mod metrics;
|
mod metrics;
|
||||||
mod mine;
|
mod mine;
|
||||||
mod miner_id;
|
mod miner_id;
|
||||||
|
mod monitor;
|
||||||
pub mod pora;
|
pub mod pora;
|
||||||
mod recall_range;
|
mod recall_range;
|
||||||
mod sealer;
|
mod sealer;
|
||||||
|
@ -9,7 +9,6 @@ use tokio::time::{sleep, Duration, Instant};
|
|||||||
use storage::config::ShardConfig;
|
use storage::config::ShardConfig;
|
||||||
use zgs_spec::{SECTORS_PER_LOAD, SECTORS_PER_MAX_MINING_RANGE, SECTORS_PER_PRICING};
|
use zgs_spec::{SECTORS_PER_LOAD, SECTORS_PER_MAX_MINING_RANGE, SECTORS_PER_PRICING};
|
||||||
|
|
||||||
use super::metrics;
|
|
||||||
use crate::recall_range::RecallRange;
|
use crate::recall_range::RecallRange;
|
||||||
use crate::{
|
use crate::{
|
||||||
pora::{AnswerWithoutProof, Miner},
|
pora::{AnswerWithoutProof, Miner},
|
||||||
@ -20,7 +19,7 @@ use crate::{
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
pub struct PoraService {
|
pub struct PoraService {
|
||||||
mine_context_receiver: mpsc::UnboundedReceiver<MineContextMessage>,
|
mine_context_receiver: broadcast::Receiver<MineContextMessage>,
|
||||||
mine_answer_sender: mpsc::UnboundedSender<AnswerWithoutProof>,
|
mine_answer_sender: mpsc::UnboundedSender<AnswerWithoutProof>,
|
||||||
msg_recv: broadcast::Receiver<MinerMessage>,
|
msg_recv: broadcast::Receiver<MinerMessage>,
|
||||||
loader: Arc<dyn PoraLoader>,
|
loader: Arc<dyn PoraLoader>,
|
||||||
@ -33,9 +32,29 @@ pub struct PoraService {
|
|||||||
iter_batch: usize,
|
iter_batch: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PoraPuzzle {
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub(super) struct PoraPuzzle {
|
||||||
context: MineContext,
|
context: MineContext,
|
||||||
target_quality: U256,
|
target_quality: U256,
|
||||||
|
max_shards: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PoraPuzzle {
|
||||||
|
pub fn new(context: MineContext, target_quality: U256, max_shards: u64) -> Self {
|
||||||
|
Self {
|
||||||
|
context,
|
||||||
|
target_quality,
|
||||||
|
max_shards,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn max_shards(&self) -> u64 {
|
||||||
|
self.max_shards
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn context_digest(&self) -> H256 {
|
||||||
|
H256(self.context.digest)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[derive(Clone, Debug, Default)]
|
#[derive(Clone, Debug, Default)]
|
||||||
pub struct MineRangeConfig {
|
pub struct MineRangeConfig {
|
||||||
@ -89,7 +108,7 @@ impl PoraService {
|
|||||||
pub fn spawn(
|
pub fn spawn(
|
||||||
executor: TaskExecutor,
|
executor: TaskExecutor,
|
||||||
msg_recv: broadcast::Receiver<MinerMessage>,
|
msg_recv: broadcast::Receiver<MinerMessage>,
|
||||||
mine_context_receiver: mpsc::UnboundedReceiver<MineContextMessage>,
|
mine_context_receiver: broadcast::Receiver<MineContextMessage>,
|
||||||
loader: Arc<dyn PoraLoader>,
|
loader: Arc<dyn PoraLoader>,
|
||||||
config: &MinerConfig,
|
config: &MinerConfig,
|
||||||
miner_id: H256,
|
miner_id: H256,
|
||||||
@ -138,15 +157,19 @@ impl PoraService {
|
|||||||
Ok(MinerMessage::SetStartPosition(pos)) => {
|
Ok(MinerMessage::SetStartPosition(pos)) => {
|
||||||
info!("Change start position to: {:?}", pos);
|
info!("Change start position to: {:?}", pos);
|
||||||
self.mine_range.start_position = pos;
|
self.mine_range.start_position = pos;
|
||||||
|
self.report_reason_if_mine_stop("update mine range");
|
||||||
|
|
||||||
}
|
}
|
||||||
Ok(MinerMessage::SetEndPosition(pos)) => {
|
Ok(MinerMessage::SetEndPosition(pos)) => {
|
||||||
info!("Change end position to: {:?}", pos);
|
info!("Change end position to: {:?}", pos);
|
||||||
self.mine_range.end_position = pos;
|
self.mine_range.end_position = pos;
|
||||||
|
self.report_reason_if_mine_stop("update mine range");
|
||||||
}
|
}
|
||||||
Ok(MinerMessage::SetShardConfig(shard_config)) => {
|
Ok(MinerMessage::SetShardConfig(shard_config)) => {
|
||||||
self.mine_range.shard_config = shard_config;
|
self.mine_range.shard_config = shard_config;
|
||||||
|
self.report_reason_if_mine_stop("update shard");
|
||||||
}
|
}
|
||||||
Err(broadcast::error::RecvError::Closed)=>{
|
Err(broadcast::error::RecvError::Closed) => {
|
||||||
warn!("Unexpected: Mine service config channel closed.");
|
warn!("Unexpected: Mine service config channel closed.");
|
||||||
channel_opened = false;
|
channel_opened = false;
|
||||||
}
|
}
|
||||||
@ -157,21 +180,26 @@ impl PoraService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
maybe_msg = self.mine_context_receiver.recv() => {
|
maybe_msg = self.mine_context_receiver.recv() => {
|
||||||
if let Some(msg) = maybe_msg {
|
match maybe_msg {
|
||||||
info!("Update mine service: {:?}", msg);
|
Ok(msg) => {
|
||||||
info!("Mine iterations statistics: {}", metrics::report());
|
info!("Update mine service: {:?}", msg);
|
||||||
self.puzzle = msg.map(|(context, target_quality)| PoraPuzzle {
|
self.puzzle = msg;
|
||||||
context, target_quality
|
self.report_reason_if_mine_stop("update mine context");
|
||||||
});
|
},
|
||||||
} else {
|
Err(broadcast::error::RecvError::Closed) => {
|
||||||
warn!("Mine context channel closed.");
|
warn!("Mine context channel closed.");
|
||||||
|
},
|
||||||
|
Err(_) => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
() = &mut diastole, if !diastole.is_elapsed() => {
|
() = &mut diastole, if !diastole.is_elapsed() => {
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = async {}, if mining_enabled && cpu_percent > 0 && self.as_miner().map_or(false, |miner| miner.range.mining_length > 0) && diastole.is_elapsed() => {
|
_ = async {}, if mining_enabled
|
||||||
|
&& cpu_percent > 0
|
||||||
|
&& self.as_miner().is_ok()
|
||||||
|
&& diastole.is_elapsed() => {
|
||||||
let nonce = H256(rand::thread_rng().gen());
|
let nonce = H256(rand::thread_rng().gen());
|
||||||
let miner = self.as_miner().unwrap();
|
let miner = self.as_miner().unwrap();
|
||||||
|
|
||||||
@ -194,13 +222,27 @@ impl PoraService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn as_miner(&self) -> Option<Miner> {
|
fn as_miner(&self) -> Result<Miner, &'static str> {
|
||||||
let puzzle = self.puzzle.as_ref()?;
|
let puzzle = self.puzzle.as_ref().ok_or("no mine context")?;
|
||||||
|
|
||||||
let range = self.mine_range.to_valid_range(&puzzle.context)?;
|
let range = self
|
||||||
(range.mining_length > 0).then_some(())?;
|
.mine_range
|
||||||
|
.to_valid_range(&puzzle.context)
|
||||||
|
.ok_or("no mine range")?;
|
||||||
|
|
||||||
Some(Miner {
|
if range.mining_length == 0 {
|
||||||
|
return Err("mine range is zero");
|
||||||
|
}
|
||||||
|
|
||||||
|
if puzzle.max_shards() < self.mine_range.shard_config.num_shard as u64 {
|
||||||
|
return Err("too many mine shards");
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.mine_range.shard_config.num_shard as u64 > puzzle.context.flow_length.as_u64() {
|
||||||
|
return Err("Not enough flow length to shard");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Miner {
|
||||||
range,
|
range,
|
||||||
miner_id: &self.miner_id,
|
miner_id: &self.miner_id,
|
||||||
mine_range_config: &self.mine_range,
|
mine_range_config: &self.mine_range,
|
||||||
@ -209,4 +251,10 @@ impl PoraService {
|
|||||||
loader: &*self.loader,
|
loader: &*self.loader,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn report_reason_if_mine_stop(&self, event: &'static str) {
|
||||||
|
if let Err(reason) = self.as_miner() {
|
||||||
|
info!(reason, "Mine stopped on {}", event);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
27
node/miner/src/monitor.rs
Normal file
27
node/miner/src/monitor.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use task_executor::TaskExecutor;
|
||||||
|
use tokio::time::sleep;
|
||||||
|
|
||||||
|
use super::metrics;
|
||||||
|
|
||||||
|
pub struct Monitor {
|
||||||
|
period: Duration,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Monitor {
|
||||||
|
pub fn spawn(executor: TaskExecutor, period: Duration) {
|
||||||
|
let monitor = Monitor { period };
|
||||||
|
executor.spawn(
|
||||||
|
async move { Box::pin(monitor.start()).await },
|
||||||
|
"pora_master",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn start(&self) {
|
||||||
|
loop {
|
||||||
|
info!("Mine iterations statistics: {}", metrics::report());
|
||||||
|
let _ = sleep(self.period).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -102,15 +102,16 @@ impl<'a> Miner<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let quality = self.pora(idx, &sealed_data, pad_seed);
|
let quality = self.pora(idx, &sealed_data, pad_seed);
|
||||||
let quality_scale = self.range.shard_mask.count_zeros();
|
let difficulty_scale_x64 = self
|
||||||
if quality <= U256::MAX >> quality_scale
|
.range
|
||||||
&& quality << quality_scale <= *self.target_quality
|
.difficulty_scale_x64(self.context.flow_length.as_u64());
|
||||||
{
|
|
||||||
|
if quality <= (self.target_quality / difficulty_scale_x64) << 64 {
|
||||||
debug!(
|
debug!(
|
||||||
"Find a PoRA valid answer, quality: {}, target_quality {}, scale {}",
|
"Find a PoRA valid answer, quality: {}, target_quality {}, scale {:.3}",
|
||||||
U256::MAX / quality,
|
U256::MAX / quality,
|
||||||
U256::MAX / self.target_quality,
|
U256::MAX / self.target_quality,
|
||||||
quality_scale
|
difficulty_scale_x64.as_u128() as f64 / (u64::MAX as f64 + 1.0)
|
||||||
);
|
);
|
||||||
inc_counter(&HIT_COUNT);
|
inc_counter(&HIT_COUNT);
|
||||||
// Undo mix data when find a valid solition
|
// Undo mix data when find a valid solition
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use ethereum_types::U256;
|
use ethereum_types::U256;
|
||||||
use tiny_keccak::{Hasher, Keccak};
|
use tiny_keccak::{Hasher, Keccak};
|
||||||
use zgs_spec::SECTORS_PER_LOAD;
|
use zgs_spec::{SECTORS_PER_LOAD, SECTORS_PER_MAX_MINING_RANGE};
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||||
pub struct RecallRange {
|
pub struct RecallRange {
|
||||||
@ -38,6 +38,16 @@ impl RecallRange {
|
|||||||
|
|
||||||
Some(self.start_position + recall_offset * SECTORS_PER_LOAD as u64)
|
Some(self.start_position + recall_offset * SECTORS_PER_LOAD as u64)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn difficulty_scale_x64(&self, flow_length: u64) -> U256 {
|
||||||
|
let no_shard_mine_length = std::cmp::min(flow_length, SECTORS_PER_MAX_MINING_RANGE as u64);
|
||||||
|
let sharded_mine_length = std::cmp::min(
|
||||||
|
flow_length >> self.shard_mask.count_zeros(),
|
||||||
|
SECTORS_PER_MAX_MINING_RANGE as u64,
|
||||||
|
);
|
||||||
|
|
||||||
|
(U256::from(no_shard_mine_length) << 64) / sharded_mine_length
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<RecallRange> for contract_interface::RecallRange {
|
impl From<RecallRange> for contract_interface::RecallRange {
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
use crate::miner_id::check_and_request_miner_id;
|
use crate::miner_id::check_and_request_miner_id;
|
||||||
|
use crate::monitor::Monitor;
|
||||||
use crate::sealer::Sealer;
|
use crate::sealer::Sealer;
|
||||||
use crate::submitter::Submitter;
|
use crate::submitter::Submitter;
|
||||||
use crate::{config::MinerConfig, mine::PoraService, watcher::MineContextWatcher};
|
use crate::{config::MinerConfig, mine::PoraService, watcher::MineContextWatcher};
|
||||||
use network::NetworkMessage;
|
use network::NetworkMessage;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
use storage::config::ShardConfig;
|
use storage::config::ShardConfig;
|
||||||
use storage_async::Store;
|
use storage_async::Store;
|
||||||
use tokio::sync::broadcast;
|
use tokio::sync::broadcast;
|
||||||
@ -48,7 +50,7 @@ impl MineService {
|
|||||||
let mine_answer_receiver = PoraService::spawn(
|
let mine_answer_receiver = PoraService::spawn(
|
||||||
executor.clone(),
|
executor.clone(),
|
||||||
msg_recv.resubscribe(),
|
msg_recv.resubscribe(),
|
||||||
mine_context_receiver,
|
mine_context_receiver.resubscribe(),
|
||||||
store.clone(),
|
store.clone(),
|
||||||
&config,
|
&config,
|
||||||
miner_id,
|
miner_id,
|
||||||
@ -57,12 +59,15 @@ impl MineService {
|
|||||||
Submitter::spawn(
|
Submitter::spawn(
|
||||||
executor.clone(),
|
executor.clone(),
|
||||||
mine_answer_receiver,
|
mine_answer_receiver,
|
||||||
|
mine_context_receiver,
|
||||||
provider.clone(),
|
provider.clone(),
|
||||||
store.clone(),
|
store.clone(),
|
||||||
&config,
|
&config,
|
||||||
);
|
);
|
||||||
|
|
||||||
Sealer::spawn(executor, provider, store, &config, miner_id);
|
Sealer::spawn(executor.clone(), provider, store, &config, miner_id);
|
||||||
|
|
||||||
|
Monitor::spawn(executor, Duration::from_secs(5));
|
||||||
|
|
||||||
debug!("Starting miner service");
|
debug!("Starting miner service");
|
||||||
|
|
||||||
|
@ -6,19 +6,23 @@ use ethers::providers::PendingTransaction;
|
|||||||
use hex::ToHex;
|
use hex::ToHex;
|
||||||
use shared_types::FlowRangeProof;
|
use shared_types::FlowRangeProof;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
|
use storage::H256;
|
||||||
use storage_async::Store;
|
use storage_async::Store;
|
||||||
use task_executor::TaskExecutor;
|
use task_executor::TaskExecutor;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::{broadcast, mpsc};
|
||||||
|
|
||||||
use crate::config::{MineServiceMiddleware, MinerConfig};
|
use crate::config::{MineServiceMiddleware, MinerConfig};
|
||||||
use crate::pora::AnswerWithoutProof;
|
use crate::pora::AnswerWithoutProof;
|
||||||
|
use crate::watcher::MineContextMessage;
|
||||||
|
|
||||||
use zgs_spec::{BYTES_PER_SEAL, SECTORS_PER_SEAL};
|
use zgs_spec::{BYTES_PER_SEAL, SECTORS_PER_SEAL};
|
||||||
|
|
||||||
const SUBMISSION_RETIES: usize = 3;
|
const SUBMISSION_RETIES: usize = 15;
|
||||||
|
|
||||||
pub struct Submitter {
|
pub struct Submitter {
|
||||||
mine_answer_receiver: mpsc::UnboundedReceiver<AnswerWithoutProof>,
|
mine_answer_receiver: mpsc::UnboundedReceiver<AnswerWithoutProof>,
|
||||||
|
mine_context_receiver: broadcast::Receiver<MineContextMessage>,
|
||||||
mine_contract: PoraMine<MineServiceMiddleware>,
|
mine_contract: PoraMine<MineServiceMiddleware>,
|
||||||
flow_contract: ZgsFlow<MineServiceMiddleware>,
|
flow_contract: ZgsFlow<MineServiceMiddleware>,
|
||||||
default_gas_limit: Option<U256>,
|
default_gas_limit: Option<U256>,
|
||||||
@ -29,6 +33,7 @@ impl Submitter {
|
|||||||
pub fn spawn(
|
pub fn spawn(
|
||||||
executor: TaskExecutor,
|
executor: TaskExecutor,
|
||||||
mine_answer_receiver: mpsc::UnboundedReceiver<AnswerWithoutProof>,
|
mine_answer_receiver: mpsc::UnboundedReceiver<AnswerWithoutProof>,
|
||||||
|
mine_context_receiver: broadcast::Receiver<MineContextMessage>,
|
||||||
provider: Arc<MineServiceMiddleware>,
|
provider: Arc<MineServiceMiddleware>,
|
||||||
store: Arc<Store>,
|
store: Arc<Store>,
|
||||||
config: &MinerConfig,
|
config: &MinerConfig,
|
||||||
@ -39,6 +44,7 @@ impl Submitter {
|
|||||||
|
|
||||||
let submitter = Submitter {
|
let submitter = Submitter {
|
||||||
mine_answer_receiver,
|
mine_answer_receiver,
|
||||||
|
mine_context_receiver,
|
||||||
mine_contract,
|
mine_contract,
|
||||||
flow_contract,
|
flow_contract,
|
||||||
store,
|
store,
|
||||||
@ -51,18 +57,39 @@ impl Submitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn start(mut self) {
|
async fn start(mut self) {
|
||||||
|
let mut current_context_digest: Option<H256> = None;
|
||||||
loop {
|
loop {
|
||||||
match self.mine_answer_receiver.recv().await {
|
tokio::select! {
|
||||||
Some(answer) => {
|
answer_msg = self.mine_answer_receiver.recv() => {
|
||||||
if let Err(e) = self.submit_answer(answer).await {
|
match answer_msg {
|
||||||
warn!(e)
|
Some(answer) => {
|
||||||
|
if Some(answer.context_digest) != current_context_digest {
|
||||||
|
info!("Skip submission because of inconsistent context digest");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if let Err(e) = self.submit_answer(answer).await {
|
||||||
|
warn!(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
warn!("Mine submitter stopped because mine answer channel is closed.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => {
|
|
||||||
warn!("Mine submitter stopped because mine answer channel is closed.");
|
context_msg = self.mine_context_receiver.recv() => {
|
||||||
break;
|
match context_msg {
|
||||||
|
Ok(puzzle) => {
|
||||||
|
current_context_digest = puzzle.map(|p| p.context_digest());
|
||||||
|
}
|
||||||
|
Err(broadcast::error::RecvError::Closed) => {
|
||||||
|
warn!("Mine context channel closed.");
|
||||||
|
},
|
||||||
|
Err(_) => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,6 +163,7 @@ impl Submitter {
|
|||||||
|
|
||||||
let receipt = pending_transaction
|
let receipt = pending_transaction
|
||||||
.retries(SUBMISSION_RETIES)
|
.retries(SUBMISSION_RETIES)
|
||||||
|
.interval(Duration::from_secs(2))
|
||||||
.await
|
.await
|
||||||
.map_err(|e| format!("Fail to execute mine answer transaction: {:?}", e))?
|
.map_err(|e| format!("Fail to execute mine answer transaction: {:?}", e))?
|
||||||
.ok_or(format!(
|
.ok_or(format!(
|
||||||
|
@ -19,9 +19,9 @@ use std::sync::Arc;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::{ops::DerefMut, str::FromStr};
|
use std::{ops::DerefMut, str::FromStr};
|
||||||
|
|
||||||
use crate::{config::MineServiceMiddleware, MinerConfig, MinerMessage};
|
use crate::{config::MineServiceMiddleware, mine::PoraPuzzle, MinerConfig, MinerMessage};
|
||||||
|
|
||||||
pub type MineContextMessage = Option<(MineContext, U256)>;
|
pub type MineContextMessage = Option<PoraPuzzle>;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref EMPTY_HASH: H256 =
|
pub static ref EMPTY_HASH: H256 =
|
||||||
@ -33,7 +33,7 @@ pub struct MineContextWatcher {
|
|||||||
flow_contract: ZgsFlow<MineServiceMiddleware>,
|
flow_contract: ZgsFlow<MineServiceMiddleware>,
|
||||||
mine_contract: PoraMine<MineServiceMiddleware>,
|
mine_contract: PoraMine<MineServiceMiddleware>,
|
||||||
|
|
||||||
mine_context_sender: mpsc::UnboundedSender<MineContextMessage>,
|
mine_context_sender: broadcast::Sender<MineContextMessage>,
|
||||||
last_report: MineContextMessage,
|
last_report: MineContextMessage,
|
||||||
|
|
||||||
msg_recv: broadcast::Receiver<MinerMessage>,
|
msg_recv: broadcast::Receiver<MinerMessage>,
|
||||||
@ -45,14 +45,14 @@ impl MineContextWatcher {
|
|||||||
msg_recv: broadcast::Receiver<MinerMessage>,
|
msg_recv: broadcast::Receiver<MinerMessage>,
|
||||||
provider: Arc<MineServiceMiddleware>,
|
provider: Arc<MineServiceMiddleware>,
|
||||||
config: &MinerConfig,
|
config: &MinerConfig,
|
||||||
) -> mpsc::UnboundedReceiver<MineContextMessage> {
|
) -> broadcast::Receiver<MineContextMessage> {
|
||||||
let provider = provider;
|
let provider = provider;
|
||||||
|
|
||||||
let mine_contract = PoraMine::new(config.mine_address, provider.clone());
|
let mine_contract = PoraMine::new(config.mine_address, provider.clone());
|
||||||
let flow_contract = ZgsFlow::new(config.flow_address, provider.clone());
|
let flow_contract = ZgsFlow::new(config.flow_address, provider.clone());
|
||||||
|
|
||||||
let (mine_context_sender, mine_context_receiver) =
|
let (mine_context_sender, mine_context_receiver) =
|
||||||
mpsc::unbounded_channel::<MineContextMessage>();
|
broadcast::channel::<MineContextMessage>(4096);
|
||||||
let watcher = MineContextWatcher {
|
let watcher = MineContextWatcher {
|
||||||
provider,
|
provider,
|
||||||
flow_contract,
|
flow_contract,
|
||||||
@ -108,12 +108,17 @@ impl MineContextWatcher {
|
|||||||
let context_call = self.flow_contract.make_context_with_result();
|
let context_call = self.flow_contract.make_context_with_result();
|
||||||
let valid_call = self.mine_contract.can_submit();
|
let valid_call = self.mine_contract.can_submit();
|
||||||
let quality_call = self.mine_contract.pora_target();
|
let quality_call = self.mine_contract.pora_target();
|
||||||
|
let shards_call = self.mine_contract.max_shards();
|
||||||
|
|
||||||
let (context, can_submit, quality) =
|
let (context, can_submit, quality, max_shards) = try_join!(
|
||||||
try_join!(context_call.call(), valid_call.call(), quality_call.call())
|
context_call.call(),
|
||||||
.map_err(|e| format!("Failed to query mining context: {:?}", e))?;
|
valid_call.call(),
|
||||||
|
quality_call.call(),
|
||||||
|
shards_call.call()
|
||||||
|
)
|
||||||
|
.map_err(|e| format!("Failed to query mining context: {:?}", e))?;
|
||||||
let report = if can_submit && context.digest != EMPTY_HASH.0 {
|
let report = if can_submit && context.digest != EMPTY_HASH.0 {
|
||||||
Some((context, quality))
|
Some(PoraPuzzle::new(context, quality, max_shards))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
@ -40,5 +40,9 @@ pub trait Rpc {
|
|||||||
async fn get_peers(&self) -> RpcResult<HashMap<String, PeerInfo>>;
|
async fn get_peers(&self) -> RpcResult<HashMap<String, PeerInfo>>;
|
||||||
|
|
||||||
#[method(name = "getFileLocation")]
|
#[method(name = "getFileLocation")]
|
||||||
async fn get_file_location(&self, tx_seq: u64) -> RpcResult<Option<Vec<LocationInfo>>>;
|
async fn get_file_location(
|
||||||
|
&self,
|
||||||
|
tx_seq: u64,
|
||||||
|
all_shards: bool,
|
||||||
|
) -> RpcResult<Option<Vec<LocationInfo>>>;
|
||||||
}
|
}
|
||||||
|
@ -185,7 +185,13 @@ impl RpcServer for RpcServerImpl {
|
|||||||
.collect())
|
.collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_file_location(&self, tx_seq: u64) -> RpcResult<Option<Vec<LocationInfo>>> {
|
async fn get_file_location(
|
||||||
|
&self,
|
||||||
|
tx_seq: u64,
|
||||||
|
all_shards: bool,
|
||||||
|
) -> RpcResult<Option<Vec<LocationInfo>>> {
|
||||||
|
info!("admin_getFileLocation()");
|
||||||
|
|
||||||
let tx = match self.ctx.log_store.get_tx_by_seq_number(tx_seq).await? {
|
let tx = match self.ctx.log_store.get_tx_by_seq_number(tx_seq).await? {
|
||||||
Some(tx) => tx,
|
Some(tx) => tx,
|
||||||
None => {
|
None => {
|
||||||
@ -221,7 +227,9 @@ impl RpcServer for RpcServerImpl {
|
|||||||
shard_config: shard_config.unwrap(),
|
shard_config: shard_config.unwrap(),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
if all_shards_available(info.iter().map(|info| info.shard_config).collect()) {
|
|
||||||
|
if !all_shards || all_shards_available(info.iter().map(|info| info.shard_config).collect())
|
||||||
|
{
|
||||||
Ok(Some(info))
|
Ok(Some(info))
|
||||||
} else {
|
} else {
|
||||||
Ok(None)
|
Ok(None)
|
||||||
|
@ -126,7 +126,7 @@ impl Batcher {
|
|||||||
Ok(Some(SyncResult::Failed))
|
Ok(Some(SyncResult::Failed))
|
||||||
}
|
}
|
||||||
|
|
||||||
// file sync timeout
|
// finding peers timeout
|
||||||
Some(SyncState::FindingPeers { origin, .. })
|
Some(SyncState::FindingPeers { origin, .. })
|
||||||
if origin.elapsed() > self.config.find_peer_timeout =>
|
if origin.elapsed() > self.config.find_peer_timeout =>
|
||||||
{
|
{
|
||||||
@ -135,6 +135,15 @@ impl Batcher {
|
|||||||
Ok(Some(SyncResult::Timeout))
|
Ok(Some(SyncResult::Timeout))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// connecting peers timeout
|
||||||
|
Some(SyncState::ConnectingPeers { origin, .. })
|
||||||
|
if origin.elapsed() > self.config.find_peer_timeout =>
|
||||||
|
{
|
||||||
|
debug!(%tx_seq, "Terminate file sync due to connecting peers timeout");
|
||||||
|
self.terminate_file_sync(tx_seq, false).await;
|
||||||
|
Ok(Some(SyncResult::Timeout))
|
||||||
|
}
|
||||||
|
|
||||||
// others
|
// others
|
||||||
_ => Ok(None),
|
_ => Ok(None),
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ pub enum SyncState {
|
|||||||
},
|
},
|
||||||
FoundPeers,
|
FoundPeers,
|
||||||
ConnectingPeers {
|
ConnectingPeers {
|
||||||
|
origin: InstantWrapper,
|
||||||
since: InstantWrapper,
|
since: InstantWrapper,
|
||||||
},
|
},
|
||||||
AwaitingOutgoingConnection {
|
AwaitingOutgoingConnection {
|
||||||
@ -253,6 +254,7 @@ impl SerialSyncController {
|
|||||||
info!(%self.tx_seq, %num_peers_dailed, "Connecting peers");
|
info!(%self.tx_seq, %num_peers_dailed, "Connecting peers");
|
||||||
|
|
||||||
self.state = SyncState::ConnectingPeers {
|
self.state = SyncState::ConnectingPeers {
|
||||||
|
origin: self.since,
|
||||||
since: Instant::now().into(),
|
since: Instant::now().into(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -632,6 +634,7 @@ impl SerialSyncController {
|
|||||||
SyncState::FoundPeers => {
|
SyncState::FoundPeers => {
|
||||||
if self.peers.all_shards_available(vec![Connecting, Connected]) {
|
if self.peers.all_shards_available(vec![Connecting, Connected]) {
|
||||||
self.state = SyncState::ConnectingPeers {
|
self.state = SyncState::ConnectingPeers {
|
||||||
|
origin: self.since,
|
||||||
since: Instant::now().into(),
|
since: Instant::now().into(),
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
|
12
scripts/check_abis.sh
Executable file
12
scripts/check_abis.sh
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
artifacts_path="$1"
|
||||||
|
|
||||||
|
check_abis() {
|
||||||
|
for contract_name in "$@"; do
|
||||||
|
diff $(./scripts/search_abi.sh "$artifacts_path" "$contract_name.json") "storage-contracts-abis/$contract_name.json"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
check_abis DummyMarket DummyReward Flow PoraMine PoraMineTest FixedPrice ChunkLinearReward FixedPriceFlow
|
||||||
|
|
15
scripts/search_abi.sh
Executable file
15
scripts/search_abi.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
directory="$1" # The directory to search in
|
||||||
|
filename="$2" # The filename to search for
|
||||||
|
|
||||||
|
# Find the file in the directory
|
||||||
|
found_files=$(find "$directory" -type f -name "$filename")
|
||||||
|
|
||||||
|
# Check if any files were found
|
||||||
|
if [ -z "$found_files" ]; then
|
||||||
|
echo "Error: No files named '$filename' found in directory '$directory'." >&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "$found_files"
|
||||||
|
fi
|
65
scripts/update_abis.sh
Executable file
65
scripts/update_abis.sh
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
default_path="../0g-storage-contracts"
|
||||||
|
path="${1:-$default_path}"
|
||||||
|
|
||||||
|
# Step 1: Check if the path is a valid Git directory with commits
|
||||||
|
if [ ! -d "$path/.git" ] || [ -z "$(git -C "$path" rev-parse HEAD 2> /dev/null)" ]; then
|
||||||
|
echo "Error: The specified path is not a valid Git repository with commits."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ ! -z "$(git -C "$path" status --porcelain)" ]; then
|
||||||
|
echo "Error: There are uncommitted changes in the contract repository."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 2: Build the contracts
|
||||||
|
build_contracts() {
|
||||||
|
local target_path="$path"
|
||||||
|
local original_path=$(pwd) # Save the current directory
|
||||||
|
|
||||||
|
if cd "$target_path"; then
|
||||||
|
yarn
|
||||||
|
yarn build
|
||||||
|
cd "$original_path"
|
||||||
|
else
|
||||||
|
echo "Error: Failed to switch to directory $target_path."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
build_contracts
|
||||||
|
|
||||||
|
# Step 3: Copy the file from a specified sub-path
|
||||||
|
copy_file() {
|
||||||
|
local source_path="$1"
|
||||||
|
local destination_path="$2"
|
||||||
|
|
||||||
|
# Check if the source file exists
|
||||||
|
if [ ! -f "$source_path" ]; then
|
||||||
|
echo "Error: The file $source_path does not exist."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Copy the file to the destination
|
||||||
|
cp "$source_path" "$destination_path"
|
||||||
|
echo "File copied: $source_path -> $destination_path."
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_abis() {
|
||||||
|
for contract_name in "$@"; do
|
||||||
|
copy_file $(./scripts/search_abi.sh "$path/artifacts" "$contract_name.json") "storage-contracts-abis/$contract_name.json"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_abis DummyMarket DummyReward Flow PoraMine PoraMineTest FixedPrice ChunkLinearReward FixedPriceFlow
|
||||||
|
|
||||||
|
|
||||||
|
# Step 4: Get the current Git revision and write it to a specified file
|
||||||
|
git_revision=$(git -C "$path" rev-parse HEAD)
|
||||||
|
revision_file="storage-contracts-abis/0g-storage-contracts-rev"
|
||||||
|
echo "$git_revision" > "$revision_file"
|
||||||
|
|
||||||
|
echo "Write git rev $git_revision to $revision_file."
|
1
storage-contracts-abis/0g-storage-contracts-rev
Normal file
1
storage-contracts-abis/0g-storage-contracts-rev
Normal file
@ -0,0 +1 @@
|
|||||||
|
dbeff538b949599c203e43be6ecc05e9e997d09d
|
619
storage-contracts-abis/ChunkLinearReward.json
Normal file
619
storage-contracts-abis/ChunkLinearReward.json
Normal file
File diff suppressed because one or more lines are too long
34
storage-contracts-abis/DummyMarket.json
Normal file
34
storage-contracts-abis/DummyMarket.json
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"_format": "hh-sol-artifact-1",
|
||||||
|
"contractName": "DummyMarket",
|
||||||
|
"sourceName": "contracts/test/DummyMarket.sol",
|
||||||
|
"abi": [
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "beforeLength",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "uploadSectors",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "paddingSectors",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "chargeFee",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"bytecode": "0x6080604052348015600f57600080fd5b5060a08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063da6eb36a14602d575b600080fd5b603d6038366004603f565b505050565b005b600080600060608486031215605357600080fd5b50508135936020830135935060409092013591905056fea264697066735822122054eb84b374e7eb5c57b284f82f977fe19500436ef4128d3e147969cefdd4cbcd64736f6c63430008100033",
|
||||||
|
"deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063da6eb36a14602d575b600080fd5b603d6038366004603f565b505050565b005b600080600060608486031215605357600080fd5b50508135936020830135935060409092013591905056fea264697066735822122054eb84b374e7eb5c57b284f82f977fe19500436ef4128d3e147969cefdd4cbcd64736f6c63430008100033",
|
||||||
|
"linkReferences": {},
|
||||||
|
"deployedLinkReferences": {}
|
||||||
|
}
|
77
storage-contracts-abis/DummyReward.json
Normal file
77
storage-contracts-abis/DummyReward.json
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
"_format": "hh-sol-artifact-1",
|
||||||
|
"contractName": "DummyReward",
|
||||||
|
"sourceName": "contracts/test/DummyReward.sol",
|
||||||
|
"abi": [
|
||||||
|
{
|
||||||
|
"anonymous": false,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "pricingIndex",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": true,
|
||||||
|
"internalType": "address",
|
||||||
|
"name": "beneficiary",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"indexed": false,
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "amount",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "DistributeReward",
|
||||||
|
"type": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "pricingIndex",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "address payable",
|
||||||
|
"name": "beneficiary",
|
||||||
|
"type": "address"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "bytes32",
|
||||||
|
"name": "minerId",
|
||||||
|
"type": "bytes32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "claimMineReward",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"type": "function"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "beforeLength",
|
||||||
|
"type": "uint256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"internalType": "uint256",
|
||||||
|
"name": "uploadSectors",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "fillReward",
|
||||||
|
"outputs": [],
|
||||||
|
"stateMutability": "payable",
|
||||||
|
"type": "function"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"bytecode": "0x608060405234801561001057600080fd5b5060f18061001f6000396000f3fe60806040526004361060265760003560e01c806359e9670014602b578063b7a3c04c14603c575b600080fd5b603a60363660046058565b5050565b005b348015604757600080fd5b50603a60533660046079565b505050565b60008060408385031215606a57600080fd5b50508035926020909101359150565b600080600060608486031215608d57600080fd5b8335925060208401356001600160a01b038116811460aa57600080fd5b92959294505050604091909101359056fea264697066735822122031a993c3def9ed899c5b5a53bab495d498047e1a8ce262b61e700511cfb9adf164736f6c63430008100033",
|
||||||
|
"deployedBytecode": "0x60806040526004361060265760003560e01c806359e9670014602b578063b7a3c04c14603c575b600080fd5b603a60363660046058565b5050565b005b348015604757600080fd5b50603a60533660046079565b505050565b60008060408385031215606a57600080fd5b50508035926020909101359150565b600080600060608486031215608d57600080fd5b8335925060208401356001600160a01b038116811460aa57600080fd5b92959294505050604091909101359056fea264697066735822122031a993c3def9ed899c5b5a53bab495d498047e1a8ce262b61e700511cfb9adf164736f6c63430008100033",
|
||||||
|
"linkReferences": {},
|
||||||
|
"deployedLinkReferences": {}
|
||||||
|
}
|
386
storage-contracts-abis/FixedPrice.json
Normal file
386
storage-contracts-abis/FixedPrice.json
Normal file
File diff suppressed because one or more lines are too long
932
storage-contracts-abis/FixedPriceFlow.json
Normal file
932
storage-contracts-abis/FixedPriceFlow.json
Normal file
File diff suppressed because one or more lines are too long
911
storage-contracts-abis/Flow.json
Normal file
911
storage-contracts-abis/Flow.json
Normal file
File diff suppressed because one or more lines are too long
971
storage-contracts-abis/PoraMine.json
Normal file
971
storage-contracts-abis/PoraMine.json
Normal file
File diff suppressed because one or more lines are too long
1178
storage-contracts-abis/PoraMineTest.json
Normal file
1178
storage-contracts-abis/PoraMineTest.json
Normal file
File diff suppressed because one or more lines are too long
3
storage-contracts-abis/README.md
Normal file
3
storage-contracts-abis/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
This folder is maintained by the script `./scripts/update_abis.sh <0g-storage-contracts-path>`. Please do not modify it manually. The default value for `0g-storage-contracts-path` is `../0g-storage-contracts`.
|
||||||
|
|
||||||
|
When running the script, ensure that there are no uncommitted changes in the storage path and that `yarn` is already installed.
|
@ -45,14 +45,14 @@ class MineTest(TestFramework):
|
|||||||
self.log.info("Submission done, current epoch is %d", start_epoch)
|
self.log.info("Submission done, current epoch is %d", start_epoch)
|
||||||
|
|
||||||
self.log.info("Wait for the first mine context release")
|
self.log.info("Wait for the first mine context release")
|
||||||
wait_until(lambda: int(blockchain.eth_blockNumber(), 16) >= start_epoch + 1, timeout=180)
|
wait_until(lambda: self.contract.epoch() >= start_epoch + 1, timeout=180)
|
||||||
self.contract.update_context()
|
self.contract.update_context()
|
||||||
|
|
||||||
self.log.info("Wait for the first mine answer")
|
self.log.info("Wait for the first mine answer")
|
||||||
wait_until(lambda: self.mine_contract.last_mined_epoch() == start_epoch + 1 and not self.mine_contract.can_submit(), timeout=180)
|
wait_until(lambda: self.mine_contract.last_mined_epoch() == start_epoch + 1 and not self.mine_contract.can_submit(), timeout=180)
|
||||||
|
|
||||||
self.log.info("Wait for the second mine context release")
|
self.log.info("Wait for the second mine context release")
|
||||||
wait_until(lambda: int(blockchain.eth_blockNumber(), 16) >= start_epoch + 2, timeout=180)
|
wait_until(lambda: self.contract.epoch() >= start_epoch + 2, timeout=180)
|
||||||
self.contract.update_context()
|
self.contract.update_context()
|
||||||
|
|
||||||
self.log.info("Wait for the second mine answer")
|
self.log.info("Wait for the second mine answer")
|
||||||
@ -60,7 +60,7 @@ class MineTest(TestFramework):
|
|||||||
|
|
||||||
self.nodes[0].miner_stop()
|
self.nodes[0].miner_stop()
|
||||||
self.log.info("Wait for the third mine context release")
|
self.log.info("Wait for the third mine context release")
|
||||||
wait_until(lambda: int(blockchain.eth_blockNumber(), 16) >= start_epoch + 3, timeout=180)
|
wait_until(lambda: self.contract.epoch() >= start_epoch + 3, timeout=180)
|
||||||
self.contract.update_context()
|
self.contract.update_context()
|
||||||
|
|
||||||
self.log.info("Submit the second data chunk")
|
self.log.info("Submit the second data chunk")
|
||||||
|
@ -50,6 +50,7 @@ class MineTest(TestFramework):
|
|||||||
|
|
||||||
SECTORS_PER_PRICING = int(8 * ( 2 ** 30 ) / 256)
|
SECTORS_PER_PRICING = int(8 * ( 2 ** 30 ) / 256)
|
||||||
|
|
||||||
|
|
||||||
self.log.info("Submit the actual data chunk (256 MB)")
|
self.log.info("Submit the actual data chunk (256 MB)")
|
||||||
self.submit_data(b"\x11", int(SECTORS_PER_PRICING / 32))
|
self.submit_data(b"\x11", int(SECTORS_PER_PRICING / 32))
|
||||||
|
|
||||||
@ -74,7 +75,7 @@ class MineTest(TestFramework):
|
|||||||
firstReward = rewards[0].args.amount
|
firstReward = rewards[0].args.amount
|
||||||
self.log.info("Received reward %d Gwei", firstReward / (10**9))
|
self.log.info("Received reward %d Gwei", firstReward / (10**9))
|
||||||
|
|
||||||
self.reward_contract.transfer(10000 * 10 ** 18)
|
self.reward_contract.donate(10000 * 10 ** 18)
|
||||||
self.log.info("Donation Done")
|
self.log.info("Donation Done")
|
||||||
self.log.info("Submit the data hash only (8 GB)")
|
self.log.info("Submit the data hash only (8 GB)")
|
||||||
self.submit_data(b"\x11", int(SECTORS_PER_PRICING), no_submit=True)
|
self.submit_data(b"\x11", int(SECTORS_PER_PRICING), no_submit=True)
|
||||||
|
@ -29,6 +29,9 @@ class SyncTest(TestFramework):
|
|||||||
client1 = self.nodes[0]
|
client1 = self.nodes[0]
|
||||||
client2 = self.nodes[1]
|
client2 = self.nodes[1]
|
||||||
|
|
||||||
|
# stop client2, preventing it from receiving AnnounceFile
|
||||||
|
client2.shutdown()
|
||||||
|
|
||||||
# Create submission
|
# Create submission
|
||||||
chunk_data = random.randbytes(256 * 1024)
|
chunk_data = random.randbytes(256 * 1024)
|
||||||
data_root = self.__create_submission(chunk_data)
|
data_root = self.__create_submission(chunk_data)
|
||||||
@ -41,16 +44,22 @@ class SyncTest(TestFramework):
|
|||||||
segments = submit_data(client1, chunk_data)
|
segments = submit_data(client1, chunk_data)
|
||||||
self.log.info("segments: %s", [(s["root"], s["index"], s["proof"]) for s in segments])
|
self.log.info("segments: %s", [(s["root"], s["index"], s["proof"]) for s in segments])
|
||||||
wait_until(lambda: client1.zgs_get_file_info(data_root)["finalized"])
|
wait_until(lambda: client1.zgs_get_file_info(data_root)["finalized"])
|
||||||
|
|
||||||
# File should not be auto sync on node 2
|
# restart client2
|
||||||
|
client2.start()
|
||||||
|
client2.wait_for_rpc_connection()
|
||||||
|
|
||||||
|
# File should not be auto sync on node 2 and there is no cached file locations
|
||||||
wait_until(lambda: client2.zgs_get_file_info(data_root) is not None)
|
wait_until(lambda: client2.zgs_get_file_info(data_root) is not None)
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
assert_equal(client2.zgs_get_file_info(data_root)["finalized"], False)
|
assert_equal(client2.zgs_get_file_info(data_root)["finalized"], False)
|
||||||
|
assert(client2.admin_get_file_location(0) is None)
|
||||||
|
|
||||||
# Trigger file sync by rpc
|
# Trigger file sync by rpc
|
||||||
assert(client2.admin_start_sync_file(0) is None)
|
assert(client2.admin_start_sync_file(0) is None)
|
||||||
wait_until(lambda: client2.sync_status_is_completed_or_unknown(0))
|
wait_until(lambda: client2.sync_status_is_completed_or_unknown(0))
|
||||||
wait_until(lambda: client2.zgs_get_file_info(data_root)["finalized"])
|
wait_until(lambda: client2.zgs_get_file_info(data_root)["finalized"])
|
||||||
|
assert(client2.admin_get_file_location(0) is not None)
|
||||||
|
|
||||||
# Validate data
|
# Validate data
|
||||||
assert_equal(
|
assert_equal(
|
||||||
|
@ -267,7 +267,7 @@ class BlockchainNode(TestNode):
|
|||||||
def deploy_contract(name, args=None):
|
def deploy_contract(name, args=None):
|
||||||
if args is None:
|
if args is None:
|
||||||
args = []
|
args = []
|
||||||
contract_interface = load_contract_metadata(base_path=self.contract_path, name=name)
|
contract_interface = load_contract_metadata(path=self.contract_path, name=name)
|
||||||
contract = w3.eth.contract(
|
contract = w3.eth.contract(
|
||||||
abi=contract_interface["abi"],
|
abi=contract_interface["abi"],
|
||||||
bytecode=contract_interface["bytecode"],
|
bytecode=contract_interface["bytecode"],
|
||||||
@ -303,7 +303,7 @@ class BlockchainNode(TestNode):
|
|||||||
mine_contract.functions.setTargetSubmissions(2).transact(TX_PARAMS)
|
mine_contract.functions.setTargetSubmissions(2).transact(TX_PARAMS)
|
||||||
self.log.debug("Mine Initialized")
|
self.log.debug("Mine Initialized")
|
||||||
|
|
||||||
flow_initialize_hash = (flow_contract.get_function_by_signature('initialize(address)'))(dummy_market_contract.address).transact(TX_PARAMS)
|
flow_initialize_hash = flow_contract.functions.initialize(dummy_market_contract.address).transact(TX_PARAMS)
|
||||||
self.log.debug("Flow Initialized")
|
self.log.debug("Flow Initialized")
|
||||||
|
|
||||||
self.wait_for_transaction_receipt(w3, flow_initialize_hash)
|
self.wait_for_transaction_receipt(w3, flow_initialize_hash)
|
||||||
@ -340,9 +340,10 @@ class BlockchainNode(TestNode):
|
|||||||
self.log.debug("Market Initialized")
|
self.log.debug("Market Initialized")
|
||||||
|
|
||||||
reward_contract.functions.initialize(market_contract.address, mine_contract.address).transact(TX_PARAMS)
|
reward_contract.functions.initialize(market_contract.address, mine_contract.address).transact(TX_PARAMS)
|
||||||
|
reward_contract.functions.setBaseReward(10 ** 18).transact(TX_PARAMS)
|
||||||
self.log.debug("Reward Initialized")
|
self.log.debug("Reward Initialized")
|
||||||
|
|
||||||
flow_initialize_hash = (flow_contract.get_function_by_signature('initialize(address)'))(market_contract.address).transact(TX_PARAMS)
|
flow_initialize_hash = flow_contract.functions.initialize(market_contract.address).transact(TX_PARAMS)
|
||||||
self.log.debug("Flow Initialized")
|
self.log.debug("Flow Initialized")
|
||||||
|
|
||||||
self.wait_for_transaction_receipt(w3, flow_initialize_hash)
|
self.wait_for_transaction_receipt(w3, flow_initialize_hash)
|
||||||
|
@ -28,6 +28,14 @@ class ContractProxy:
|
|||||||
|
|
||||||
contract = self._get_contract(node_idx)
|
contract = self._get_contract(node_idx)
|
||||||
return getattr(contract.functions, fn_name)(**args).transact(copy(TX_PARAMS))
|
return getattr(contract.functions, fn_name)(**args).transact(copy(TX_PARAMS))
|
||||||
|
|
||||||
|
def _send_payable(self, fn_name, node_idx, value, **args):
|
||||||
|
assert node_idx < len(self.blockchain_nodes)
|
||||||
|
|
||||||
|
contract = self._get_contract(node_idx)
|
||||||
|
tx_params = copy(TX_PARAMS)
|
||||||
|
tx_params["value"] = value
|
||||||
|
return getattr(contract.functions, fn_name)(**args).transact(tx_params)
|
||||||
|
|
||||||
def _logs(self, event_name, node_idx, **args):
|
def _logs(self, event_name, node_idx, **args):
|
||||||
assert node_idx < len(self.blockchain_nodes)
|
assert node_idx < len(self.blockchain_nodes)
|
||||||
@ -66,7 +74,6 @@ class FlowContractProxy(ContractProxy):
|
|||||||
contract.w3, tx_hash, parent_hash=parent_hash
|
contract.w3, tx_hash, parent_hash=parent_hash
|
||||||
)
|
)
|
||||||
if receipt["status"] != 1:
|
if receipt["status"] != 1:
|
||||||
print(receipt)
|
|
||||||
assert_equal(receipt["status"], 1)
|
assert_equal(receipt["status"], 1)
|
||||||
return tx_hash
|
return tx_hash
|
||||||
|
|
||||||
@ -98,6 +105,12 @@ class MineContractProxy(ContractProxy):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class IRewardContractProxy(ContractProxy):
|
class RewardContractProxy(ContractProxy):
|
||||||
def reward_distributes(self, node_idx=0):
|
def reward_distributes(self, node_idx=0):
|
||||||
return self._logs("DistributeReward", node_idx)
|
return self._logs("DistributeReward", node_idx)
|
||||||
|
|
||||||
|
def donate(self, value, node_idx = 0):
|
||||||
|
return self._send_payable("donate", node_idx, value)
|
||||||
|
|
||||||
|
def base_reward(self, node_idx = 0):
|
||||||
|
return self._call("baseReward", node_idx)
|
@ -1,11 +1,10 @@
|
|||||||
from os.path import join
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import json
|
import json
|
||||||
from web3 import Web3
|
from web3 import Web3
|
||||||
|
|
||||||
|
|
||||||
def load_contract_metadata(base_path: str, name: str):
|
def load_contract_metadata(path: str, name: str):
|
||||||
path = Path(join(base_path, "artifacts"))
|
path = Path(path)
|
||||||
try:
|
try:
|
||||||
found_file = next(path.rglob(f"{name}.json"))
|
found_file = next(path.rglob(f"{name}.json"))
|
||||||
return json.loads(open(found_file, "r").read())
|
return json.loads(open(found_file, "r").read())
|
||||||
|
@ -15,7 +15,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
from eth_utils import encode_hex
|
from eth_utils import encode_hex
|
||||||
from test_framework.bsc_node import BSCNode
|
from test_framework.bsc_node import BSCNode
|
||||||
from test_framework.contract_proxy import FlowContractProxy, MineContractProxy, IRewardContractProxy
|
from test_framework.contract_proxy import FlowContractProxy, MineContractProxy, RewardContractProxy
|
||||||
from test_framework.zgs_node import ZgsNode
|
from test_framework.zgs_node import ZgsNode
|
||||||
from test_framework.blockchain_node import BlockChainNodeType
|
from test_framework.blockchain_node import BlockChainNodeType
|
||||||
from test_framework.conflux_node import ConfluxNode, connect_sample_nodes
|
from test_framework.conflux_node import ConfluxNode, connect_sample_nodes
|
||||||
@ -175,7 +175,7 @@ class TestFramework:
|
|||||||
contract, tx_hash, mine_contract, reward_contract = self.blockchain_nodes[0].setup_contract(self.enable_market, self.mine_period, self.lifetime_seconds)
|
contract, tx_hash, mine_contract, reward_contract = self.blockchain_nodes[0].setup_contract(self.enable_market, self.mine_period, self.lifetime_seconds)
|
||||||
self.contract = FlowContractProxy(contract, self.blockchain_nodes)
|
self.contract = FlowContractProxy(contract, self.blockchain_nodes)
|
||||||
self.mine_contract = MineContractProxy(mine_contract, self.blockchain_nodes)
|
self.mine_contract = MineContractProxy(mine_contract, self.blockchain_nodes)
|
||||||
self.reward_contract = IRewardContractProxy(reward_contract, self.blockchain_nodes)
|
self.reward_contract = RewardContractProxy(reward_contract, self.blockchain_nodes)
|
||||||
|
|
||||||
|
|
||||||
for node in self.blockchain_nodes[1:]:
|
for node in self.blockchain_nodes[1:]:
|
||||||
@ -258,7 +258,7 @@ class TestFramework:
|
|||||||
dest="contract",
|
dest="contract",
|
||||||
default=os.path.join(
|
default=os.path.join(
|
||||||
__file_path__,
|
__file_path__,
|
||||||
"../../0g-storage-contracts/",
|
"../../storage-contracts-abis/",
|
||||||
),
|
),
|
||||||
type=str,
|
type=str,
|
||||||
)
|
)
|
||||||
|
@ -115,6 +115,9 @@ class ZgsNode(TestNode):
|
|||||||
def sync_status_is_completed_or_unknown(self, tx_seq):
|
def sync_status_is_completed_or_unknown(self, tx_seq):
|
||||||
status = self.rpc.admin_getSyncStatus([tx_seq])
|
status = self.rpc.admin_getSyncStatus([tx_seq])
|
||||||
return status == "Completed" or status == "unknown"
|
return status == "Completed" or status == "unknown"
|
||||||
|
|
||||||
|
def admin_get_file_location(self, tx_seq, all_shards = True):
|
||||||
|
return self.rpc.admin_getFileLocation([tx_seq, all_shards])
|
||||||
|
|
||||||
def clean_data(self):
|
def clean_data(self):
|
||||||
shutil.rmtree(os.path.join(self.data_dir, "db"))
|
shutil.rmtree(os.path.join(self.data_dir, "db"))
|
||||||
|
300
version-meld/discv5/Cargo.lock
generated
300
version-meld/discv5/Cargo.lock
generated
@ -108,37 +108,36 @@ version = "1.0.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "base16ct"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "base64"
|
name = "base64"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
|
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "base64ct"
|
||||||
|
version = "1.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "1.3.2"
|
version = "1.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bitvec"
|
|
||||||
version = "0.20.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848"
|
|
||||||
dependencies = [
|
|
||||||
"funty",
|
|
||||||
"radium",
|
|
||||||
"tap",
|
|
||||||
"wyz",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "block-buffer"
|
name = "block-buffer"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
|
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"block-padding",
|
|
||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -151,12 +150,6 @@ dependencies = [
|
|||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "block-padding"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bs58"
|
name = "bs58"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
@ -215,9 +208,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "const-oid"
|
name = "const-oid"
|
||||||
version = "0.5.2"
|
version = "0.9.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "279bc8fc53f788a75c7804af68237d1fce02cde1e275a886a4b320604dc2aeda"
|
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpufeatures"
|
name = "cpufeatures"
|
||||||
@ -235,12 +228,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
|
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crypto-common"
|
name = "crypto-bigint"
|
||||||
version = "0.1.1"
|
version = "0.4.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "683d6b536309245c849479fba3da410962a43ed8e51c26b729208ec0ac2798d0"
|
checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"generic-array",
|
"generic-array",
|
||||||
|
"rand_core 0.6.3",
|
||||||
|
"subtle",
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crypto-common"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
|
||||||
|
dependencies = [
|
||||||
|
"generic-array",
|
||||||
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -253,16 +259,6 @@ dependencies = [
|
|||||||
"subtle",
|
"subtle",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crypto-mac"
|
|
||||||
version = "0.11.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
|
|
||||||
dependencies = [
|
|
||||||
"generic-array",
|
|
||||||
"subtle",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ctr"
|
name = "ctr"
|
||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
@ -293,12 +289,12 @@ checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "der"
|
name = "der"
|
||||||
version = "0.3.5"
|
version = "0.6.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2eeb9d92785d1facb50567852ce75d0858630630e7eabea59cf7eb7474051087"
|
checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"const-oid",
|
"const-oid",
|
||||||
"typenum",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -312,13 +308,13 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "digest"
|
name = "digest"
|
||||||
version = "0.10.1"
|
version = "0.10.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b697d66081d42af4fba142d56918a3cb21dc8eb63372c6b85d14f44fb9c5979b"
|
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"block-buffer 0.10.0",
|
"block-buffer 0.10.0",
|
||||||
"crypto-common",
|
"crypto-common",
|
||||||
"generic-array",
|
"subtle",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -328,7 +324,7 @@ dependencies = [
|
|||||||
"aes",
|
"aes",
|
||||||
"aes-gcm",
|
"aes-gcm",
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
"digest 0.10.1",
|
"digest 0.10.7",
|
||||||
"enr",
|
"enr",
|
||||||
"env_logger 0.9.0",
|
"env_logger 0.9.0",
|
||||||
"fnv",
|
"fnv",
|
||||||
@ -347,7 +343,7 @@ dependencies = [
|
|||||||
"rand_core 0.6.3",
|
"rand_core 0.6.3",
|
||||||
"rand_xorshift",
|
"rand_xorshift",
|
||||||
"rlp",
|
"rlp",
|
||||||
"sha2",
|
"sha2 0.10.8",
|
||||||
"simple_logger",
|
"simple_logger",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"tokio",
|
"tokio",
|
||||||
@ -361,13 +357,13 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ecdsa"
|
name = "ecdsa"
|
||||||
version = "0.11.1"
|
version = "0.14.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "34d33b390ab82f2e1481e331dbd0530895640179d2128ef9a79cc690b78d1eba"
|
checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"der",
|
"der",
|
||||||
"elliptic-curve",
|
"elliptic-curve",
|
||||||
"hmac 0.11.0",
|
"rfc6979",
|
||||||
"signature",
|
"signature",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -390,7 +386,7 @@ dependencies = [
|
|||||||
"ed25519",
|
"ed25519",
|
||||||
"rand 0.7.3",
|
"rand 0.7.3",
|
||||||
"serde",
|
"serde",
|
||||||
"sha2",
|
"sha2 0.9.8",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -402,25 +398,29 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "elliptic-curve"
|
name = "elliptic-curve"
|
||||||
version = "0.9.12"
|
version = "0.12.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c13e9b0c3c4170dcc2a12783746c4205d98e18957f57854251eea3f9750fe005"
|
checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitvec",
|
"base16ct",
|
||||||
|
"crypto-bigint",
|
||||||
|
"der",
|
||||||
|
"digest 0.10.7",
|
||||||
"ff",
|
"ff",
|
||||||
"generic-array",
|
"generic-array",
|
||||||
"group",
|
"group",
|
||||||
"pkcs8",
|
"pkcs8",
|
||||||
"rand_core 0.6.3",
|
"rand_core 0.6.3",
|
||||||
|
"sec1",
|
||||||
"subtle",
|
"subtle",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "enr"
|
name = "enr"
|
||||||
version = "0.5.1"
|
version = "0.6.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "809869a1328bfb586b48c9c0f87761c47c41793a85bcb06f66074a87cafc1bcd"
|
checksum = "26fa0a0be8915790626d5759eb51fe47435a8eac92c2f212bd2da9aa7f30ea56"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"bs58",
|
"bs58",
|
||||||
@ -461,11 +461,10 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ff"
|
name = "ff"
|
||||||
version = "0.9.0"
|
version = "0.12.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "72a4d941a5b7c2a75222e2d44fcdf634a67133d9db31e177ae5ff6ecda852bfe"
|
checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitvec",
|
|
||||||
"rand_core 0.6.3",
|
"rand_core 0.6.3",
|
||||||
"subtle",
|
"subtle",
|
||||||
]
|
]
|
||||||
@ -492,12 +491,6 @@ dependencies = [
|
|||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "funty"
|
|
||||||
version = "1.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures"
|
name = "futures"
|
||||||
version = "0.3.19"
|
version = "0.3.19"
|
||||||
@ -555,7 +548,7 @@ checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -638,9 +631,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "group"
|
name = "group"
|
||||||
version = "0.9.0"
|
version = "0.12.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "61b3c1e8b4f1ca07e6605ea1be903a5f6956aec5c8a67fd44d56076631675ed8"
|
checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ff",
|
"ff",
|
||||||
"rand_core 0.6.3",
|
"rand_core 0.6.3",
|
||||||
@ -697,12 +690,11 @@ checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hkdf"
|
name = "hkdf"
|
||||||
version = "0.11.0"
|
version = "0.12.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b"
|
checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"digest 0.9.0",
|
"hmac 0.12.1",
|
||||||
"hmac 0.11.0",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -711,18 +703,17 @@ version = "0.8.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840"
|
checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crypto-mac 0.8.0",
|
"crypto-mac",
|
||||||
"digest 0.9.0",
|
"digest 0.9.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hmac"
|
name = "hmac"
|
||||||
version = "0.11.0"
|
version = "0.12.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
|
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crypto-mac 0.11.1",
|
"digest 0.10.7",
|
||||||
"digest 0.9.0",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -798,21 +789,24 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "k256"
|
name = "k256"
|
||||||
version = "0.8.1"
|
version = "0.11.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8c3e8e491ed22bc161583a1c77e42313672c483eba6bd9d7afec0f1131d0b9ce"
|
checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"ecdsa",
|
"ecdsa",
|
||||||
"elliptic-curve",
|
"elliptic-curve",
|
||||||
"sha2",
|
"sha2 0.10.8",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "keccak"
|
name = "keccak"
|
||||||
version = "0.1.0"
|
version = "0.1.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7"
|
checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654"
|
||||||
|
dependencies = [
|
||||||
|
"cpufeatures",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
@ -852,7 +846,7 @@ dependencies = [
|
|||||||
"rand 0.8.4",
|
"rand 0.8.4",
|
||||||
"ring",
|
"ring",
|
||||||
"rw-stream-sink",
|
"rw-stream-sink",
|
||||||
"sha2",
|
"sha2 0.9.8",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"unsigned-varint",
|
"unsigned-varint",
|
||||||
@ -875,7 +869,7 @@ dependencies = [
|
|||||||
"libsecp256k1-gen-genmult",
|
"libsecp256k1-gen-genmult",
|
||||||
"rand 0.8.4",
|
"rand 0.8.4",
|
||||||
"serde",
|
"serde",
|
||||||
"sha2",
|
"sha2 0.9.8",
|
||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1005,7 +999,7 @@ dependencies = [
|
|||||||
"digest 0.9.0",
|
"digest 0.9.0",
|
||||||
"generic-array",
|
"generic-array",
|
||||||
"multihash-derive",
|
"multihash-derive",
|
||||||
"sha2",
|
"sha2 0.9.8",
|
||||||
"unsigned-varint",
|
"unsigned-varint",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1019,7 +1013,7 @@ dependencies = [
|
|||||||
"proc-macro-error",
|
"proc-macro-error",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
"synstructure",
|
"synstructure",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1141,7 +1135,7 @@ checksum = "3be26700300be6d9d23264c73211d8190e755b6b5ca7a1b28230025511b52a5e"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1152,7 +1146,7 @@ checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1169,9 +1163,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pkcs8"
|
name = "pkcs8"
|
||||||
version = "0.6.1"
|
version = "0.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c9c2f795bc591cb3384cb64082a578b89207ac92bb89c9d98c1ea2ace7cd8110"
|
checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"der",
|
"der",
|
||||||
"spki",
|
"spki",
|
||||||
@ -1214,7 +1208,7 @@ dependencies = [
|
|||||||
"proc-macro-error-attr",
|
"proc-macro-error-attr",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1231,11 +1225,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.30"
|
version = "1.0.86"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "edc3358ebc67bc8b7fa0c007f945b0b18226f78437d61bec735a9eb96b61ee70"
|
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-xid",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1278,7 +1272,7 @@ dependencies = [
|
|||||||
"itertools",
|
"itertools",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1305,19 +1299,13 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.10"
|
version = "1.0.36"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
|
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "radium"
|
|
||||||
version = "0.6.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.7.3"
|
version = "0.7.3"
|
||||||
@ -1452,6 +1440,17 @@ dependencies = [
|
|||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rfc6979"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb"
|
||||||
|
dependencies = [
|
||||||
|
"crypto-bigint",
|
||||||
|
"hmac 0.12.1",
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ring"
|
name = "ring"
|
||||||
version = "0.16.20"
|
version = "0.16.20"
|
||||||
@ -1500,6 +1499,20 @@ version = "1.1.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sec1"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928"
|
||||||
|
dependencies = [
|
||||||
|
"base16ct",
|
||||||
|
"der",
|
||||||
|
"generic-array",
|
||||||
|
"pkcs8",
|
||||||
|
"subtle",
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.130"
|
version = "1.0.130"
|
||||||
@ -1517,7 +1530,7 @@ checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1534,15 +1547,24 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sha3"
|
name = "sha2"
|
||||||
version = "0.9.1"
|
version = "0.10.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809"
|
checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"block-buffer 0.9.0",
|
"cfg-if",
|
||||||
"digest 0.9.0",
|
"cpufeatures",
|
||||||
|
"digest 0.10.7",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sha3"
|
||||||
|
version = "0.10.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60"
|
||||||
|
dependencies = [
|
||||||
|
"digest 0.10.7",
|
||||||
"keccak",
|
"keccak",
|
||||||
"opaque-debug",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1565,11 +1587,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signature"
|
name = "signature"
|
||||||
version = "1.3.1"
|
version = "1.6.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335"
|
checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"digest 0.9.0",
|
"digest 0.10.7",
|
||||||
"rand_core 0.6.3",
|
"rand_core 0.6.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1606,10 +1628,11 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spki"
|
name = "spki"
|
||||||
version = "0.3.0"
|
version = "0.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9dae7e047abc519c96350e9484a96c6bf1492348af912fd3446dd2dc323f6268"
|
checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"base64ct",
|
||||||
"der",
|
"der",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1636,6 +1659,17 @@ dependencies = [
|
|||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.72"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "synstructure"
|
name = "synstructure"
|
||||||
version = "0.12.6"
|
version = "0.12.6"
|
||||||
@ -1644,16 +1678,10 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tap"
|
|
||||||
version = "1.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempfile"
|
name = "tempfile"
|
||||||
version = "3.2.0"
|
version = "3.2.0"
|
||||||
@ -1694,15 +1722,16 @@ checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thread_local"
|
name = "thread_local"
|
||||||
version = "1.1.3"
|
version = "1.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd"
|
checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1765,7 +1794,7 @@ checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1824,7 +1853,7 @@ checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1889,6 +1918,12 @@ version = "0.3.7"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
|
checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-normalization"
|
name = "unicode-normalization"
|
||||||
version = "0.1.19"
|
version = "0.1.19"
|
||||||
@ -1989,7 +2024,7 @@ dependencies = [
|
|||||||
"log",
|
"log",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -2011,7 +2046,7 @@ checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 1.0.80",
|
||||||
"wasm-bindgen-backend",
|
"wasm-bindgen-backend",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
@ -2074,29 +2109,22 @@ version = "0.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wyz"
|
|
||||||
version = "0.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zeroize"
|
name = "zeroize"
|
||||||
version = "1.4.3"
|
version = "1.8.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d68d9dcec5f9b43a30d38c49f91dfedfaac384cb8f085faca366c26207dd1619"
|
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"zeroize_derive",
|
"zeroize_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zeroize_derive"
|
name = "zeroize_derive"
|
||||||
version = "1.2.0"
|
version = "1.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bdff2024a851a322b08f179173ae2ba620445aef1e838f0c196820eade4ae0c7"
|
checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.72",
|
||||||
"synstructure",
|
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user