From 3dd21b3588b5ac1f35c35ffd22d61c1bd779639e Mon Sep 17 00:00:00 2001 From: FiveMovesAhead Date: Tue, 14 May 2024 11:24:30 +0800 Subject: [PATCH] Update tech explainer. --- docs/images/emissions_schedule.jpg | Bin 0 -> 68826 bytes docs/tech/1_basics.md | 18 +++--- docs/tech/2_challenges.md | 86 ++++++++++++++--------------- docs/tech/3_innovators.md | 36 ++++++------ docs/tech/4_benchmarkers.md | 47 ++++++++-------- docs/tech/5_opow.md | 40 +++++++++----- docs/tech/6_q_and_a.md | 1 - docs/tech/6_roadmap.md | 15 +++++ 8 files changed, 132 insertions(+), 111 deletions(-) create mode 100644 docs/images/emissions_schedule.jpg delete mode 100644 docs/tech/6_q_and_a.md create mode 100644 docs/tech/6_roadmap.md diff --git a/docs/images/emissions_schedule.jpg b/docs/images/emissions_schedule.jpg new file mode 100644 index 0000000000000000000000000000000000000000..444e1f766f192f90132ff320781184ce37c9f09b GIT binary patch literal 68826 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 1, base frontier is the lower bound - * If multiplier < 1, base frontier is the upper bound + 1. If multiplier > 1, base frontier is the lower bound + 2. If multiplier < 1, base frontier is the upper bound The following Benchmarker behaviour is expected: -- **When number of qualifiers is higher than threshold:** Benchmarkers will naturally select harder and harder difficulties so that their solutions stay on the frontiers for as long as possible, as only qualifiers count towards influence and share in block rewards. - +- **When number of qualifiers is higher than threshold:** Benchmarkers will naturally select increasingly large difficulties so that their solutions stay on the frontiers for as long as possible, as only qualifiers count towards influence and result in a share of the block rewards. - **When number of qualifiers is equal to threshold:** Benchmarkers will stay at the same difficulty - -- **When number of qualifiers is lower than threshold:** Benchmarkers will naturally select easier and easier difficulties to compute more solutions which will be qualifiers. +- **When number of qualifiers is lower than threshold:** Benchmarkers will naturally select smaller difficulties to compute more solutions which will be qualifiers. ## 2.3. Regulating Verification Load -Verification of solutions constitutes almost the entirety of the computation load for TIG's network. In addition to probabilistic verification which drastically reduces the number of solutions that require verification, TIG employs a solution signature threshold mechanism to regulate the rate of solutions and the verification load of each solution. +Verification of solutions constitutes almost the entirety of the computation load for TIG’s network in the early phase of deployment. In addition to probabilistic verification which drastically reduces the number of solutions that require verification, TIG employs a solution signature threshold mechanism to regulate the rate of solutions and the verification load of each solution. ### 2.3.1. Solution Signature -A solution signature is a unique identifier for each solution derived from hashing the solution and its runtime signature. To be considered valid, this signature must fall below a dynamically adjusted threshold. - -Each challenge possesses its own dynamically adjusted solution signature threshold which starts at `100%` and can be adjusted by a maximum of `0.25%` per block. This percentage reflects the probability of a solution being valid. +A solution signature is a unique identifier for each solution derived from hashing the solution and its runtime signature. TIG requires any submitted solution to have a signature to be below a dynamically adjusted threshold. -Lowering the threshold has the effect of reducing the probability that any given solution will be valid, thereby decreasing the overall solution rate. As a result, the number of qualifiers, and subsequently the difficulty range of the challenge, will also decrease. Increasing the threshold has the opposite effect. +Each challenge possesses its own dynamically adjusted solution signature threshold which begins at 100% and can be adjusted by a maximum of 0.5% per block. The solution signature threshold adjusts the probability of a solution being submittable to TIG. Lowering the threshold has the effect of reducing this probability, thereby decreasing the overall rate of solutions being submitted. As a result the difficulty range of the challenge will also decrease. Increasing the threshold has the opposite effect. There are 2 feedback loops which adjusts the threshold: -1. **Target fuel consumption** (currently disabled). The execution of an algorithm is performed through a WASM Virtual Machine which tracks "fuel consumption", a proxy for the real runtime of the algorithm. Fuel consumption is deterministic and is submitted by Benchmarkers when submitting solutions. +1. **Target fuel consumption** (currently disabled). The execution of an algorithm is performed through a WASM Virtual Machine which tracks “fuel consumption”, a proxy for the real runtime of the algorithm. Fuel consumption is deterministic and is submitted by Benchmarkers when submitting solutions. - Another motivation for targeting a specific fuel consumption is to maintain a fair and decentralised system. If the runtime approaches the lifespan of a solution, raw speed (as opposed to efficiency) would become the dominant factor, potentially giving a significant advantage to hardware (such as supercomputers) that prioritises speed over efficiency. + Another motivation for targeting a specific fuel consumption is to maintain a fair and decentralised system. If the runtime approaches the lifespan of a solution, raw speed (as opposed to efficiency) would become the dominant factor, potentially giving a significant advantage to certain types of specialised hardware architectures (such as those found in “supercomputers”) that prioritise speed over efficiency (which is undesirable). -1. **Target solutions rate.** Solutions rate is determined every block based on mempool proofs that are being confirmed. (Each proof is associated with a benchmark, containing a number of solutions). +1. **Target solutions rate.** Solutions rate is determined every block based on “mempool” proofs that are being confirmed. (Each proof is associated with a benchmark, containing a number of solutions). - Spikes in solutions rate can occur when there is a sudden surge of new Benchmarkers/compute power coming online. If left unregulated, the difficulty should eventually rise such that the solution rate settles to an equilibrium rate, but this may take a prolonged period causing a strain on the network from the large verification load. To smooth out the verification load, TIG targets a specific solutions rate. \ No newline at end of file + Spikes in solutions rate can occur when there is a sudden surge of new Benchmarkers/compute power coming online. If left unregulated, the difficulty should eventually rise such that the solution rate settles to an equilibrium rate, but this may take a prolonged period causing a strain on the network from the large verification load. To smooth out the verification load, TIG targets a specific solutions rate. diff --git a/docs/tech/3_innovators.md b/docs/tech/3_innovators.md index a2a516d6..53209cbf 100644 --- a/docs/tech/3_innovators.md +++ b/docs/tech/3_innovators.md @@ -1,13 +1,13 @@ # 3. Innovators -Innovators are players in TIG who optimise existing proof-of-work algorithms and/or invent new ones, contributing them to TIG in order to share in block rewards. +Innovators are players in TIG who optimise existing proof-of-work algorithms and/or invent new ones, contributing them to TIG in the hope of earning token rewards. This chapter covers the following topics: 1. The two types of algorithm submissions 2. Mechanisms for maintaining a decentralised repository 3. How algorithms are executed by Benchmarkers -4. How algorithms earn block rewards +4. How algorithms earn token rewards ## 3.1. Types of Algorithm Submissions @@ -20,50 +20,48 @@ There are two types of algorithm submissions in TIG: Presently, code submissions are restricted to Rust, automatically compiled into WebAssembly (WASM) for execution by Benchmarkers. Rust was chosen for its performance advantages over other languages, enhancing commercial viability of algorithms contributed to TIG, particularly in high-performance computing. Future iterations of TIG will support additional languages compilable to WASM. -**Breakthrough submissions** involve the introduction of novel algorithms tailored to solve TIG's proof-of-work challenges. A breakthrough submission is expected to yield such a significant performance enhancement that even unoptimised code of the new algorithm outpaces the most optimised code of an existing one. +**Breakthrough submissions** involve the introduction of novel algorithms tailored to solve TIG's proof-of-work challenges. A breakthrough submission will often yield such a significant performance enhancement that even unoptimised code of the new algorithm outpaces the most optimised code of an existing one. -Support for breakthrough submissions is on TIG's roadmap. +Note: Support for breakthrough submissions is not currently in place but will be available in the coming months (pending a sufficiently wide token distribution). ## 3.2. Decentralised Repository -Algorithms are contributed to a repository devoid of a centralised gatekeeper. TIG addresses crucial issues such as spam and piracy to ensure fair rewards for Innovators based on performance, maintaining a strong incentive for innovation. +Algorithms are contributed to a repository without a centralised gatekeeper. TIG addresses crucial issues such as spam and piracy to ensure fair rewards for Innovators based on performance, maintaining a strong incentive for innovation. To combat spam, Innovators must pay a submission fee of 0.001 ETH, burnt by sending it to the null address (0x0000000000000000000000000000000000000000). In the future, this fee will be denominated in TIG tokens. -To counter piracy concerns, TIG implements a push delay and merge points mechanism: +To address the possibility of piracy and to provide an opportunity for IP protection, TIG implements a “push delay” and “merge points” mechanism: ### 3.2.1. Push Delay Mechanism -Upon submission, algorithms are committed to their own branch and pushed to a private repository. Following successful compilation into WebAssembly (WASM), a delay of `3` rounds ensues before the algorithm is made public where the branch is pushed to TIG's public repository. This delay safeguards Innovators' contributions, allowing them time to benefit before others can optimise upon or pirate their work. +Upon submission, algorithms are committed to their own branch and pushed to a private repository. Following successful compilation into WebAssembly (WASM), a delay of 3 rounds ensues before the algorithm is made public where the branch is pushed to TIG’s public repository. This delay safeguards Innovators' contributions, allowing them time to benefit before others can optimise upon or pirate their work. Notes: - Confirmation of an algorithm's submission occurs in the next block, determining the submission round. - -- An algorithm submitted in round `X` is made public at the onset of round `X + 3`. +- An algorithm submitted in round X is made public at the onset of round X + 3. ### 3.2.2. Merge Points Mechanism -This mechanism aims to deter algorithm piracy. For every block in which an algorithm achieves at least `25%` adoption, it earns a merge point alongside a share of the block reward based on its adoption. +This mechanism aims to deter algorithm piracy. For every block in which an algorithm achieves at least 25% adoption, it earns a merge point alongside a share of the block reward based on its adoption. -At the end of every round, the algorithm from each challenge with the most merge points (exceeding a minimum threshold of `5040`) is merged into the repository's main branch. Merge points reset each round. +At the end of each round, the algorithm from each challenge with the most merge points (exceeding a minimum threshold of 5,040) is merged into the repository's main branch. Merge points reset each round. -Merged algorithms, as long as their adoption is above `0%`, share in block rewards every block. +Merged algorithms, as long as their adoption is above 0%, share in block rewards every block. -The barrier to getting merged is intentionally set high as to minimise the likely payoff for pirating algorithms. +The barrier for an Innovator contribution to be merged is intentionally chosen to be relatively high to minimise the likely payoff for pirating algorithms. -For breakthrough submissions, the vote for recognising the algorithm as a breakthrough starts only when its code gets merged (details to come). This barrier is based on TIG's expectation that breakthroughs will demonstrate distinct performance improvements, ensuring high adoption even in unoptimised code. +For algorithmic breakthrough submissions, the vote for recognising the algorithm as a breakthrough starts only when its code gets merged (details to come). This barrier is based on TIG’s expectation that breakthroughs will demonstrate distinct performance improvements, ensuring high adoption even in unoptimised code. ## 3.3. Deterministic Execution -Algorithms in TIG are compiled into WebAssembly (WASM), facilitating execution by a corresponding WASM Virtual Machine. This environment, based on wasmi developed by parity-labs for blockchain applications, enables tracking of fuel consumption, imposition of memory limits, and has tools for deterministic compilation. +Algorithms in TIG are compiled into WebAssembly (WASM), facilitating execution by a corresponding WASM Virtual Machine. This environment, based on wasmi developed by Parity Technologies for blockchain applications, enables tracking of fuel consumption, imposition of memory limits, and has tools for deterministic compilation. Benchmarkers must download the WASM blob for their selected algorithm from TIG's repository before executing it using TIG's WASM Virtual Machine. Notes: - The WASM Virtual Machine functions as a sandbox environment, safeguarding against excessive runtime, memory usage, and malicious actions. - - Advanced Benchmarkers may opt to compile algorithms into binary executables for more efficient nonce searches, following thorough vetting of the code. ### 3.3.1. Runtime Signature @@ -74,6 +72,6 @@ As an algorithm is executed by TIG's WASM Virtual Machine, a "runtime signature" TIG incentivises algorithm contributions through block rewards: -- `15%` of block rewards are allocated evenly across challenges with at least one "pushed" algorithm before distributing pro-rata based on adoption rates. - -- In the future, a fixed percentage will be assigned to the latest breakthrough for each challenge. In the absence of a breakthrough, this percentage reverts back to the Benchmarkers' pool. Given the rarity of breakthroughs, this represents a significant reward, reflecting TIG's emphasis on breakthrough innovations. \ No newline at end of file +- 15% of block rewards are allocated evenly across challenges with at least one "pushed" algorithm before distributing pro-rata based on adoption rates. +- In the future, a fixed percentage (we intend 15% of block rewards, see below) will be assigned to the latest algorithmic breakthrough for each challenge. In the absence of a breakthrough, this percentage reverts back to the Benchmarkers' pool. Given the expected relative rarity of algorithmic breakthroughs (compared to code optimisations), this represents a significant reward, reflecting TIG's emphasis on breakthrough innovations. +- When the rewards stream for algorithmic breakthroughs is introduced, there will be a total of 30% of block rewards for Innovators and 70% for Benchmarkers. Over time, we intend for the percentage of block rewards for Innovators to approach 50%. diff --git a/docs/tech/4_benchmarkers.md b/docs/tech/4_benchmarkers.md index 8c46a4d2..360ad139 100644 --- a/docs/tech/4_benchmarkers.md +++ b/docs/tech/4_benchmarkers.md @@ -1,4 +1,4 @@ -# 4\. Benchmarkers +# 4. Benchmarkers Benchmarkers are players in TIG who continuously select algorithms to compute solutions for challenges and submit them to TIG through benchmarks and proofs to earn block rewards. @@ -13,9 +13,9 @@ This chapter covers the following topics: The process of benchmarking comprises 3 steps: -1. Picking benchmark settings +1. Selecting benchmark settings 2. Generate challenge instances -3. Execute algorithm on instances & record solutions +3. Execute algorithm on instances and record solutions Apart from algorithm selection, this process is entirely automated by the browser benchmarker. @@ -29,35 +29,32 @@ A Benchmarker must select their settings, comprising 5 fields, before benchmarki 4. Block Id 5. Difficulty -**Player Id** is the address of the Benchmarker. It prevents fraudulent re-use of solutions computed by another Benchmarker. +**Player Id** is the address of the Benchmarker. This prevents fraudulent re-use of solutions computed by another Benchmarker. -**Challenge Id** is the proof-of-work that the Benchmarker wants to compute solutions for. The challenge must be flagged as active in the referenced block. Benchmarkers are incentivised to make their selection based on minimising their imbalance. Imbalance minimisation is the default strategy for the browser benchmarker. +**Challenge Id** identifies the proof-of-work challenge for which the Benchmarker is attempting to compute solutions. The challenge must be flagged as active in the referenced block. Benchmarkers are incentivised to make their selection based on minimising their imbalance. Note: Imbalance minimisation is the default strategy for the browser benchmarker. -**Algorithm Id** is the proof-of-work algorithm that the Benchmarker wants to use to compute solutions. The algorithm must be flagged as active in the referenced block. Benchmarkers are incentivised to make their selection based on the algorithm's performance in computing solutions. +**Algorithm Id** is the proof-of-work algorithm that the Benchmarker wants to use to compute solutions. The algorithm must be flagged as active in the referenced block. Benchmarkers are incentivised to make their selection based on the algorithm’s performance in computing solutions. -**Block Id** is a reference block from which the lifespan of the solutions starts counting down. Benchmarkers are incentivised to reference the latest block as to maximise the remaining lifespan of any computed solutions. +**Block Id** is a reference block from which the lifespan of the solutions begins counting down. Benchmarkers are incentivised to reference the latest block as to maximise the remaining lifespan of any computed solutions. -**Difficulty** is the difficulty of the challenge instances that the Benchmarker is computing solutions for. The difficulty must lie within the valid range of the challenge for the referenced block. Benchmarkers are incentivised to make their selection to strike a balance between the number of blocks their solution will be a qualifier, and the number of solutions they can compute. (e.g. lower difficulty may mean more solutions, but may lower the number of blocks that the solutions are qualifiers) +**Difficulty** is the difficulty of the challenge instances for which the Benchmarker is attempting to compute solutions. The difficulty must lie within the valid range of the challenge for the referenced block. Benchmarkers are incentivised to make their selection to strike a balance between the number of blocks for which their solution will remain a qualifier, and the number of solutions they can compute. (e.g. lower difficulty may mean more solutions, but may lower the number of blocks that the solutions remain qualifiers) ### 4.1.2. Unpredictable Challenge Instances TIG makes it intractable for Benchmarkers to attempt to re-use solutions by: 1. Challenge instances are deterministically pseudo-randomly generated, with at least 10^15 unique instances even at minimum difficulty. - 2. Instance seeds are computed by hashing benchmark settings and XOR-ing with a nonce, ensuring randomness. During benchmarking, Benchmarkers iterate over nonces for seed and instance generation. ### 4.1.3. Algorithm Execution -The compiled WebAssembly (WASM) blobs for active algorithms can be downloaded from TIG's repository: +Active algorithms reside as compiled WebAssembly (WASM) blobs in TIG's open repository. -``` -/tig-algorithms/wasm/.wasm +https://raw.githubusercontent.com/tig-foundation/tig-monorepo/**_<branch>_**/tig-algorithms/wasm/**_<branch>_**.wasm -where is / -``` +where <branch> is <challenge_name>/<algorithm_name> Benchmarkers download the relevant WASM blob for their chosen algorithm, execute it using TIG's WASM Virtual Machine with specified seed and difficulty inputs. @@ -97,13 +94,16 @@ A benchmark, a lightweight batch of valid solutions found using identical settin Upon benchmark submission, it enters the mempool for inclusion in the next block. When the benchmark is confirmed into a block, up to three unique nonces are sampled from the metadata, and corresponding solution data must be submitted by Benchmarkers. -TIG refers to this sampling as probabilistic verification, and ensures its unpredictability by using both the new block id and benchmark id in seeding the pseudo-random number generator. Probabilistic verification not only drastically reduces the amount of solution data that gets submitted to TIG, but makes it irrational to fraudulently pad a benchmark with fake solutions: +TIG refers to this sampling as probabilistic verification, and ensures its unpredictability by using both the new block id and benchmark id in seeding the pseudo-random number generator. Probabilistic verification not only drastically reduces the amount of solution data that gets submitted to TIG, but also renders it irrational to fraudulently “pad” a benchmark with fake solutions: + +If a Benchmarker computes N solutions, and pads M fake solutions to the benchmark for a total of N + M solutions, then the chance of getting away with this is $\left(\frac{N}{N+M}\right)^3$. The expected payoff for honesty (N solutions always accepted) is always greater than the payoff for fraudulence (N+M solutions sometimes accepted): -If a Benchmarker computes `N` solutions, and pads `M` fake solutions to the benchmark for a total of `N + M` solutions, then the chance of getting away with this is $\left(\frac{N}{N+M}\right)^3$. The expected payoff for honesty (`N` solutions always accepted) is always greater than the payoff for fraudulence (`N + M` solutions sometimes accepted): +$$N > (N+M) \cdot \left(\frac{N}{N+M}\right)^3$$ -$$N > (N + M) \cdot \left(\frac{N}{N+M}\right)^3$$ $$1 > \left(\frac{N}{N+M}\right)^2$$ +Note that N is always smaller than N + M. + ### 4.2.3. Submitting Proof A proof includes the following fields: @@ -113,13 +113,13 @@ A proof includes the following fields: **Benchmark id** refers to the benchmark for which a proof is being submitted. Only one proof can be submitted per benchmark. -**Array of solution data** must correspond to the nonces sampled from the benchmark's solutions metadata. +**Array of solution data** must correspond to the nonces sampled from the benchmark’s solutions metadata. ### 4.2.4. Submission Delay & Lifespan mechanism Upon confirmation of a proof submission, a submission delay is determined based on the block gap between when the benchmark started and when its proof was confirmed. -A submission delay penalty is calculated by multiplying the submission delay by a multiplier (currently set to `3`). If the penalty is `X` and the proof was confirmed at block `Y`, then the benchmark's solutions only become "active" (eligible to potentially be qualifiers and share in block rewards) from block `X + Y` onwards. +A submission delay penalty is calculated by multiplying the submission delay by a multiplier (currently set to 3). If the penalty is X and the proof was confirmed at block Y, then the benchmark’s solutions only become “active” (eligible to potentially be qualifiers and share in block rewards) from block X + Y onwards. As TIG imposes a lifespan, the maximum number of blocks that a solution can be active (currently set to 120 blocks), there is a strong incentive for Benchmarkers to submit solutions as soon as possible. @@ -128,17 +128,16 @@ As TIG imposes a lifespan, the maximum number of blocks that a solution can be a Two types of verification are performed on solutions submitted to TIG to safeguard algorithm adoption against manipulation: 1. Verification of serialised solutions against challenge instances, triggered during benchmark and proof submission. - 2. Verification of the algorithm that the Benchmarker claims to have used, involving re-running the algorithm against the challenge instance before checking that the same solution data is reproduced. -If verification fails, the benchmark is flagged as fraudulent, disqualifying its solutions. In the future a slashing penalty will be applied. +If verification fails, the benchmark is flagged as fraudulent, disqualifying its solutions. In the future (when Benchmarker deposits are introduced) a slashing penalty will be applied. ## 4.4. Sharing in Block Rewards -Every block, `85%` of block rewards are distributed pro-rata amongst Benchmarkers based on influence. A Benchmarker's influence is based on their fraction of qualifying solutions across challenges with only active solutions eligible. +Every block, 85% of block rewards are distributed pro-rata amongst Benchmarkers based on influence. A Benchmarker’s influence is based on their fraction of qualifying solutions across challenges with only active solutions eligible. ### 4.4.1. Cutoff Mechanism -To strongly disincentivise Benchmarkers from focusing only a single challenge (e.g. benchmarking their own algorithm), TIG employs a cutoff mechanism. This mechanism limits the maximum qualifiers per challenge based on an average number of solutions multiplied by a multiplier (currently set to `2.5`). +To strongly disincentivise Benchmarkers from focusing only on a single challenge (e.g. benchmarking their own algorithm), TIG employs a cutoff mechanism. This mechanism limits the maximum qualifiers per challenge based on an average number of solutions multiplied by a multiplier (currently set to 2.5). -The multiplier is such that the cutoff mechanism will not affect normal benchmarking in `99.9%` of cases. \ No newline at end of file +The multiplier is such that the cutoff mechanism will not affect normal benchmarking in 99.9% of cases. diff --git a/docs/tech/5_opow.md b/docs/tech/5_opow.md index d71272eb..9cc5b348 100644 --- a/docs/tech/5_opow.md +++ b/docs/tech/5_opow.md @@ -1,33 +1,45 @@ - # 5. Optimisable Proof-of-Work -Optimisable proof-of-work (OPoW) distinctively requires multiple proof-of-works to be featured, "binding" them in such a way that optimisations to the proof-of-work algorithms do not cause instability/centralisation. This binding is embodied in the calculation of influence for Benchmarkers. The adoption of an algorithm is then calculated using each Benchmarker's influence and the fraction of qualifiers they computed using that algorithm. +Optimisable proof-of-work (OPoW) distinctively requires multiple proof-of-works to be featured, “binding” them in such a way that optimisations to the proof-of-work algorithms do not cause instability/centralisation. This binding is embodied in the calculation of influence for Benchmarkers. The adoption of an algorithm is then calculated using each Benchmarker’s influence and the fraction of qualifiers they computed using that algorithm. ## 5.1. Influence -OPoW introduces a novel metric, imbalance, aimed at quantifying the degree to which a Benchmarker contributes to centralization by leveraging statistical measures. This is only possible when there are multiple proof-of-works. +OPoW introduces a novel metric, imbalance, aimed at quantifying the degree to which a Benchmarker spreads their computational work between challenges unevenly. This is only possible when there are multiple proof-of-works. -The metric is defined as $imbalance = \frac{CV(\%qualifiers)^2}{N - 1}$ where `CV` is coefficient of variation, `%qualifiers` is the fraction of qualifiers found by a Benchmarker across challenges, and `N` is the number of active challenges. This metric ranges from `0 to 1`, where lower values signify less centralisation. +The metric is defined as $imbalance = \frac{CV(\bf{\%qualifiers})^2}{N-1}$ where CV is coefficient of variation, %qualifiers is the fraction of qualifiers found by a Benchmarker across challenges, and N is the number of active challenges. This metric ranges from 0 to 1, where lower values signify less centralisation. -Penalising imbalance is achieved through $imbalance\_penalty = 1 - \frac{1}{1 + k \cdot imbalance}$, where `k` is a multiplier (currently set to `1.5`). The penalty ranges from `0 to 1`, where zero signifies no penalty. +Penalising imbalance is achieved through $imbalance\textunderscore{ }penalty = 1 - exp(-k \cdot imbalance)$, where k is a coefficient (currently set to 1.5). The modifier ranges from 1 to 0, where 0 signifies no penalty. When block rewards are distributed pro-rata amongst Benchmarkers based on influence, where influence has imbalance penalty applied, the result is that Benchmarkers are incentivised to minimise their imbalance as to maximise their earnings: -$$weight = mean(\%qualifiers) \cdot (1 - imbalance\_penalty)$$ -$$influence = normalise(weights\ across\ benchmarkers)$$ +$$weight = mean(\bf{\%qualifiers}) \cdot (1 - imbalance\textunderscore{ }penalty)$$ +$$influence = \frac{\bf{weights}}{sum(\bf{weights})}$$ -Notes: +Where: +* $\bf{\%qualifiers}$ is particular to a Benchmarker, where elements correspond to the fraction of qualifiers found by a Benchmarker for a challenge +* $\bf{weights}$ is a set, where elements correspond to the weight for a particular Benchmarker -- A Benchmarker focusing solely on a single challenge will exhibit a maximum imbalance value of `1`. +Notes: -- Conversely, a Benchmarker with an equal fraction of qualifiers across all challenges will demonstrate a minimum imbalance value of `0`. +- A Benchmarker focusing solely on a single challenge will exhibit a maximum imbalance and therefore maximum penalty. +- Conversely, a Benchmarker with an equal fraction of qualifiers across all challenges will demonstrate a minimum imbalance value of 0. ## 5.2. Adoption -Any active solution can be assumed to already have undergone verification of the algorithm used. This allows the straightforward use of Benchmarkers' influence for calculating algorithm adoption: +Any active solution can be assumed to already have undergone verification of the algorithm used. This allows the straightforward use of Benchmarkers' influence for calculating an algorithm's weight: + +$$weight = sum(\bf{influences} \cdot \bf{algorithm\textunderscore{ }\%qualifiers})$$ + +Where: +* $\bf{influences}$ is a set, where elements correspond to the influence for a particular Benchmarker +* $\bf{algorithm\textunderscore{ }\%qualifiers}$ is a set, where elements correspond to the fraction of qualifiers found by a Benchmarker using a particular algorithm + +Then, for each challenge, adoption is calculated: + +$$adoption = \frac{\bf{weights}}{sum(\bf{weights})}$$ -$$weight = sum(influence \cdot \%qualifiers) \cdot (1 - imbalance\_penalty)$$ -$$adoption = normalise(weights\ across\ algorithms\ for\ a\ challenge)$$ +Where: +* $\bf{\%weights}$ is a set, where elements correspond to the weight for a particular algorithm -By integrating influence into the adoption calculation, TIG effectively guards against potential manipulation by Benchmarkers. \ No newline at end of file +By integrating influence into the adoption calculation, TIG effectively guards against potential manipulation by Benchmarkers. diff --git a/docs/tech/6_q_and_a.md b/docs/tech/6_q_and_a.md deleted file mode 100644 index b3a42524..00000000 --- a/docs/tech/6_q_and_a.md +++ /dev/null @@ -1 +0,0 @@ -placeholder \ No newline at end of file diff --git a/docs/tech/6_roadmap.md b/docs/tech/6_roadmap.md new file mode 100644 index 00000000..df62e909 --- /dev/null +++ b/docs/tech/6_roadmap.md @@ -0,0 +1,15 @@ + +# 6. Roadmap + +The technical roadmap for TIG in 2024 is as follows: + +| **Feature** | **Approximate Date** | +| --- | --- | +| New challenge (c004) | July | +| Locked Deposits (necessary for voting) | Aug | +| New challenge (c005) | Sep | +| Benchmarker Staking | Oct | +| Breakthrough Voting | Nov | +| New challenge (c006) | Dec | + +TIG intends to migrate to a L1 blockchain where OPoW is integrated with the consensus layer in 2025. This will leverage Polkadot’s substrate. (TIG is currently running in an off-chain execution & on-chain settlement configuration.) \ No newline at end of file