上传
用户创建桶;
User上传文件,数据块存放在本地,数据块的任务信息发送到Order系统中; Order系统将数据块任务分发给不同的Provider,可以分发的话dispatch设置为1;
根据dispatch的情况,Order系统为Provider生成订单,将数据块从User上发送到Provider上,数据块的元数据信息记录在订单中;发送成功后,sent设置为1;
一段时间后,User将订单发送给数据链,发送成功则将数据块从本地删除;数据链对该订单信息 达成共识后,confirm设置为1;
订单中任务完成后,User将订单的支付信息(比如数据存储时长、大小、价格)发送到结算链 上,将支付的memo锁在合约中;
用户上传文件后,执行mefs-user lfs headObject --bn bucketName --on fileName 命令,可以查看文件上传的详细信息。如图:
其中,state状态栏中的total表示该文件共被分为275个segment,当后面的dispatch、sent、confirm 值都与total相同时,表示文件上传真正意义上的结束。
下载
用户指定桶名和文件名以及要下载到的本地路径;
User从本地获取bucket信息和object信息;
Order系统根据segmentID首先尝试从本地内存cache、本地data目录获取;
获取不到,Order系统则从User本地meta目录下获取segment的存放位置(pID);
User签名读取支票、存入本地,Order系统根据segmentID和签名向pID节点发送请求,获取对应的segment信息,并存入本地内存cache中;
如果下载成功的segment量大于等于dataCount量,则下载成功,否则下载失败;
挑战Provider
Provider根据订单中的元数据信息进行挑战应答(每个挑战周期一次),应答信息发送到数据链上Keeper会根据挑战的应答信息计算Provider的存储收入,并签名。
Provider获取到收入信息,以及相应的Keeper签名从结算链上获得存储收入。
Provider如果不能响应挑战,则不会有该挑战周期内的存储收入签名,那么就不能得到该时期内的存储 收入。
关于纠删码的存储策略,比如12+8,系统将会匹配响应率和稳定性更高的Provider,以此保证不超过8个Provider数据的丢失或离线,让User可以随时进行数据下载。