mirror of
https://github.com/codex-storage/codex-research.git
synced 2025-01-10 02:36:09 +00:00
add in balasz's expanding window calculations document
This commit is contained in:
parent
6507191318
commit
aa7dcdb762
@ -85,6 +85,81 @@ $h := F(0.5)$, where $0 \lt h \lt 1$ and $h \neq 0.5$
|
|||||||
Changing the value of $h$ will [affect the curve of the rate of
|
Changing the value of $h$ will [affect the curve of the rate of
|
||||||
expansion](https://www.desmos.com/calculator/pjas1m1472) (interactive graph).
|
expansion](https://www.desmos.com/calculator/pjas1m1472) (interactive graph).
|
||||||
|
|
||||||
|
#### Eligible address calculations in-depth
|
||||||
|
|
||||||
|
The following is taken from https://hackmd.io/@bkomuves/BkDXRJ-fC, with only
|
||||||
|
slight variations to constrain size, reproduced with written
|
||||||
|
permission from the author.
|
||||||
|
|
||||||
|
##### Assumptions
|
||||||
|
|
||||||
|
We assume network address are randomly and more-or-less uniformly selected from
|
||||||
|
a space of $2^{256}$.
|
||||||
|
|
||||||
|
We also assume that the window can only change in discrete step, based on some
|
||||||
|
underlying blockchain's cadence (for example this would be approx every 12
|
||||||
|
seconds in case of Ethereum), and that we measure time based on timestamps
|
||||||
|
encoded in this blockchain blocks.
|
||||||
|
|
||||||
|
However with this assumption given, we want to be as granular and tunable as
|
||||||
|
possibly.
|
||||||
|
|
||||||
|
We have a time duration in which we want to go from a single network address to
|
||||||
|
the whole address-space.
|
||||||
|
|
||||||
|
To be able to make this work nicely, first I propose to define a linear time
|
||||||
|
function $t_i$ which goes from 0 to 1.
|
||||||
|
|
||||||
|
##### Implementation
|
||||||
|
|
||||||
|
At any desired block with timestamp $timestamp_i$ simply compute:
|
||||||
|
|
||||||
|
$$t_i := \frac{timestamp_i - start}{expiry - start}$$
|
||||||
|
|
||||||
|
Then to get a network range, you can plug in any kind of expansion function
|
||||||
|
$F(x)$ with $F(0)=0$ and $F(1)=1$; for example a parametric exponential:
|
||||||
|
|
||||||
|
$$ F_s(x) = \frac{\exp(sx) - 1}{\exp(s) - 1} $$
|
||||||
|
|
||||||
|
Remark: with this particular function, you probably want $s<0$ (resulting in
|
||||||
|
fast expansion initially, slowing down later). Here is a Mathematica one-liner
|
||||||
|
to play with it:
|
||||||
|
```
|
||||||
|
Manipulate[
|
||||||
|
Plot[ (Exp[s*x]-1)/(Exp[s]-1), {x,0,1}, PlotRange->Full ],
|
||||||
|
{s,-10,-1} ]
|
||||||
|
```
|
||||||
|
You can easily do the same with eg. the online [Desmos](https://www.desmos.com/calculator) tool.
|
||||||
|
|
||||||
|
##### Address window
|
||||||
|
|
||||||
|
Finally, an address $A$ becomes eligible at block $i$ if the Kademlia distance
|
||||||
|
from the "window center" $A_0$ is smaller than $2^{256}\times F(t_i)$:
|
||||||
|
|
||||||
|
$$ XOR(A,A_0) < 2^{256}\cdot F(t_i) $$
|
||||||
|
|
||||||
|
Note: since $t_i$ only becomes 1 exactly at expiry, to allow the whole network
|
||||||
|
to particite near the end, there should be a small positive $\delta > 0$ such
|
||||||
|
that $F(t)=1$ for $t>1-\delta$, leaving the last about $100\delta$ percentage of
|
||||||
|
the total slot fill window when the whole network is eligible to participate.
|
||||||
|
|
||||||
|
Alternatively, you could rescale $t_i$ to achieve the same effect: $$ t_i' :=
|
||||||
|
\min(\; t_i/(1-\delta)\;,\;1\;) $$ The latter is probably simpler because still
|
||||||
|
have complete freedom in selecting the expansion function $F(x)$.
|
||||||
|
|
||||||
|
##### Parametrizing the speed of expansion
|
||||||
|
|
||||||
|
While we could in theory have arbitrary expansions functions, we probably don't
|
||||||
|
want more than an one parameter family, that is, a single parameter to set the
|
||||||
|
curve. However, even if we have a single parameter, there could be any number of
|
||||||
|
different ways to map a number to the same family of curves.
|
||||||
|
|
||||||
|
In the above example $F_s(t)$, while $s$ is quite natural from a mathematical
|
||||||
|
perspective, it doesn't really have any meaning for the user. A possibly better
|
||||||
|
parametrization would be the value $h:=F_s(0.5)$, meaning "how big percentage of
|
||||||
|
network is allowed to participate at half-time". You can of course compute $s$
|
||||||
|
from $h$: $$ s = 2\log\left(\frac{1-h}{h}\right) $$
|
||||||
|
|
||||||
### Abandoned ideas
|
### Abandoned ideas
|
||||||
|
|
||||||
#### No reservation collateral
|
#### No reservation collateral
|
||||||
|
Loading…
x
Reference in New Issue
Block a user