首页>>资讯>>产业

Proof Of Space算法解析

2024-09-12 10:25:30 195

1. Table 格式


会生成7个table,每个table包含2^K个entry,现在K取值20,所以每个table有1M个entry;每个entry的格式如下:


pub(super) enum Table<const K: u8, const TABLE_NUMBER: u8>

where

    EvaluatableUsize<{ metadata_size_bytes(K, TABLE_NUMBER) }>: Sized,

{

    /// First table with contents of entries split into separate vectors for more efficient access

    First {

        /// Derived values computed from `x`

        ys: Vec<Y>,

        /// X values

        xs: Vec<X>,

    },

    /// Other tables

    Other {

        /// Derived values computed from previous table

        ys: Vec<Y>,

        /// Left and right entry positions in a previous table encoded into bits

        positions: Vec<[Position; 2]>,

        /// Metadata corresponding to each entry

        metadatas: Vec<Metadata<K, TABLE_NUMBER>>,

    },

}


Y,X是u32类型,Position也是u32类型,Metadata根据是第几个table而不同;7个table一共404M大小;


2. Table生成算法


Generate(k, seed) → pos_tables


table1的产生算法如下:


根据ChaCha算法和Seed通过ChaCha8(seed, 0)方法产生一个伪随机数发生器,从而产生2^K个X值;然后根据f1(X)算法产生对应的Y值;


table2产生的算法大体思路如下:


根据下面的f2算法得到Y值,其实就是hash值,选择的Xi和Xj需要满足M算法(算法比较复杂);Xi和Xj值上面一个的table1的X值,其中的i和j就是entry里面的Position;

25.png

table3产生的算法大体思路如下:


f3(l=(xi,xj),r=(xk,xl))=Hash(l∣∣r)f3(l=(xi,xj),r=(xk,xl))=Hash(l∣∣r) if and only if M(f2(xi,xj),f2(xk,xl))==TrueM(f2(xi,xj),f2(xk,xl))==True

Xi,Xj,Xk,Xl的值是也来自于Table1,其实是通过Table2的两个Entry获取的Table1的4个X值;l,r值是Table2的索引,即position;


第4,第5,到第7个Table的算法和上面一样,每次entry.Y值都是根据上一个table的两个值计算得出;


可以简单的认为整个生成算法就是首先根据一个Seed产生1M(1048576个)数据量的伪随机值X,然后根据把X作为输入参数,根据f1算法生成同样数量的Y值,第一个Table就生成了;

然后后面每一个Table都要找到符合M算法要求的,上一个Table的,两个Entry。然后再根据f2,f3,f4,f5,f6,f7的算法计算当下Table的Entry数;


3. Proof of Space生成算法


Find_Proof(pos_table, challenge) → proof_of_space

找proof其实就是找64个table1的entry;


为了找到证据,我们必须查看表Table7是否有一个或多个条目entry.y值,其中前k位与challenge的前k位匹配(其实就是是否相等)。 最后一个表Table7中的每个满足的条目都指向表Table6中的 2 个条目。这两个条目将指向表Table5中的 2 个条目,依此类推,直到Table1。因此最后一个表中的条目将间接指向第一个表中的 64 个条目 。这 64 个entry.x串联起来就是空间证明,


4. Verify 算法


Is_Proof_Valid(space_k, seed, challenge, proof_of_space) → bool


为了验证空间证明,我们需要 4 个东西: proof_of_space中的 64 个 x 值、参数k 、种子和challenge_index 。该过程或多或少与表生成相同,即我们计算相同的函数,但不生成整个表,仅生成一个很小的子集。仅计算证明的 x 值的输出才能验证:


输出f1..f7满足每一步的匹配函数M,


Table7的最终输出entry.y对应于challenge_index(判断是否相等) 。


总结


和filecoin一样,都是计算多个table(filecoin叫做layer),后面一个table的计算必须要依赖前一个table,从而保证了无法并行化计算;


计算慢,而验证快的逻辑和arweave一样,都是因为计算的时候是7个整表数据都需要计算出来,而验证则是只验证其中的一部分(重新计算其中的一部分)。

声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!