Файлы в цепочке (DFS)
В ZooBC есть два способа хранить файл. Файл DFS предназначен для небольшого содержимого: файл передаётся внутри собственной транзакции, а цепочка записывает его как строку набора данных владельца. Более крупные файлы идут в пул хранения, разрезанные на фрагменты, которые никогда не попадают в цепочку. Эта статья — о файлах DFS.
Запись и содержимое
Файл DFS владельца по пути — это строка набора данных (owner, owner, "dfs:" + path): сеттер и получатель — оба владелец, а свойство — dfs:, за которым следует путь. Значение строки — шестнадцатеричная форма записи метаданных:
- хеш SHA3-256 содержимого и его размер;
- права доступа (0644);
- две метки времени;
- число чанков и хеш каждого чанка.
Само содержимое передаётся в теле транзакции. Тело может занимать не более 65 536 байт, поэтому файл DFS вмещает примерно до 64 КиБ. Узлы хранят байты в локальной таблице чанков рядом с цепочкой; в состояние консенсуса они не входят. Строка в цепочке содержит хеши, поэтому любой может сверить с ней содержимое.
Пути
Путь начинается с / и имеет длину не более 1 024 байт. Он не может содержать //, .., байт NUL, возврат каретки или перевод строки. Завершающий / отбрасывается, поэтому /a/b/ и /a/b называют один и тот же файл. Записывать строки с префиксами dfs: или dfs:dir: могут только транзакции DFS; SetupAccountDataset с любым из этих префиксов отклоняется.
Создание, обновление, удаление
| Транзакция | Тип | Что делает |
|---|---|---|
| DFSCreateFile | 8 | создаёт файл по пути вместе с содержимым |
| DFSUpdateFile | 264 | заменяет содержимое по тому же пути |
| DFSDeleteFile | 520 | удаляет файл |
Создание поверх существующего файла, а также обновление или удаление отсутствующего файла — оплаченные пустые операции: комиссия взимается, и ничего не меняется. Поэтому приложению следует прочитать строку по пути, прежде чем выбирать между созданием и обновлением.
Аренда и возвраты
Строка DFS — такой же объект набора данных, как любой другой. У неё есть собственный адрес депозита (ZBS_…), который может пополнить любой, и каждый период она платит аренду наборов данных за свои байты — свойство плюс шестнадцатеричное значение: по начальной цене 0,05 ZBC за МиБ за период в mainnet. Аренда берётся из депозита, затем с владельца и зачисляется в пул долголетия. Если не может заплатить ни тот, ни другой, строка деактивируется, как и любой набор данных.
Удаление файла DFS возвращает каждому плательщику, включая владельца, его собственную неиспользованную часть депозита. Деньги расходуются по принципу «первым пришёл — первым ушёл»: самый старый платёж расходуется полностью, прежде чем затрагивается следующий, поэтому самые недавние плательщики получают обратно больше всего.
Файл DFS или хранимый файл?
| Файл DFS | Хранимый файл | |
|---|---|---|
| Размер | примерно до 64 КиБ | до 100 000 фрагментов по 1 МиБ |
| Содержимое | внутри транзакции | фрагменты на пяти узлах-хранителях, никогда в цепочке |
| В цепочке | одна строка под dfs: | манифест: корень, размеры и идентификаторы фрагментов |
| Изменения | обновление и удаление по тому же пути | у нового содержимого новый корень, поэтому это новый файл |
| Аренда идёт в | пул долголетия | пул хранения |
| Управление доступом | нет: содержимое находится в публичной транзакции | приватный флаг со списком допуска |
Ни один из способов не зависит от машин ZooBC Foundation или от компьютера того, кто загрузил файл.