mirror of
https://github.com/tig-foundation/tig-monorepo.git
synced 2026-02-23 11:27:44 +08:00
461 lines
11 KiB
Rust
461 lines
11 KiB
Rust
use crate::{
|
|
config::{ChallengeConfig, ProtocolConfig, RuntimeConfig},
|
|
serializable_struct_with_getters,
|
|
};
|
|
use serde::{Deserialize, Serialize};
|
|
use serde_json::{Map, Value};
|
|
use std::collections::{HashMap, HashSet};
|
|
use tig_utils::{jsonify, u64s_from_str, u8s_from_str};
|
|
pub use tig_utils::{Frontier, MerkleBranch, MerkleHash, Point, PreciseNumber, U256};
|
|
|
|
serializable_struct_with_getters! {
|
|
Benchmark {
|
|
id: String,
|
|
details: BenchmarkDetails,
|
|
state: BenchmarkState,
|
|
solution_quality: Option<Vec<i32>>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Binary {
|
|
algorithm_id: String,
|
|
details: BinaryDetails,
|
|
state: BinaryState,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Block {
|
|
id: String,
|
|
details: BlockDetails,
|
|
data: Option<BlockData>,
|
|
config: Option<ProtocolConfig>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Advance {
|
|
id: String,
|
|
details: AdvanceDetails,
|
|
state: AdvanceState,
|
|
block_data: Option<AdvanceBlockData>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Challenge {
|
|
id: String,
|
|
config: ChallengeConfig,
|
|
state: ChallengeState,
|
|
block_data: Option<ChallengeBlockData>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Code {
|
|
id: String,
|
|
details: CodeDetails,
|
|
state: CodeState,
|
|
block_data: Option<CodeBlockData>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Deposit {
|
|
id: String,
|
|
details: DepositDetails,
|
|
state: DepositState,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Fraud {
|
|
benchmark_id: String,
|
|
state: FraudState,
|
|
allegation: Option<String>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
OPoW {
|
|
player_id: String,
|
|
block_data: Option<OPoWBlockData>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Player {
|
|
id: String,
|
|
details: PlayerDetails,
|
|
state: PlayerState,
|
|
block_data: Option<PlayerBlockData>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Precommit {
|
|
benchmark_id: String,
|
|
details: PrecommitDetails,
|
|
settings: BenchmarkSettings,
|
|
state: PrecommitState,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
MerkleProof {
|
|
leaf: OutputData,
|
|
branch: MerkleBranch,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
Proof {
|
|
benchmark_id: String,
|
|
details: ProofDetails,
|
|
state: ProofState,
|
|
merkle_proofs: Option<Vec<MerkleProof>>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
TopUp {
|
|
id: String,
|
|
details: TopUpDetails,
|
|
state: TopUpState,
|
|
}
|
|
}
|
|
|
|
// Advance child structs
|
|
serializable_struct_with_getters! {
|
|
AdvanceDetails {
|
|
name: String,
|
|
player_id: String,
|
|
challenge_id: String,
|
|
fee_paid: PreciseNumber,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
AdvanceState {
|
|
block_confirmed: u32,
|
|
round_submitted: u32,
|
|
round_pushed: u32,
|
|
round_voting_starts: u32,
|
|
round_votes_tallied: u32,
|
|
votes_tally: HashMap<bool, PreciseNumber>,
|
|
round_active: Option<u32>,
|
|
round_merged: Option<u32>,
|
|
banned: bool,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
AdvanceBlockData {
|
|
adoption: PreciseNumber,
|
|
merge_points: u32,
|
|
reward: PreciseNumber,
|
|
}
|
|
}
|
|
|
|
// Benchmark child structs
|
|
serializable_struct_with_getters! {
|
|
BenchmarkSettings {
|
|
player_id: String,
|
|
block_id: String,
|
|
challenge_id: String,
|
|
algorithm_id: String,
|
|
track_id: String,
|
|
}
|
|
}
|
|
impl BenchmarkSettings {
|
|
pub fn calc_seed(&self, rand_hash: &String, nonce: u64) -> [u8; 32] {
|
|
u8s_from_str(&format!("{}_{}_{}", jsonify(&self), rand_hash, nonce))
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
BenchmarkDetails {
|
|
stopped: bool,
|
|
average_quality_by_bundle: Option<Vec<i32>>,
|
|
merkle_root: Option<MerkleHash>,
|
|
sampled_nonces: Option<HashSet<u64>>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
BenchmarkState {
|
|
block_confirmed: u32,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
OutputMetaData {
|
|
nonce: u64,
|
|
runtime_signature: u64,
|
|
fuel_consumed: u64,
|
|
solution_signature: u64,
|
|
}
|
|
}
|
|
impl From<OutputData> for OutputMetaData {
|
|
fn from(data: OutputData) -> Self {
|
|
OutputMetaData {
|
|
solution_signature: data.calc_solution_signature(),
|
|
runtime_signature: data.runtime_signature,
|
|
fuel_consumed: data.fuel_consumed,
|
|
nonce: data.nonce,
|
|
}
|
|
}
|
|
}
|
|
impl From<OutputMetaData> for MerkleHash {
|
|
fn from(data: OutputMetaData) -> Self {
|
|
MerkleHash(u8s_from_str(&jsonify(&data)))
|
|
}
|
|
}
|
|
impl From<OutputData> for MerkleHash {
|
|
fn from(data: OutputData) -> Self {
|
|
MerkleHash::from(OutputMetaData::from(data))
|
|
}
|
|
}
|
|
|
|
// Binary child structs
|
|
serializable_struct_with_getters! {
|
|
BinaryDetails {
|
|
compile_success: bool,
|
|
download_url: Option<String>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
BinaryState {
|
|
block_confirmed: u32,
|
|
}
|
|
}
|
|
|
|
// Block child structs
|
|
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, Hash)]
|
|
#[serde(rename_all = "lowercase")]
|
|
pub enum TxType {
|
|
Advance,
|
|
Benchmark,
|
|
Binary,
|
|
Challenge,
|
|
Code,
|
|
Deposit,
|
|
Fraud,
|
|
Precommit,
|
|
Proof,
|
|
TopUp,
|
|
Verified,
|
|
}
|
|
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, Hash)]
|
|
#[serde(rename_all = "lowercase")]
|
|
pub enum ActiveType {
|
|
Advance,
|
|
Benchmark,
|
|
Challenge,
|
|
Code,
|
|
Deposit,
|
|
OPoW,
|
|
Player,
|
|
}
|
|
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, Hash)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum EmissionsType {
|
|
Advance,
|
|
Benchmarker,
|
|
Bootstrap,
|
|
ChallengeOwner,
|
|
Code,
|
|
Delegator,
|
|
Vault,
|
|
}
|
|
serializable_struct_with_getters! {
|
|
BlockDetails {
|
|
prev_block_id: String,
|
|
height: u32,
|
|
round: u32,
|
|
num_confirmed: HashMap<TxType, u32>,
|
|
num_active: HashMap<ActiveType, u32>,
|
|
timestamp: u64,
|
|
emissions: HashMap<EmissionsType, PreciseNumber>,
|
|
gamma_value: f64,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
BlockData {
|
|
confirmed_ids: HashMap<TxType, HashSet<String>>,
|
|
active_ids: HashMap<ActiveType, HashSet<String>>,
|
|
}
|
|
}
|
|
|
|
// Challenge child structs
|
|
serializable_struct_with_getters! {
|
|
ChallengeState {
|
|
round_active: u32,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
ChallengeBlockData {
|
|
num_qualifiers_by_track: HashMap<String, u64>,
|
|
qualifier_qualities_by_track: HashMap<String, HashSet<i32>>,
|
|
}
|
|
}
|
|
|
|
// Code child structs
|
|
serializable_struct_with_getters! {
|
|
CodeDetails {
|
|
name: String,
|
|
player_id: String,
|
|
challenge_id: String,
|
|
algorithm_id: Option<String>,
|
|
fee_paid: PreciseNumber,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
CodeState {
|
|
block_confirmed: u32,
|
|
round_submitted: u32,
|
|
round_pushed: u32,
|
|
round_active: Option<u32>,
|
|
round_merged: Option<u32>,
|
|
banned: bool,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
CodeBlockData {
|
|
num_qualifiers_by_track_by_player: HashMap<String, HashMap<String, u64>>,
|
|
adoption: PreciseNumber,
|
|
merge_points: u32,
|
|
reward: PreciseNumber,
|
|
}
|
|
}
|
|
|
|
// Deposit child structs
|
|
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
|
#[serde(rename_all = "lowercase")]
|
|
pub enum DepositType {
|
|
Linear {
|
|
start_timestamp: u64,
|
|
end_timestamp: u64,
|
|
},
|
|
Lock {
|
|
eth_block_num: u64,
|
|
},
|
|
}
|
|
serializable_struct_with_getters! {
|
|
DepositDetails {
|
|
player_id: String,
|
|
tx_hash: String,
|
|
log_idx: usize,
|
|
amount: PreciseNumber,
|
|
r#type: DepositType,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
DepositState {
|
|
block_confirmed: u32,
|
|
}
|
|
}
|
|
|
|
// Fraud child structs
|
|
serializable_struct_with_getters! {
|
|
FraudState {
|
|
block_confirmed: u32,
|
|
}
|
|
}
|
|
|
|
// OPoW child structs
|
|
serializable_struct_with_getters! {
|
|
OPoWBlockData {
|
|
num_qualifiers_by_challenge_by_track: HashMap<String, HashMap<String, u64>>,
|
|
cutoff: u64,
|
|
weighted_self_deposit: PreciseNumber,
|
|
weighted_delegated_deposit: PreciseNumber,
|
|
delegators: HashSet<String>,
|
|
reward_share: PreciseNumber,
|
|
coinbase: HashMap<String, PreciseNumber>,
|
|
imbalance: PreciseNumber,
|
|
influence: PreciseNumber,
|
|
reward: PreciseNumber,
|
|
}
|
|
}
|
|
|
|
// Player child structs
|
|
serializable_struct_with_getters! {
|
|
PlayerDetails {
|
|
name: Option<String>,
|
|
is_multisig: bool,
|
|
}
|
|
}
|
|
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
|
|
pub struct PlayerValue<T> {
|
|
pub value: T,
|
|
pub block_set: u32,
|
|
}
|
|
serializable_struct_with_getters! {
|
|
PlayerState {
|
|
total_fees_paid: PreciseNumber,
|
|
available_fee_balance: PreciseNumber,
|
|
delegatees: Option<PlayerValue<HashMap<String, f64>>>,
|
|
votes: HashMap<String, PlayerValue<bool>>,
|
|
reward_share: Option<PlayerValue<f64>>,
|
|
coinbase: Option<PlayerValue<HashMap<String, f64>>>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
PlayerBlockData {
|
|
delegatees: HashMap<String, f64>,
|
|
reward_by_type: HashMap<EmissionsType, PreciseNumber>,
|
|
deposit_by_locked_period: Vec<PreciseNumber>,
|
|
weighted_deposit: PreciseNumber,
|
|
}
|
|
}
|
|
|
|
// Precommit child structs
|
|
serializable_struct_with_getters! {
|
|
PrecommitDetails {
|
|
block_started: u32,
|
|
num_nonces: u64,
|
|
num_bundles: u64,
|
|
rand_hash: String,
|
|
fee_paid: PreciseNumber,
|
|
runtime_config: RuntimeConfig,
|
|
hyperparameters: Option<Map<String, Value>>,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
PrecommitState {
|
|
block_confirmed: u32,
|
|
}
|
|
}
|
|
|
|
// Proof child structs
|
|
serializable_struct_with_getters! {
|
|
ProofDetails {
|
|
submission_delay: u32,
|
|
block_active: u32,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
ProofState {
|
|
block_confirmed: u32,
|
|
}
|
|
}
|
|
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
|
#[serde(rename_all = "lowercase")]
|
|
pub enum CPUArchitecture {
|
|
AMD64,
|
|
ARM64,
|
|
}
|
|
serializable_struct_with_getters! {
|
|
OutputData {
|
|
nonce: u64,
|
|
runtime_signature: u64,
|
|
fuel_consumed: u64,
|
|
solution: String,
|
|
cpu_arch: CPUArchitecture,
|
|
}
|
|
}
|
|
impl OutputData {
|
|
pub fn calc_solution_signature(&self) -> u64 {
|
|
u64s_from_str(&jsonify(&self.solution))[0]
|
|
}
|
|
}
|
|
|
|
// TopUp child structs
|
|
serializable_struct_with_getters! {
|
|
TopUpDetails {
|
|
player_id: String,
|
|
tx_hash: String,
|
|
log_idx: usize,
|
|
amount: PreciseNumber,
|
|
}
|
|
}
|
|
serializable_struct_with_getters! {
|
|
TopUpState {
|
|
block_confirmed: u32,
|
|
}
|
|
}
|