{"content":{"title":"Filecoin 封装流程（sealing）","body":"# sealing主要流程\r\n\r\nFilecoin 的sealing主要分为以下4个步骤：\r\n1. Precommit 1\r\n > 这一步骤主要生一个G的node节点（32byte），可以当作一个“加密”Key对piecefile（原数据）做labeling encoding。labeling encoding算法可以看成第11层的各个node和piecefile的各个node，相同index的进行“加法”，从而得出replica（sealedfile）。\r\n > \r\n > 第一层的数据主要是根据replica_id（sectorid，minerid，随机数ticket等等）一些公共参数hash计算得出。\r\n > \r\n > 为了保证没有人可以并行，或者机器很好，能极快算出来11层数据。所采用的办法是每个node的计算都需要利用到前面的6node和上层的8个node。类似于如下算法：node = hash(exp(6),  parent(8))。\r\n > \r\n > 当然了，到底选择哪些exp（6）和parent（8)，是算法决定的，有规律的，不能完全随机。\r\n > \r\n > 所以p1阶段是CPU密集型的。\r\n > 这个还需要计算原数据的默克尔叔计算（tree_d）\r\n > \r\n\r\n2. Precommit 2\r\n> p2是tree_c的。也就是11层竖向node进行hash后，根据得到的hash然后在进行的默克尔树。这里明显可以并行。所以是GPU密集型的。\r\n> 对replica做默克尔叔计算，即：tree_r。为了以后验证方便，会缓存默克尔的最上面几层的（因为最上层数据量少，且经常使用）。\r\n> 做完后需要发送preCommit消息上链。因为每个sector都发送消息的话，费用比较高，所以支持对preCommit消息进行聚合签名，然后上链。\r\n> \r\n3. commit 1\r\n> 这边主要是等到一个seed(150epoch后的vrf随机数)，然后根据随机数抽出144个node，算出他们的默克尔路径。为什么抽取144个节点的路径，是因为全部node的路径生成的零知识证明的电路太大了。\r\n> \r\n7. commit 2\r\n> 对c1得到路径，p1的步骤等计算零知识证明压缩，然后发送provcommit消息上链。因为每个sector都发送消息的话，费用比较高，所以支持对provcommit消息进行聚合签名，然后上链。\r\n\r\n# snapdeal\r\n1. 不需要重新计算p1，就是在p2开始进行snapdeal。"},"author":{"user":"https://learnblockchain.cn/people/808","address":null},"history":"QmNh9KupTRDUQkWtMWoa3b7EkM8rFJxo4EziJSRWXcS7Rt","timestamp":1686724227,"version":1}