链上文件(DFS)
ZooBC 有两种保存文件的方式。DFS 文件用于小内容:文件随它自己的交易一起传送,链把它记录为其所有者的一行数据集记录。更大的文件进入去中心化存储池,被切成永远不上链的分片。本文介绍 DFS 文件。
记录与内容
某个所有者在某个路径下的 DFS 文件,就是数据集行 (owner, owner, "dfs:" + path):设置者和接收账户都是该所有者,属性是 dfs: 后接路径。该行的值是一条元数据记录的十六进制形式:
- 内容的 SHA3-256 哈希及其大小;
- 权限(0644);
- 两个时间戳;
- 分块数量以及每个分块的哈希。
内容本身随交易体一起传送。交易体最多 65,536 字节,因此一个 DFS 文件最多容纳约 64 KiB。节点把这些字节保存在链旁的本地分块表中;它们不属于共识状态。链上的行保存着哈希,因此任何人都可以据此核对内容。
路径
路径以 / 开头,最长 1,024 字节。它不能包含 //、..、NUL 字节、回车符或换行符。末尾的 / 会被去掉,因此 /a/b/ 和 /a/b 指的是同一个文件。只有 DFS 交易可以在 dfs: 或 dfs:dir: 下写入行;带有这两个前缀之一的 SetupAccountDataset 会被拒绝。
创建、更新、删除
| 交易 | 类型 | 作用 |
|---|---|---|
| DFSCreateFile | 8 | 在某个路径下创建文件,连同其内容 |
| DFSUpdateFile | 264 | 替换同一路径下的内容 |
| DFSDeleteFile | 520 | 删除文件 |
对已存在的文件执行创建,或对不存在的文件执行更新或删除,都是付费空操作:手续费照收,什么都不改变。因此,应用在决定创建还是更新之前,应该先读取该路径的行。
租金与退款
DFS 行和其他任何数据对象一样。它有自己的押金地址(ZBS_…),任何人都可以为其注资;它每个周期按自己的字节数(属性加上十六进制值)支付数据集租金:在 mainnet 上,按起始价格为每个周期每 MiB 0.05 ZBC。租金先从押金中扣取,再从所有者处扣取,并记入长效池。如果两者都无法支付,该行就会被停用,与任何数据集一样。
删除 DFS 文件时,每个付款者(包括所有者)都会取回押金中属于自己的未使用部分。资金按先进先出的顺序消耗:最早的一笔付款用完之后才会动用下一笔,因此最近的付款者取回的最多。
DFS 文件还是存储文件?
| DFS 文件 | 存储文件 | |
|---|---|---|
| 大小 | 最大约 64 KiB | 最多 100,000 个 1 MiB 的分片 |
| 内容 | 在交易之内 | 分片存放在五个持有者节点上,从不上链 |
| 链上 | dfs: 下的一行 | 清单:根、大小和分片 id |
| 变更 | 在同一路径下更新和删除 | 新内容有新的根,因此是一个新文件 |
| 租金去向 | 长效池 | 存储池 |
| 访问控制 | 无:内容位于一笔公开的交易中 | 带允许列表的私密标记 |
两种方式都不依赖 ZooBC Foundation 的机器,也不依赖上传者的电脑。