pub struct Column<H: Hasher> {
单个EncodingProof的长度计较公式为:
单个LabelingProof的长度计较公式为:
从上次AMA,Filecoin团队就引入了Snark as a Service的想法。可以说,在整个Filecoin的生态中引入新的脚色,专门提供零常识证明的生成处事。一般的矿工,可以将零常识证明的计较外包给这个处事。Filecoin团队也对外开放这种处事的提案。
pub struct ReplicaColumnProof<H: Hasher> {6. Proof巨细计较
}
单个列的证明数据信息用ColumnProof布局暗示,详细界说在storage-proofs/src/porep/stacked/vanilla/column_proof.rs的ColumnProof布局。
replica_column_proofs = 15*(356+2344) = 40500
个中,root和leaf是32bytes。Path由一个tuple的Vec实现。每个tuple,指定了兄弟节点的信息以及兄弟节点的位置(左边照旧右边)。对付二叉树来说,tuple由一个兄弟节点以及位置构成。对付八叉树来说,tuple由7个兄弟节点以及位置构成。MerkleProof布局中的U代表Merkle树的叉数,U2代表二叉树,U8代表8叉树。
path: Vec<(Vec<H::Domain>, usize)>,
留意,在Proof中的labeling_proofs会包括每一层的LabelingProof证明信息。
以32G的Sector为例,统计所有证明需要的数据,,包罗:9 partitions,11 layers,16 challenges。也就是说,整个证明需要的数据包罗9*16 = 144个Proof。
}
LabelingProof用来暗示一个节点举办Labeling计较证明需要的信息,详细界说在storage-proofs/src/porep/stacked/vanilla/labeling_proof.rs中的LabelingProof布局中。
3.1 Column
Snark as a Service,最根基的工作是弄清楚矿工需要传输给处事的数据量。本文具体阐明一下数据量的巨细。本文中涉及到一些专业的术语,labeling/column hash/encoding等等。
EncodingProof是SDR计较的最后一层数据和原始数据Encoding的证明所需数据。详细的界说在storage-proofs/src/porep/stacked/vanilla/encoding_proof.rs的EncodingProof布局。
ColumnProof = Column + MerkleProof
pub struct ColumnProof<H: Hasher> {
pub(crate) inclusion_proof: MerkleProof<H, typenum::U8>,
pub(crate) node: u64,
我们Trapdoor Tech团队,对这种处事较量感乐趣。零常识证明的计较涉及到电路的生成,FFT以及Multiexp的计较。在今朝官方版本的基本上,可以有2.5倍~3倍的机能晋升。
每一列的信息用Column布局暗示:
pub drg_parents: Vec<ColumnProof<H>>,
}
所以,ReplicaColumnProof巨细的计较如下:
总共的数据为:144*58292 = 8394048 = 8M。
pub(crate) parents: Vec<H::Domain>,
Snark as a Service是个较量有意思的处事,在Filecoin生态中专门提供零常识证明的计较处事。在Sector巨细为32G的环境下,证明需要的数据量在8M阁下。
个中c_x是某个challenge的节点位置的列信息,drg_parents是该challenge节点的base依赖的节点相应的列信息,exp_parents是该challenge节点的exp依赖的节点相应的列信息。
pub struct MerkleProof<H: Hasher, U: typenum::Unsigned> {
可以看出,整个Proof由2个MerkleProof,1个ReplicaColumnProof, 1个LabelingProof的HashMap和1个EncodingProof构成。在整个PoREP的计较中,用到两种Hash函数:Poseidon和Sha256。这两种的Hash函数的Domain的巨细都是256bit,也就是32个字节。
pub struct LabelingProof<H: Hasher> {
2. MerkleProof
个中index代表列的编号,rows代表某列的详细的每一行的信息。
Vanilla Proof是PoREP证明所需数据的布局。详细的界说在storage-proofs/src/porep/stacked/vanilla/params.rs的Proof布局。
3. ReplicaColumnProof
comm_r_last_proof = 32 * 2 + 10 * (32*7 + 4)= 2344
}
}
pub root: H::Domain,
LabelingProof = 32 * 37 + 8 = 1192
EncodingProof = 32 * 37 + 8 = 1192
pub replica_column_proofs: ReplicaColumnProof<H>,
leaf: H::Domain,
个中的node就是节点编号,parents就是该节点依赖的base和exp的依赖节点信息。在实际Labeling计较中,parents的信息会被计较多次,所以LabelingProof中的Parents也会从14个节点信息扩展为37个节点信息(base和exp依赖节点的信息复制)。
pub struct Proof<H: Hasher, G: Hasher> {
Proof = 1144 + 2344 + 40500 + 13112 + 1192 = 58292
encoding_proof = 1192
pub(crate) column: Column<H>,
pub exp_parents: Vec<ColumnProof<H>>,
pub(crate) parents: Vec<H::Domain>,
pub struct EncodingProof<H: Hasher> {
pub(crate) node: u64,
pub comm_r_last_proof: MerkleProof<H, typenum::U8>,
PoREP的SDR的计较成为Labeling。所谓的Labeling,就是按照base和exp的依赖节点信息计较出新的节点信息。
MerkleProof包罗了叶子节点在一个Merkle树上的证明所需要的数据,包罗叶子节点(leaf),路径(path)和树根(root)。详细的界说在storage-proofs/src/merkle.rs的MerkleProof的布局。
和LabelingProof雷同,需要证明Encoding的计较功效正确,需要节点依赖的所有节点信息。
pub comm_d_proofs: MerkleProof<G, typenum::U2>,
comm_d_proof = 32 * 2 + 30 * (32 + 4)= 1144
}
1. Overview
pub(crate) rows: Vec<H::Domain>,
Filecoin又延期了,其实也在预料之中。看代码的小同伴大概会发明,此刻lotus以及rust-fil-proof项目天天还在大量的更新代码。大型的项目开拓,在上线之前城市code freeze,举办一按时间的压测,没有严重bug的环境下,就可以上线。今朝看项目照旧在开拓阶段,没有code freeze的意味。
4. LabelingProoflabeling_proofs = 11*1192 = 13112
所有证明所有的列的数据整合在ReplicaColumnProof布局中。详细的界说在storage-proofs/src/porep/stacked/vanilla/params.rs中的ReplicaColumnProof布局。
ReplicaColumnProof = (1+6+8)*ColumnProof
也就是说,一个MerkleProof的巨细可由如下公式计较:
3.2 ColumnProof
总结:
pub encoding_proof: EncodingProof<H>,
}
Vanilla Proof是整个数据量对应的数据布局,就从这个布局阐明开始。
pub(crate) index: u32,
Column = 4 + 32*11 = 356
PoREP中的SDR算法,需要对原始数据计较11层。假如Sector为32G,每一层都是分成了1^30个节点。同样节点位置的所有层的数据,构成一个Column,也就是一列。
pub c_x: ColumnProof<H>,
5. EncodingProof
pub labeling_proofs: HashMap<usize, LabelingProof<H>>,
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。