问题1:存储矿工接收用户订单,接收用户的文件,存放到本地扇区,第一个问题本地文件是否有文件加密?如果有文件加密,检索矿工如何查找到文件?
问题2:存放到矿工本地的文件是否有文件分片存储,如果没有文件分片,如何做文件的冗余备份,如何将大文件上传到矿工端做断点续传,秒传?比如用户端发往矿工端的时候,用户将文件分片,矿工接受后文件合并是不是这样呢?
参考:
https://docs.filecoin.io/go-filecoin-tutorial/Getting-Started.html#start-running-filecoin
https://filecoin-project.github.io/specs/#sector-in-storageminer-state-machine-both
Filecoin矿工文件存储的流程?
存储市场工作流程:
存储矿工提交报价单(ask)——>用户提交出价单(bid)——>链上撮合订单匹配——>支付&存储。
Step1:操作节点参与链上身份注册,提交抵押与存储容量,成为一个存储矿工
Step2:创建 Ask 订单,与用户节点交易。
Step3:先密封数据并提交复制证明(PoRep)于链上,更新订单状态,完成交易,并开启 PoSt 证明周期(证明期是矿工必须向网络提交空间时间证明的固定时间。)
Step4:存储矿工收集证明集合,创建 PoSt,计算 ProveStorage 和 StoragePower (算力)。
Step5:当矿工完成他们的 PoSt 时,调用 SubmitPoSt 将其提交给网络,并伴随区块更新同步状态。
复制证明(PoRep)的核心思想:确保证明矿工在他的节点上确实保存数据备份,证明者受到网络委托存储n个数据D的独立备份;当验证者向P提出挑战,P需要向验证证明的确存储存储了每一个D的备份,这是一次验证的过程。
filecoin里面运行.pramcache参数程序确保本地数据其实用于复制证明
Generate the proof parameters for proving/verification
/.paramcache
Miner.go
我们在链上成功注册一个新的矿工身份后,Filecoin 存储市场 Actor将调用 NewActor()方法为我们生成一个新的存储矿工新的状态NewState,这个newState包括下面矿工存储的方法:
// 矿工向存储市场发送订单的方法。
AddAsk(price TokenAmount, expiry uint64) AskID
GetAsk()//矿工获得订单
// 提交扇区的方法。
CommitSector(commD, commR, commRStar []byte, proof SealProof) SectorID
// 用于向链上提交时空证明的方法,证明矿工已实际存储了其声称的文件。
SubmitPoSt(p PoSt, faults []FailureSet, recovered SectorSet, doneSet SectorSet)
// 允许矿工为网络提供更多存储空间的方法
IncreasePledge(addspace Integer)
// 若缺乏复制证明证据,将用此方法惩罚矿工
SlashStorageFault()
1,生成成交订单后,双方签名提交到链上。接下来用户发送数据到存储矿工,存储矿工接收数据存储并且给出数据存储的证明(复制证明,porep)。
复制证明(还有POST)就是一种加密算法,有点特殊可验证时延加密算法,filecoin中是BLS12-381(一种新型的zk-SNARK椭圆曲线加密算法,属于bellman库),其实底层加密是是零知识证明的方法,跟一般的私钥和内容加密的模式不一样,指的是证明人能够在不向验证者提供任何有用的信息的情况下,使验证在某个概率下相信某个论断大概率正确。
filecoin的存储矿工的分片过程其实是:
客户的大文件在IPFS网络中只有唯一的哈希值,去中心化存储市场将这一笔存储订单按标准(合同存储大小/256KB)分拆成多份,接到订单的这些矿工们(矿工A)就像切蛋糕一样把客户的大文件分割封装,每个拿到相应部分副本的矿工提交复制证明给主链。
矿工将客户上传的原始数据进行封装,所谓封装,需要将一个完整的文件分割封装成若干个256KB的小文件副本。而且这些256KB的小文件副本,在分布存储在不同的硬盘中节点中,以保证数据永不丢失。
为啥需要引入sector?
sector是一个数据结构,用于存储和证明一个或多个数据分片。从原始数据构建副本的过程被成为封装seal,可理解此过程为分片。
在扇区密封操作(SEAL)过程中,其实是POREP复制证明初始化的过程,可验证时延函数初始化时间很长,验证和解密时间短。
官方反馈:
如果Filecoin没有加密保存到本地,那任何检索矿工都可以给客户下载文件就好解释了。
为什么多次提到了IPLD,这个跟文件加密保存有啥关联?
IPLD(InterPlanetary Linked Data)本身也作为通用数据结构来进行设计,也就是说它不仅仅限于IPFS使用。作为一种数据组织形式,它可以用于任何数据关系链接的场合,包括区块链,目录结构,大文件的分片存储等等。
IPLD定义了数据链接的格式,规范了协议之间的数据交换。也就是说,IPLD是为互操作协议而制定的数据模式,其表达的是数据之间的关系。为实现此目的,IPLD融合了密码学里的散列算法、默克尔树,有向无环图等技术,数据可以通过JSON和YAML等格式在协议交换中呈现。这些技术的采用使得IPLD所表达的数据结构具有以下几个特点:
分布式的数据存储 (适用于大规模的应用和去中心化的应用)
自验证的数据完整性 (任何的修改和破坏都很容易被发现)
基于内容寻址的哈希链接数据结构 (适合于区块链,有向无环图,目录结构等数据关系)
另外,IPLD的定义本身也考虑到了数据结构的演化,为日后的改进做了设计。
filecoin数据格式详细说明:
https://filecoinproject.slack.com/files/UEP35QQJJ/FPCCE1W8K/filecoin-pieces.compressed.pdf
ps:
1,https://github.com/Peergos/Peergos/blob/master/papers/wuala-cryptree.pdf
https://github.com/Peergos/Peergos
2,https://docs.textile.io
总结:
1,filecoin的矿工在存储文件的过程中用到了文件加密的过程,不是严格文件加密,但是跟传统的加密算法不一样,采用了零知识加密算法,因为矿工扇区密封后将数据文件分片打散个各种服务器节点中,服务器节点里面不需要通过私钥即可验证节点的数据,将文件进行复制证明和时空证明保证数据可信。
2,filecoin中文件有分片的操作,在扇区seal密封后,将文件切分到各种服务器节点中。但是不是在用户向矿工传输文件的过程中分片。