<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.3 20210610//EN" "JATS-journalpublishing1-3-mathml3.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ali="http://www.niso.org/schemas/ali/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="1.3" xml:lang="EN">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Blockchain</journal-id>
<journal-title-group>
<journal-title>Frontiers in Blockchain</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Blockchain</abbrev-journal-title>
</journal-title-group>
<issn pub-type="epub">2624-7852</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">1630839</article-id>
<article-id pub-id-type="doi">10.3389/fbloc.2025.1630839</article-id>
<article-version article-version-type="Corrected Version of Record" vocab="NISO-RP-8-2008"/>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Original Research</subject>
</subj-group>
</article-categories>
<title-group>
<article-title>A scaling distributed access control model for blockchain-based file storage systems</article-title>
<alt-title alt-title-type="left-running-head">Hammoud and Tarkhanov</alt-title>
<alt-title alt-title-type="right-running-head">
<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.3389/fbloc.2025.1630839">10.3389/fbloc.2025.1630839</ext-link>
</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname>Hammoud</surname>
<given-names>Obadah</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/3071322"/>
<role vocab="credit" vocab-identifier="https://credit.niso.org/" vocab-term="validation" vocab-term-identifier="https://credit.niso.org/contributor-roles/validation/">Validation</role>
<role vocab="credit" vocab-identifier="https://credit.niso.org/" vocab-term="conceptualization" vocab-term-identifier="https://credit.niso.org/contributor-roles/conceptualization/">Conceptualization</role>
<role vocab="credit" vocab-identifier="https://credit.niso.org/" vocab-term="Writing &#x2013; original draft" vocab-term-identifier="https://credit.niso.org/contributor-roles/writing-original-draft/">Writing &#x2013; original draft</role>
<role vocab="credit" vocab-identifier="https://credit.niso.org/" vocab-term="visualization" vocab-term-identifier="https://credit.niso.org/contributor-roles/visualization/">Visualization</role>
<role vocab="credit" vocab-identifier="https://credit.niso.org/" vocab-term="software" vocab-term-identifier="https://credit.niso.org/contributor-roles/software/">Software</role>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Tarkhanov</surname>
<given-names>Ivan A.</given-names>
</name>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<xref ref-type="aff" rid="aff3">
<sup>3</sup>
</xref>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/3063934"/>
<role vocab="credit" vocab-identifier="https://credit.niso.org/" vocab-term="supervision" vocab-term-identifier="https://credit.niso.org/contributor-roles/supervision/">Supervision</role>
<role vocab="credit" vocab-identifier="https://credit.niso.org/" vocab-term="Writing &#x2013; review &amp; editing" vocab-term-identifier="https://credit.niso.org/contributor-roles/writing-review-editing/">Writing &#x2013; review &amp; editing</role>
<role vocab="credit" vocab-identifier="https://credit.niso.org/" vocab-term="conceptualization" vocab-term-identifier="https://credit.niso.org/contributor-roles/conceptualization/">Conceptualization</role>
</contrib>
</contrib-group>
<aff id="aff1">
<label>1</label>
<institution>Engineering Cybernetics Department, Institute of Computer Science, National University of Science and Technology (MISIS)</institution>, <city>Moscow</city>, <country country="RU">Russia</country>
</aff>
<aff id="aff2">
<label>2</label>
<institution>Department No. 9, Mathematical Support of Computer Technology, Federal Research Center, Informatics and Control, Russian Academy of Sciences</institution>, <city>Moscow</city>, <country country="RU">Russia</country>
</aff>
<aff id="aff3">
<label>3</label>
<institution>Scientific Research Department, State Academic University for Humanities</institution>, <city>Moscow</city>, <country country="RU">Russia</country>
</aff>
<author-notes>
<corresp id="c001">
<label>&#x2a;</label>Correspondence: Ivan A. Tarkhanov, <email xlink:href="tarkhanov@isa.ru">tarkhanov@isa.ru</email>
</corresp>
</author-notes>
<pub-date publication-format="electronic" date-type="pub" iso-8601-date="2025-07-23">
<day>23</day>
<month>07</month>
<year>2025</year>
</pub-date>
<pub-date publication-format="electronic" date-type="corrected" iso-8601-date="2026-03-19">
<day>19</day>
<month>03</month>
<year>2026</year>
</pub-date>
<pub-date publication-format="electronic" date-type="collection">
<year>2025</year>
</pub-date>
<volume>8</volume>
<elocation-id>1630839</elocation-id>
<history>
<date date-type="received">
<day>18</day>
<month>05</month>
<year>2025</year>
</date>
<date date-type="accepted">
<day>10</day>
<month>07</month>
<year>2025</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2025 Hammoud and Tarkhanov.</copyright-statement>
<copyright-year>2025</copyright-year>
<copyright-holder>Hammoud and Tarkhanov</copyright-holder>
<license>
<ali:license_ref start_date="2025-07-23">https://creativecommons.org/licenses/by/4.0/</ali:license_ref>
<license-p>This is an open-access article distributed under the terms of the <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution License (CC BY)</ext-link>. The use, distribution or reproduction in other forums is permitted, provided the original author(s) and the copyright owner(s) are credited and that the original publication in this journal is cited, in accordance with accepted academic practice. No use, distribution or reproduction is permitted which does not comply with these terms.</license-p>
</license>
</permissions>
<abstract>
<p>Blockchain is considered as one of the popular solutions for decentralized data storage which offers high availability and data immutability due to the use of a specific structure for storing transaction blocks in combination with consensus algorithms. However, the nature of blockchain makes it not suitable for storing big amounts of data, like access control matrices which are typically used by DAC. This research proposes a new access control model based on DAC and RBAC models that is capable of managing access of various users, by storing minimal data in blockchain, and full data off-chain with the help of Merkle trees. A new model was proposed, which allows compressing access control data off-chain, and storing only Merkle root hash on-chain. The article describes DecStore - blockchain-based file storage system and how access control model can be scaled to more than 1,000 users and 1,000 storage objects using a caching mechanism on the users&#x2019; side. Experiments were conducted to verify the scaling of the proposed model. Based on the obtained result, it was concluded that the proposed model is applicable to a wide range of systems, including IoT. This model is one of the first to solve the problem of storing large-dimensional DAC RBAC data.</p>
</abstract>
<kwd-group>
<kwd>access control</kwd>
<kwd>blockchain</kwd>
<kwd>Merkle tree</kwd>
<kwd>decentralized system</kwd>
<kwd>file storage system</kwd>
</kwd-group>
<funding-group>
<funding-statement>The author(s) declare that no financial support was received for the research and/or publication of this article.</funding-statement>
</funding-group>
<counts>
<fig-count count="10"/>
<table-count count="5"/>
<equation-count count="7"/>
<ref-count count="28"/>
<page-count count="00"/>
</counts>
<custom-meta-group>
<custom-meta>
<meta-name>section-in-acceptance</meta-name>
<meta-value>Blockchain Security and Privacy</meta-value>
</custom-meta>
</custom-meta-group>
</article-meta>
</front>
<body>
<sec id="s1" sec-type="intro">
<label>1</label>
<title>Introduction</title>
<p>Access control management is considered an essential component in various systems. Whether it is a file storage system, a social media website or any other system which provides access to its private resources, it is required to manage how different parties can access these resources. Many blockchain-based systems are not dedicated for managing access control, but use access control as a required functionality within the system, such as (<xref ref-type="bibr" rid="B9">Dong et al., 2020</xref>), where the author presents a blockchain-based model for banking, and one of the used smart contracts is called &#x201c;Controller Contract,&#x201d; which handles access control, in addition to other control-related tasks. According to (<xref ref-type="bibr" rid="B4">Butincu and Alexandrescu, 2024</xref>), web3 will reshape the concept of users identity by making it decentralized. Thus, it is clear that having decentralized access control is required.</p>
<p>Access control can be classified into the following main types (<xref ref-type="bibr" rid="B20">Mudarri et al., 2015</xref>):<list list-type="alpha-upper">
<list-item>
<p>Mandatory access control (MAC): It is a type of access control that has levels of confidentiality. An example is when resources are classified as {common, secret, top secret}. Thus, users can access resources based on the security level they are granted.</p>
</list-item>
<list-item>
<p>Discretionary access control (DAC): in this type of access control, the owner or the creator of the resource defines who is allowed to access it. Usually, DAC uses a matrix access model (<xref ref-type="bibr" rid="B3">Benantar, 2006</xref>), which is a table that describes privileges in a subject (for example: user) versus object (for example: resource) style. In social media networks like <xref ref-type="bibr" rid="B10">Facebook (2023)</xref>, a user can limit people who can access and see the content of his profile or specific posts, which is considered as an example of DAC.</p>
</list-item>
<list-item>
<p>Role-based access control (RBAC): In this type of access control, users have different roles, and resources are accessed based on the role they have. For example, in e-commercial websites, some pages are limited to administrators, other pages can be accessed by managers and administrators, etc.</p>
</list-item>
<list-item>
<p>Rule-based access control (RuBAC): This type of access control defines the rules by which resources can be accessed, which can be various. As an example, some banks might put a condition that currencies cannot be exchanged at night. Rule-based access control is usually used in combination with Role-based access control (<xref ref-type="bibr" rid="B11">Gupta et al., 2014</xref>).</p>
</list-item>
<list-item>
<p>Attribute-based access control (ABAC): It manages access by assigning policies for different attributes of users, resources and environment (<xref ref-type="bibr" rid="B26">Tarkhanov, 2016</xref>).</p>
</list-item>
</list>
</p>
<p>It is important to note that in modern systems a combination of different types of access control models is usually used. Corporate and government systems store millions of objects, including financial, social media data, and IoT data. They need flexible and reliable access control methods.</p>
<p>The usage of DAC can be sometimes unavoidable because it might offer more control over data than other systems. For example, sometimes it is required to provide a specific user access to a specific resource, without giving permission to other users with the same role or set of attributes. The problem is that DAC can result in a big matrix of resources against users. In storage files systems, if there are 1 million files in total, and 1,000 users, we will end up with a billion entries, which might be problematic when considering distributed systems with huge data redundancy like blockchain. When considering RBAC, less data is required to be stored, as a single policy can cover many files. However, the resulting data size might be still big, and unsuitable for blockchain storage. The aim of this research is the development of a distributed DAC&#x2b;RBAC access control model that solves the problem of scaling for blockchain-based systems without centralized components and minimizes the size of the access rights storage in the blockchain.</p>
</sec>
<sec id="s2">
<label>2</label>
<title>Study case for proposed model</title>
<p>We will consider DecStore as a study case which is described in detail in a series of articles (<xref ref-type="bibr" rid="B12">Hammoud and Tarkhanov, 2022</xref>; <xref ref-type="bibr" rid="B13">Hammoud et al., 2021</xref>). DecStore is a decentralized storage system, which uses blockchain (Hyperledger Fabric (<xref ref-type="bibr" rid="B15">HYPERLEDGER, 2019</xref>)) to manage files, users and storage nodes. In this system, files and folders are distributed across virtual disks (VDs) of a fixed size using several algorithms. DecStore can be used by government and financial organizations to provide secure and reliable exchange of confidential files between organizations or within a large holding company. This system uses virtual clusters (VCs). Each VC contains 3 VDs, located on different storage nodes. The first VD in any VC contains blocks of files which hold the content of the first halves of files. The second VD holds blocks which contain the second halves. The last VD contains blocks which contain the according Erasure coding (<xref ref-type="bibr" rid="B2">Balaji et al., 2018</xref>) of the halves stored in the previous two-halves. Any storage node can hold many VDs which are not located in the same VC. <xref ref-type="fig" rid="F1">Figure 1</xref> shows the architecture of the proposed system. Described below access control model can be applied in any distributed blockchain-based system.</p>
<fig id="F1" position="float">
<label>FIGURE 1</label>
<caption>
<p>Data storage architecture in DecStore.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g001.tif">
<alt-text content-type="machine-generated">Diagram showing five nodes, each containing stacked blocks labeled with virtual data (VD) and parity (P) or error correction (EC) codes. Arrows indicate data configuration VC6, combining VD6-P1, VD6-P2, and VD6-EC. Nodes interact with a blockchain and user, depicted with arrows connecting an icon of linked blocks to a user icon.</alt-text>
</graphic>
</fig>
<p>It is important to note that the proposed access control model is not proposed to be used with DecStore only. VDs can be expressed in other systems by docker volumes, virtual disks (VHD of virtual machines), folders, etc.</p>
</sec>
<sec id="s3">
<label>3</label>
<title>Related works</title>
<p>There are many studies that discuss applying access control in blockchain. Most of these studies focus on how to implement access control using blockchain for a specific field, especially IoT (<xref ref-type="bibr" rid="B6">Cheng et al., 2022</xref>; <xref ref-type="bibr" rid="B28">Zhang et al., 2019</xref>). <xref ref-type="bibr" rid="B6">Cheng et al. (2022)</xref> suggested deploying policy decision points (PDP) on blockchain, and storing policy administration points (PAP) off-chain to reduce the load size on blockchain. However, this study does not discuss how off-chain data can be stored and how it is replicated or located to prevent data loss in case of storage server loss. So, access control rules are basically centralized (off-chain resource) and are accessed by a decentralized system (blockchain), which is not a real decentralized system. Also, based on the solution they offer, when requests are sent to the blockchain, a request is forwarded to off-chain resources for every single request, which might not be effective in large-scale systems.</p>
<p>
<xref ref-type="bibr" rid="B17">Maesa et al. (2017)</xref> proposed a hybrid framework that can store policies right in blockchain or link to it. This framework rewrites policies to minimize redundancies and stores a compressed version of it in blockchain. This solution can work well with ABAC access systems, but it does not fit DAC systems, as these policies are based on users, and policy files can be large.</p>
<p>
<xref ref-type="bibr" rid="B22">Paillisse et al. (2019)</xref> proposed a distributed system that depends on blockchain to store policies. In their paper, they suggested that administrators can control operations using a CLI based on a Group-Based Policy. However, they suggest storing all policies on the blockchain, which is not feasible when considering DAC.</p>
<p>
<xref ref-type="bibr" rid="B27">Wang et al. (2018)</xref> proposed a model that enables storing data on IPFS, while the access control is managed using smart contracts. When it is required to grant a user access to a data object, the data owner adds his address to the list of people who are allowed to access this file. This method does not consider the possibility of determining the type of access, whether it is read or read/write. Also, such a model does not decrease the required data storage on blockchain, as it still stores the full matrix of access control of users.</p>
<p>
<xref ref-type="bibr" rid="B24">Sun et al. (2021)</xref> proposed a system based on Hyperledger Fabric, which is dedicated for IoT applications, where the edge devices are considered as Policy Enforcement Point, and get the information from the blockchain ledger. Access control attributes and policies are stored on the ledger, which means that the problem of minimizing the size of stored data on blockchain is not considered.</p>
<p>
<xref ref-type="bibr" rid="B14">Han et al. (2025)</xref> proposed a blockchain-based access control model, that uses Elliptic-curve cryptography for the encryption of data, where data gets encrypted and stored on the blockchain ledger. The method is mainly used for attribute-based access control, and the rules of access control are represented by a tree of AND and OR rules. This method was proposed for controlling requests from drones for accessing data. It is clear that storing the encrypted data on the blockchain does not minimize the data size on the blockchain ledger.</p>
<p>
<xref ref-type="bibr" rid="B7">Dai et al. (2024)</xref> managed to define the rules for controlling the access of users to hazardous materials using smart contracts. The method can be summarized by adding the hash of the user to the list of hashes of users allowed to access the material, which means that the method does not reduce the size of data on the blockchain.</p>
<p>Another solution (<xref ref-type="bibr" rid="B8">De Oliveira et al., 2022</xref>) suggests storing the required resources off-chain while maintaining the verification on blockchain. According to this solution, several smart contracts can be deployed: Policies Enforcement Smart Contract (PEPSC), Policies Decision Smart Contract (PDPSC), Policies Smart Contract (PAPSC) and Policies Information Smart Contract (PIPSC). Policies are stored using XACML model (<xref ref-type="bibr" rid="B18">Masi et al., 2012</xref>). This method works well for ABAC, but storing the rules on blockchain in the case of DAC is not recommended for the reasons mentioned above.</p>
<p>One interesting method for decentralized access is using zero-knowledge proofs (e.g., zk-SNARKs) (<xref ref-type="bibr" rid="B5">Chen et al., 2022</xref>). This method allows users to send proof of identity to the verification entity instead of sending the real identity. However, this method has a limitation, which is that the rules for all files/objects should be stored, so the verifier can decide if this proof satisfies the rules for accessing the required resource.</p>
<p>In this article, we propose a DAC and RBAC access control model which results in minimum data storage size on blockchain, and high scalability without compromising the expected security level of the system or access speed.</p>
</sec>
<sec sec-type="methods" id="s4">
<label>4</label>
<title>Methods</title>
<sec id="s4-1">
<label>4.1</label>
<title>Proposed access control model</title>
<p>The proposed access control model can be summarized as following points:<list list-type="bullet">
<list-item>
<p>Creating Merkle trees for various storage entities in each physical server</p>
</list-item>
<list-item>
<p>Combining and compressing these trees</p>
</list-item>
<list-item>
<p>Store only the hash of the total Merkle tree hash for each user in blockchain, instead of writing the access control policy for each file on blockchain</p>
</list-item>
<list-item>
<p>User Merkle proof to verify authorization</p>
</list-item>
</list>
</p>
<p>To achieve an access control model for DecStore that supports scalability and requires minimal data storage in blockchain, the system architecture and storage model can be modified as follows:<list list-type="bullet">
<list-item>
<p>Each virtual disk (VD) is provided with a unit called &#x201c;Permissions Storage unit.&#x201d; For each user who has access to at least one file in the specified VD, a tree is created in this unit. This tree represents files organized within directories which the user has access to by DAC. The storage units located in VDs which belong to the same VC have the same copy of trees.</p>
</list-item>
<list-item>
<p>Each storage node has a single tree for each user which represents the combination of his DAC trees in the VDs existing in this storage node.</p>
</list-item>
<list-item>
<p>On the blockchain side, each user has 1 hash stored that represents the total hash of his Merkle tree root (<xref ref-type="bibr" rid="B19">Merkle Tree: A Fundamental Component of Blockchains &#x7c; IEEE Conference Publication &#x7c; IEEE Xplore, 2023</xref>). If there are a million files, and 100 users, only 100 hashes will be stored. <xref ref-type="table" rid="T1">Table 1</xref> shows how users access information is stored in blockchain. Merkle tree root hash in this table represents user&#x2019;s DAC Merkle tree root hash.</p>
</list-item>
</list>
</p>
<table-wrap id="T1" position="float">
<label>TABLE 1</label>
<caption>
<p>DAC access control data storage in blockchain.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">User</th>
<th align="left">Merkle tree root hash</th>
<th align="left">Roles</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">f970e2767d0cfe75876ea857f92e319b</td>
<td align="left">006d2143154327a64d86a264aea225f3</td>
<td align="left">Administrator</td>
</tr>
<tr>
<td align="left">7694f4a66316e53c8cdd9d9954bd611d</td>
<td align="left">76d80224611fc919a5d54f0ff9fba446</td>
<td align="left">Developer, team-leader</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Also, the roles are stored in blockchain in a similar way, as in <xref ref-type="table" rid="T2">Table 2</xref>. For each role, a Merkle tree is built in which files that are accessible by this role are addressed as tree leaves.</p>
<table-wrap id="T2" position="float">
<label>TABLE 2</label>
<caption>
<p>RBAC access control data storage in blockchain.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Role</th>
<th align="left">Merkle tree root hash</th>
<th align="left">Nodes</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Administrator</td>
<td align="left">0cc175b9c0f1b6a831c399e269772661</td>
<td align="left">1, 4</td>
</tr>
<tr>
<td align="left">Developer</td>
<td align="left">8a8bb7cd343aa2ad99b7d762030857a2</td>
<td align="left">2, 3</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>A typical flexible access control system is managed by policies and consists of (<xref ref-type="bibr" rid="B1">Adams, 2005</xref>):<list list-type="simple">
<list-item>
<label>-</label>
<p>Policy administration point (PAP): It is the component that creates access policies.</p>
</list-item>
<list-item>
<label>-</label>
<p>Policy information point (PIP): It is the source which holds the policy information based on which the user&#x2019;s access is granted or denied.</p>
</list-item>
<list-item>
<label>-</label>
<p>Policy Decision Point (PDP): It is the component that decides whether a user is granted access or not.</p>
</list-item>
<list-item>
<label>-</label>
<p>Policy Enforcement Point (PEP): It is the component that creates a request and sends it to PDP. It collects required information from PIP and other resources, like user request information to PDP</p>
</list-item>
<list-item>
<label>-</label>
<p>Policy Retrieval Point (PRP): This component is not mandatory. It is used only when there are several PDPs and it is required to provide a centralized point for sending or retrieving access policies.</p>
</list-item>
</list>
</p>
<p>In our proposed model, policy information point (PIP) is not stored on a centralized server. When PDP (which is represented in the system by a blockchain smart contract) makes a decision, it retrieves information from two entities: the user, and the records stored on the blockchain. The full access information is stored on the storage nodes, and users synchronize their own access trees with the ones located on the storage nodes. Policy Enforcement Point (PEP) which is also represented by a smart contract, sends to PDP the Merkle tree proof from the user request along with the according expected Merkle tree root hash.</p>
<p>Thus, PIP is represented by three entities:<list list-type="simple">
<list-item>
<label>-</label>
<p>The distributed network of storage nodes, which have the full policies, and are used only to allow users to sync their policies.</p>
</list-item>
<list-item>
<label>-</label>
<p>Users side, where each user stores his policies whether it is DAC or RBAC.</p>
</list-item>
<list-item>
<label>-</label>
<p>Merkle tree root hashes for both users and roles, which are stored on the blockchain.</p>
</list-item>
</list>
</p>
<p>Users&#x2019; trees consist of three types of nodes:</p>
<p>Root&#x2013;it represents the Merkle tree total hash.</p>
<p>Leaves: represent the files (or directories, in case the policy allows the user to access all files in a directory instead of selecting files manually). They can have an optional value &#x201c;compressed.&#x201d; We will discuss it in the tree compression algorithm section.</p>
<p>Intermediate nodes: they can be directories or combining nodes. A combining node is the node which combines two nodes of various types, where any of those two nodes can be a leaf, a directory or a combining node. This type of nodes will be discussed further in &#x201c;Building binary Merkle tree&#x201d; section.</p>
<p>Each tree node contains two associated data structures: Hash and value. Hash represents the hash of the value. <xref ref-type="table" rid="T3">Table 3</xref> represents the values of each node type.</p>
<table-wrap id="T3" position="float">
<label>TABLE 3</label>
<caption>
<p>Nodes&#x2019; types and structure description.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Node type</th>
<th align="left">Node structure</th>
<th align="left">Example</th>
<th align="left">Hash</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">File</td>
<td align="left">{Name &#x3d; &#x201c;File name,&#x201d; Type &#x3d; File, Access &#x3d; &#x201c;Access type,&#x201d; Compressed &#x3d; &#x201c;compressed paths,&#x201d; Path &#x3d; &#x201c;Path&#x201d;}</td>
<td align="left">{Name &#x3d; &#x201c;document.pdf,&#x201d;Type &#x3d; File, Access &#x3d; R, Compressed &#x3d; Path &#x3d; &#x201c;/documents/&#x201d;}</td>
<td align="left">aa72770681fa71958b02cf5511182f1fbae25efc9b361d0ebc0e533ed6842e64</td>
</tr>
<tr>
<td align="left">Directory</td>
<td align="left">{Name &#x3d; &#x201c;Directory name,&#x201d; Type &#x3d; Directory, Access &#x3d; &#x201c;Access type,&#x201d; Compressed &#x3d; &#x201c;compressed paths,&#x201d; Path &#x3d; &#x201c;Path&#x201d;}</td>
<td align="left">{Name &#x3d; &#x201c;documents,&#x201d; Type &#x3d; Directory, Path &#x3d; &#x201c;/&#x201d;}</td>
<td align="left">c5f503118d94f8e81085329abca5b4a21b64e2981548b13308f0a8282ba82cb8</td>
</tr>
<tr>
<td align="left">Combining node</td>
<td align="left">{Type &#x3d; Combiner, Paths &#x3d; [&#x201c;paths array&#x201d;]}</td>
<td align="left">{Type &#x3d; Combiner, Paths &#x3d; []}</td>
<td align="left">4c8d6d1c41e8740161f9353aa6d70a577e7d25f98ba9de1002dd851a8d016365</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>
<xref ref-type="fig" rid="F2">Figure 2</xref> represents the updated data storage architecture of DecStore. In the updated architecture, it is clear that role trees are distributed across storage nodes, where a storage node does not store a role and its copy. Also, inside VDs, access trees are added.</p>
<fig id="F2" position="float">
<label>FIGURE 2</label>
<caption>
<p>DecStore architecture with proposed access control model.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g002.tif">
<alt-text content-type="machine-generated">Diagram of a user access tree featuring nodes labeled Node 1 to Node 5. Each node contains roles and variable data segments (VD1-VD6) in different colored blocks. The diagram connects to a blockchain, showing user and roles total Merkle tree roots, and features a user with a cache interacting with the nodes.</alt-text>
</graphic>
</fig>
<p>The main outlines of the method can be described as follows:<list list-type="order">
<list-item>
<p>An access control tree for each user is created in each storage node. It has the set of files in this node the user has access to, which exist in VDs of a specific preselected index. For each user, all trees from VDs in a node are combined to a single tree, compressed and converted to a binary tree. These trees are used for DAC (<xref ref-type="sec" rid="s4-2">Section 4.2</xref>).</p>
</list-item>
<list-item>
<p>Also, each storage node has several role trees. There is an extra copy of each role tree, which is located on a different node. All storage nodes have the same number of trees. Blockchain distributes the trees and their copies on the storage nodes.</p>
</list-item>
<list-item>
<p>Users synchronize their trees with the ones existing on the storage nodes. This includes their personal trees (DAC) and the roles trees (RBAC).</p>
</list-item>
<list-item>
<p>Users use their copies of trees to access files by generating Merkle proof. See <xref ref-type="sec" rid="s4-5">Section 4.5</xref>.</p>
</list-item>
<list-item>
<p>Blockchain handles processes related with distributing and the recovery of trees in different situations, in order to grant that the system stays balanced, and that files are recoverable, or recovered automatically to another node when a storage node is lost.</p>
</list-item>
</list>
</p>
</sec>
<sec id="s4-2">
<label>4.2</label>
<title>Creating Merkle tree algorithm in case of DAC</title>
<p>This algorithm has three main phases:<list list-type="order">
<list-item>
<p>In each VD which is selected by blockchain, a tree for each user is created. This tree shows which files a user has access to in this VD.</p>
</list-item>
<list-item>
<p>Each node combines these trees into a single tree, which represents which files the user has access to in this node. In the combination process, files from different trees that are located under the same folder get combined under a single tree node.</p>
</list-item>
<list-item>
<p>The tree gets compressed after that, by combining tree nodes which have a single child into one tree node, in order to minimize the size of the tree (<xref ref-type="sec" rid="s4-2">Section 4.2</xref>).</p>
</list-item>
<list-item>
<p>The resulting tree is converted into a binary tree, in order to minimize the size of Merkle proof (<xref ref-type="sec" rid="s4-4">Section 4.4</xref>).</p>
</list-item>
</list>
</p>
<p>Users&#x2019; access information is distributed across storage nodes using VDs. This means that data is replicated in VDs that belong to the same VC. When creating the combined Merkle tree, only one of the VDs of each VC participates in this process to avoid redundancy, which means that it is required to choose which VD will participate in this process. Selecting a fixed VD for all users is not practical, because it means more load on specific VDs, while it is preferred to distribute the load over VDs. Assigning a set of VDs for each user is not the best practice, as this means extra data storage in blockchain. The selection of VD in this algorithm is dynamic, based on the formula:<disp-formula id="equ1">
<mml:math id="m1">
<mml:mrow>
<mml:mi>s</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>l</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>c</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>V</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>I</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>x</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>u</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>I</mml:mi>
<mml:mi>d</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mi mathvariant="italic">mod</mml:mi>
<mml:mo>&#x2061;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:math>
</disp-formula>
</p>
<p>If the resulting number is 1, it means that only the first VD in all VCs is selected for building the tree for this user. If it is 2, it means that the second VD is used. If it is 0, it means that the VD which holds the Erasure Coding is used. The initial treeNode in the algorithm is the tree root node.</p>
<p>Trees are represented using sets of sets, where the main set is the tree root, and the elements of this set represent child nodes of the root (files and directories), and they are also sets that represent the same concept. These sets (tree nodes) have attributes (name, type, etc.). Files are represented by empty sets with attributes. We will use the words &#xab;tree nodes&#xbb; and sets interchangeably. In each storage node, trees are selected based on the selected VDs (based on the selected VD index), which will be combined to build a single tree on the level of the storage node. The tree node is expressed by the set <inline-formula id="inf1">
<mml:math id="m2">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, and the root of the tree is expressed as <inline-formula id="inf2">
<mml:math id="m3">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>R</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. The initial selected <inline-formula id="inf3">
<mml:math id="m4">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> in the algorithm is <inline-formula id="inf4">
<mml:math id="m5">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>R</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. Attribute x of a tree root node can be expressed as <inline-formula id="inf5">
<mml:math id="m6">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>R</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mi>x</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, and the first element of the set is <inline-formula id="inf6">
<mml:math id="m7">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. This does not necessarily mean that this is the tree of VC1. It means that it is the tree of the first VD that the storage node holds, which is in the list of selected VDs. <inline-formula id="inf7">
<mml:math id="m8">
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>m</mml:mi>
<mml:mi>b</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>R</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> can be calculated by selecting the union <inline-formula id="inf8">
<mml:math id="m9">
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mo>&#x222a;</mml:mo>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula> of each <inline-formula id="inf9">
<mml:math id="m10">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>R</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> that participates in this process. Starting from that, elements of a tree node <inline-formula id="inf10">
<mml:math id="m11">
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> get combined as follows:<disp-formula id="equ2">
<mml:math id="m12">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="{" close="}" separators="|">
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>A</mml:mi>
<mml:mo>&#x222a;</mml:mo>
<mml:mi>B</mml:mi>
<mml:mo>&#x2228;</mml:mo>
<mml:mi>A</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>&#x2227;</mml:mo>
<mml:mo>&#x2203;</mml:mo>
<mml:mi>B</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>B</mml:mi>
<mml:mo>&#x2260;</mml:mo>
<mml:mi>A</mml:mi>
<mml:mo>&#x2227;</mml:mo>
<mml:msup>
<mml:mi>A</mml:mi>
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mi>B</mml:mi>
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x222a;</mml:mo>
<mml:mrow>
<mml:mfenced open="{" close="}" separators="|">
<mml:mrow>
<mml:mi>A</mml:mi>
<mml:mo>&#x2228;</mml:mo>
<mml:mi>A</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>&#x2227;</mml:mo>
<mml:mo>&#x2204;</mml:mo>
<mml:mi>B</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>B</mml:mi>
<mml:mo>&#x2260;</mml:mo>
<mml:mi>A</mml:mi>
<mml:mo>&#x2227;</mml:mo>
<mml:msup>
<mml:mi>A</mml:mi>
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mi>B</mml:mi>
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
</p>
<p>Which means that it can have items from different trees under the same directories, or it can be a single item if the directory has one file only.</p>
<p>Let&#x2019;s assume that in storage node 1 there are three VDs: VD3-P2, VD5P1 and VD6-P2. Let&#x2019;s assume also that the selected VD index is 2. In that case, only VD3-P2 and VD6-P2 are chosen. Now, if the according trees are shown as in <xref ref-type="fig" rid="F3">Figure 3</xref>, the resulting combined tree will look like the tree in <xref ref-type="fig" rid="F4">Figure 4</xref>.</p>
<fig id="F3" position="float">
<label>FIGURE 3</label>
<caption>
<p>Separate VDs trees example.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g003.tif">
<alt-text content-type="machine-generated">Flowchart showing two processes originating from &#x22;User 1&#x22;. The left side leads through &#x22;Production&#x22; to &#x22;Attachments&#x22; with &#x22;12.pdf&#x22; and &#x22;SAP&#x22; with &#x22;442.xml&#x22;. It also passes through &#x22;Agreements&#x22; and &#x22;Documents&#x22; leading to &#x22;2023&#x22; and then &#x22;12.23.pdf&#x22;. The right side goes from &#x22;Production&#x22; to &#x22;Attachments&#x22; with &#x22;40.pdf&#x22;.</alt-text>
</graphic>
</fig>
<fig id="F4" position="float">
<label>FIGURE 4</label>
<caption>
<p>User 1 combined tree of VD3-P2 and VD6-P2.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g004.tif">
<alt-text content-type="machine-generated">Flowchart depicting a hierarchy starting with &#x22;User 1&#x22; leading to &#x22;Production.&#x22; &#x22;Production&#x22; branches into &#x22;Attachments,&#x22; &#x22;SAP,&#x22; and &#x22;Agreements.&#x22; &#x22;Attachments&#x22; links to &#x22;12.pdf&#x22; and &#x22;40.pdf.&#x22; &#x22;SAP&#x22; links to &#x22;442.xml.&#x22; &#x22;Agreements&#x22; connects to &#x22;Documents,&#x22; leading to &#x22;2023&#x22; and &#x22;12.23.pdf.&#x22;</alt-text>
</graphic>
</fig>
<p>The combination process repeats for every tree node in the list, and the join function is performed on all the resulting tree nodes as well until there are no more child nodes. The used notation shows that tree nodes that have the same name attribute are combined with each other and added to the TreeNode, as well as tree nodes that have unique names.</p>
<p>As the current study case considers DecStore, in other systems term VD can be replaced by &#x201c;virtual machine,&#x201d; or any unit that allows logically separating files on one server (ex. folders). If files are directly stored on the server, this means that the algorithm of combining trees is not required.</p>
</sec>
<sec id="s4-3">
<label>4.3</label>
<title>Compressing algorithm</title>
<p>After that, compression algorithm is called. This algorithm is required to minimize the size of the tree, by compressing tree nodes which have a single direct child into one, resulting in a smaller tree in total. This means that directories which have only one object (a file or a directory) are compressed into one. Joining two tree nodes into one is described by the formula:<disp-formula id="equ3">
<mml:math id="m13">
<mml:mrow>
<mml:mi>J</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="{" close="}" separators="|">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mn>1</mml:mn>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>m</mml:mi>
<mml:mi>p</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>m</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>m</mml:mi>
<mml:mi>p</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
</p>
<p>&#x201c;Compressed&#x201d; attribute in the tree leaf represents the path of compressed tree nodes if they exist. &#x201c;Access type&#x201d; and &#x201c;compressed&#x201d; attributes in the case of directories are used only when the policy allows the user to access all files in a folder, so in this case, the directory is a leaf. Starting with the root node, the compress algorithm runs in a top-bottom model.<disp-formula id="equ4">
<mml:math id="m14">
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>R</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:math>
</disp-formula>
</p>
<p>The compress function for a parent tree node is defined by the formula:<disp-formula id="equ5">
<mml:math id="m15">
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>m</mml:mi>
<mml:mi>p</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>s</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2200;</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mo>,</mml:mo>
</mml:mrow>
</mml:math>
</disp-formula>
<disp-formula id="equ6">
<mml:math id="m16">
<mml:mrow>
<mml:mfenced open="{" close="" separators="|">
<mml:mrow>
<mml:mtable columnalign="center">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>J</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>c</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>m</mml:mi>
<mml:mi>p</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>s</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>:</mml:mo>
<mml:mrow>
<mml:mfenced open="|" close="|" separators="|">
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>c</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>m</mml:mi>
<mml:mi>p</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>s</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>:</mml:mo>
<mml:mrow>
<mml:mfenced open="|" close="|" separators="|">
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3e;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</disp-formula>
</p>
<p>The compressed tree version of the tree presented in <xref ref-type="fig" rid="F4">Figure 4</xref> is shown in <xref ref-type="fig" rid="F5">Figure 5</xref>. It is clear that &#x201c;compress&#x201d; attribute for 12.23.pdf is equal to Agreements/Documents/2023.</p>
<fig id="F5" position="float">
<label>FIGURE 5</label>
<caption>
<p>Compressed tree example.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g005.tif">
<alt-text content-type="machine-generated">Flowchart depicting a process. &#x22;User 1&#x22; connects to &#x22;Production,&#x22; which branches into &#x22;Attachments,&#x22; leading to &#x22;12.pdf&#x22; and &#x22;40.pdf,&#x22; and &#x22;SAP/442.xml.&#x22; Another branch from &#x22;Production&#x22; points to &#x22;Agreements/Documents/2023/12.23.pdf.&#x22;</alt-text>
</graphic>
</fig>
</sec>
<sec id="s4-4">
<label>4.4</label>
<title>Building binary Merkle tree</title>
<p>The next step is converting the compressed tree into a binary tree. In order to perform this step, a new type of Intermediate nodes is added (combiner). Combiners are used to combine child nodes in such a way that only 2 tree nodes are considered as direct child nodes. This type of nodes has &#x201c;paths&#x201d; attribute. This attribute is set if the combining node has a directory in one of its direct descendants which are not combining nodes. <xref ref-type="fig" rid="F6">Figure 6</xref> represents how paths are created in binary trees.</p>
<fig id="F6" position="float">
<label>FIGURE 6</label>
<caption>
<p>An example of the usage of paths attribute.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g006.tif">
<alt-text content-type="machine-generated">Flowchart showing a file organization for User 1. Under &#x22;Files,&#x22; there are two paths: &#x22;Combiner 3&#x22; and &#x22;Combiner 4.&#x22; &#x22;Combiner 3&#x22; is set with paths ['doc', 'ppt'] and breaks into &#x22;Combiner 1&#x22; with paths ['/', 'doc'], leading to &#x22;1.pdf&#x22; and &#x22;doc/1.doc.&#x22; The &#x22;ppt&#x22; branch leads to &#x22;1.ppt&#x22; and &#x22;2023/2.ppt.&#x22; &#x22;Combiner 4&#x22; feeds into &#x22;1.pdf&#x22; and &#x22;Combiner 2,&#x22; which leads to &#x22;2.pdf&#x22; and &#x22;3.pdf.&#x22;</alt-text>
</graphic>
</fig>
<p>In combiner 3, &#x201c;paths&#x201d; value is doc and ppt. That is because it has two direct folders: doc which is a &#x201c;compress&#x201d; value for the nodes doc/1.doc and ppt. Folder 2023 is not added to paths, because it is a child node of ppt, which is already added in paths. When accessing 2.ppt, given that the full path is/files/ppt/2023/2.ppt, Combiner 3 is directly accessed because in paths it has ppt. And after that, 2023/2.pdf is accessed directly.</p>
<p>Converting the tree into a binary tree is important in order to decrease the size of Merkle tree proof. Let&#x2019;s consider the tree example in <xref ref-type="fig" rid="F7">Figure 7</xref> which does not use combining nodes:</p>
<fig id="F7" position="float">
<label>FIGURE 7</label>
<caption>
<p>Example of a tree that does not use combining nodes.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g007.tif">
<alt-text content-type="machine-generated">Flowchart representing file organization for User 1. Files are divided into two categories: &#x22;doc&#x22; and &#x22;pdf.&#x22; The &#x22;doc&#x22; section contains 1.doc and 2.doc. The &#x22;pdf&#x22; section includes files numbered 1.pdf to 32.pdf.</alt-text>
</graphic>
</fig>
<p>Merkle Proof of the file 1.pdf requires checking 33 tree nodes: 1.pdf &#x2b; hashes of all pdf files &#x2b; hash of doc directory. If we convert the tree to a binary one, it will require checking 7 nodes only: 1.pdf &#x2b; hash of 2.pdf &#x2b; hash of 4 combiners (combiners 2 &#x2b; 18&#x2b;26 &#x2b; 30) &#x2b; hash of doc directory as in <xref ref-type="fig" rid="F8">Figure 8</xref>. The number of hashes of required tree nodes in a single directory for Merkle proof is equal to <inline-formula id="inf11">
<mml:math id="m17">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="italic">log</mml:mi>
<mml:mn>2</mml:mn>
</mml:msub>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>n</mml:mi>
<mml:mi>u</mml:mi>
<mml:mi>m</mml:mi>
<mml:mi>b</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>f</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
<fig id="F8" position="float">
<label>FIGURE 8</label>
<caption>
<p>Example of a tree that uses combining nodes.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g008.tif">
<alt-text content-type="machine-generated">Flowchart depicting a file management system. &#x22;User 1&#x22; leads to &#x22;Files,&#x22; branching into &#x22;doc&#x22; and &#x22;pdf.&#x22; Under &#x22;doc&#x22;: files &#x22;1.doc&#x22; and &#x22;2.doc.&#x22; Under &#x22;pdf&#x22;: multiple combiners. &#x22;Combiner 17&#x22; and &#x22;Combiner 24&#x22; lead to &#x22;Combiner 1,&#x22; &#x22;Combiner 2,&#x22; and &#x22;Combiner 16,&#x22; producing files like &#x22;1.pdf,&#x22; &#x22;2.pdf,&#x22; &#x22;3.pdf,&#x22; &#x22;4.pdf,&#x22; &#x22;31.pdf,&#x22; and &#x22;32.pdf.&#x22;</alt-text>
</graphic>
</fig>
<p>
<xref ref-type="fig" rid="F9">Figure 9</xref> represents the algorithm. It is clear that each 2 tree child nodes of any tree node get combined into one combiner, and the process is recursive until in total there are only 2 child nodes. The algorithm then is called for each child. In this algorithm, <inline-formula id="inf12">
<mml:math id="m18">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>N</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mn>1</mml:mn>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is the first child of node treeNode. The algorithm is first called for the root node of the tree.</p>
<fig id="F9" position="float">
<label>FIGURE 9</label>
<caption>
<p>Converting tree to binary algorithm.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g009.tif">
<alt-text content-type="machine-generated">Flowchart depicting an algorithm to convert a tree node to a binary form. It begins at &#x22;Start&#x22;, checks if the node is a directory with children, counts tree nodes, and processes them in pairs. Nodes are combined and moved, incrementing through the list, then calls a conversion algorithm for each node. The process repeats until completion, ending at &#x22;Stop&#x22;.</alt-text>
</graphic>
</fig>
<p>Once all the storage nodes build the user&#x2019;s tree, the root nodes are combined the same way using combining nodes to build a single Merkle tree. The hash of the resulting root node of this tree is stored for each. Let&#x2019;s consider building a Merkle tree for RBAC. For each role, a tree gets built. A role tree contains the files to which the policy associated with this role allows access. The same type of tree nodes and attributes proposed for DAC are used in RBAC. Roles get duplicated, and distributed across storage nodes, where a storage node cannot hold a role and its duplication. Each storage node holds <inline-formula id="inf13">
<mml:math id="m19">
<mml:mrow>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mrow>
<mml:mfenced open="|" close="|" separators="|">
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>l</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x2a;</mml:mo>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mn>2</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>/</mml:mo>
<mml:mrow>
<mml:mfenced open="|" close="|" separators="|">
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> of roles, where N is the set of storage nodes.</p>
</sec>
<sec id="s4-5">
<label>4.5</label>
<title>Users&#x2019; access verification algorithm</title>
<p>This algorithm is used to verify whether a user has access to a file or not. When a user sends a request to access a file, whether the request is for reading or writing, he sends a Merkle proof along with the request. The body of the request depends on the access method used for this file. <xref ref-type="table" rid="T4">Table 4</xref> shows the message header in the case of RBAC and DAC.</p>
<table-wrap id="T4" position="float">
<label>TABLE 4</label>
<caption>
<p>The header of an access file request.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">DAC</th>
<th align="left">RBAC</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">{Access &#x3d; &#x201c;DAC,&#x201d; MerkleProof &#x3d; [&#x2026;], FileInfo &#x3d; {&#x2026;}}</td>
<td align="left">{Access &#x3d; &#x201c;RBAC,&#x201d; Role &#x3d; &#x201c;Role type,&#x201d; MerkleProof &#x3d; [&#x2026;], FilleInfo &#x3d; {&#x2026;}}</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Each user has a copy of his own personal tree &#x2b; a copy of the role(s) tree(s). The first step is to locate the file. This process can be done using a top-bottom method without searching for all possible tree nodes as in Depth First Search (DFS) (<xref ref-type="bibr" rid="B25">Tarjan, 1971</xref>), because the Merkle tree is built in a structure which keeps the files organized in its original path hierarchy. Files can be reached quickly by selecting the correct intermediate nodes. Combining nodes have &#x201c;paths&#x201d; attribute, which contains the names of direct directories if they exist. Compressed attribute is also used in this process, in case there are compressed nodes.</p>
<p>Once the user selects the file from the according tree, he sends the file info along with Merkle proof to the load balancer, represented by a blockchain smart contract. Blockchain smart contract first checks the access type, and hashes the file info, and then calculates the hash of the sum of the file info hash and the first hash in Merkle proof array and repeats the process for all hashes in Merkle proof array. After that, it compares the resulting hash with the stored one in <xref ref-type="table" rid="T1">Table 1</xref> in case of DAC, or with the stored hash in <xref ref-type="table" rid="T2">Table 2</xref> in the case of RBAC. Blockchain can confirm the user&#x2019;s identity based on his wallet authorization.</p>
<p>The user sends the file value without hashing it, and the Merkle proof array (required tree nodes) P &#x3d; {P1,P2,P3, &#x2026;Pn}, where P1 is the required file info value, and P2,P3,&#x2026;Pn are the hashes of the required tree nodes for Merkle proof.</p>
<p>Assuming that hash(x) is the hash function, Merkle tree hash from the Merkle proof can be calculated using the recursive function <inline-formula id="inf14">
<mml:math id="m20">
<mml:mrow>
<mml:mi>v</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mi>y</mml:mi>
<mml:mi>M</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>k</mml:mi>
<mml:mi>l</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>P</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>.<disp-formula id="equ7">
<mml:math id="m21">
<mml:mrow>
<mml:mi>v</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mi>y</mml:mi>
<mml:mi>M</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>k</mml:mi>
<mml:mi>l</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>P</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mfenced open="{" close="" separators="|">
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>h</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>h</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:msub>
<mml:mi>P</mml:mi>
<mml:mi>i</mml:mi>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>v</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mi>y</mml:mi>
<mml:mi>M</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>k</mml:mi>
<mml:mi>l</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>P</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mfenced open="(" close=")" separators="|">
<mml:mrow>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>w</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mrow>
</mml:math>
</disp-formula>
</p>
<p>When the user sends a request to access a file, The type of access sends (RBAC or DAC) is also sent along with Merkle proof. Thus, the system understands which entry is required to be compared with, as seen in <xref ref-type="fig" rid="F10">Figure 10</xref>.</p>
<fig id="F10" position="float">
<label>FIGURE 10</label>
<caption>
<p>Algorithm of resolving type of access.</p>
</caption>
<graphic xlink:href="fbloc-08-1630839-g010.tif">
<alt-text content-type="machine-generated">Flowchart depicting an access verification process using RBAC and DAC trees. It starts by checking if a file is accessible using the RBAC tree, sending a request with Merkle proof if true. If not, it checks accessibility using the DAC tree, sending a request with Merkle proof if true. The blockchain is then checked for the access type sent. It builds the Merkle tree root hash and compares it with the received proof. Access is granted or revoked based on the comparison.</alt-text>
</graphic>
</fig>
</sec>
<sec id="s4-6">
<label>4.6</label>
<title>Synchronizing local access tree algorithm</title>
<sec id="s4-6-1">
<label>4.6.1</label>
<title>SIn case of DAC</title>
<p>When a user gets granted or revoked to access a file f, or if the access type changes (read/write), this file gets added/removed/updated in the access tree in the according VD. Changes get propagated to the combined tree and to the total Merkle root hash. The user can detect changes in his tree by comparing his total Merkle root hash with the one stored in the blockchain.</p>
</sec>
<sec id="s4-6-2">
<label>4.6.2</label>
<title>In the case of RBAC</title>
<p>The same algorithm is used. If the user role gets changed, the tree gets updated, and the user detects that by comparing the role Merkle tree root hash stored in blockchain with his stored version of roles. If the user gets a new role added, the user requests a copy of the role Merkle tree from one of the storage nodes that host it, and the tree checks from the blockchain if the user has this role or not before sending it back. If the user loses a role, the role gets removed from his entry in blockchain, and thus access gets revoked.</p>
</sec>
</sec>
</sec>
<sec id="s5">
<label>5</label>
<title>Experiments results</title>
<p>In order to estimate the performance of the algorithms, an application which implements the proposed method for DecStore was developed. The application was written in C&#x2b;&#x2b; with the help of QT open-source platform, and the trees were represented in two different ways: SQLite files and JSON files, as the implementation technologies affect the performance results. The application was tested using a laptop running Ubuntu 22.04 LTS on core i7-8575u CPU and 16&#xa0;GB of RAM. The experiment included creating two user DAC trees from scratch consisting of 500 new files each, in order to create the combined tree. SHA-256 hashing function was used to create nodes hashes. The test was performed automatically 100 times. The mean time for this process is 9.48&#xa0;s in case of using SQLite, and 0.55&#xa0;s in case of JSON files. Total tree size in case of SQLite is 249.9&#xa0;KB, while it is 552&#xa0;KB when using JSON. The implementation included combining 2 trees into one, compressing it and converting it to binary, and it is available here (<xref ref-type="bibr" rid="B21">Obadah Hammoud, n.d.</xref>).</p>
<p>In real life applications, DAC is probably much smaller than 1,000 files per node, as access is usually granted based on roles, and also by applying policies to directories and their subdirectories, instead of selecting individual files one by one, which means that the size of the resulting trees is supposed to be smaller.</p>
<p>In order to evaluate the performance of the system compared to other possible implementations, 3 systems were considered for testing:<list list-type="simple">
<list-item>
<p>1- Centralized system: Laravel PHP framework was used to implement it, as it is considered as a popular framework for implementing APIs. MySQL was used for storing access policies.</p>
</list-item>
<list-item>
<p>2- Blockchain Hyperledger: Where data is stored directly in blockchain instead of using an external resource to store policies. Docker was used for Hyperledger nodes.</p>
</list-item>
<list-item>
<p>3- DecStore: which is an implementation of the access control model proposed in this paper.</p>
</list-item>
</list>
</p>
<p>1,000 files entries were generated, as well as 1,000 users. All users were given access to all files (1,000 &#xd7; 1,000). Three test cases were performed:<list list-type="simple">
<list-item>
<p>1- Granting a new permission to a file: Which expresses the speed of adding a new access rule for a user x to a file y (1 &#xd7; 1).</p>
</list-item>
<list-item>
<p>2- Revoking a user&#x2019;s access completely: Which means revoking all types of access given to a user x to any file in the system (1 &#xd7; 1000).</p>
</list-item>
<list-item>
<p>3- Validating access: It is the timer required by the system to check if a user x has access to a file y (1 &#xd7; 1).</p>
</list-item>
</list>
</p>
<p>Obtained experiment results are shown in <xref ref-type="table" rid="T5">Table 5</xref>.</p>
<table-wrap id="T5" position="float">
<label>TABLE 5</label>
<caption>
<p>Performance tests results.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th rowspan="2" align="left">Operation</th>
<th colspan="2" align="center">DecStore</th>
<th rowspan="2" align="center">Blockchain (ms)</th>
<th rowspan="2" align="center">Centralized system (ms)</th>
</tr>
<tr>
<th align="center">JSON (ms)</th>
<th align="center">SQLite (ms)</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Granting a new permission to a file</td>
<td align="center">157</td>
<td align="center">190</td>
<td align="center">100</td>
<td align="center">60</td>
</tr>
<tr>
<td align="left">Revoking a user&#x2019;s access completely</td>
<td align="center">400</td>
<td align="center">300</td>
<td align="center">300</td>
<td align="center">60</td>
</tr>
<tr>
<td align="left">Validating access</td>
<td align="center">130</td>
<td align="center">140</td>
<td align="center">100</td>
<td align="center">10</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Another experiment was conducted in order to understand how much storage can be saved when applying the proposed method (DecStore) against storing data directly on blockchain. For this experiment, we considered the case of RBAC. 100 roles are created, along with 1,000 files. Each file can be accessed using one of 10 roles, from these 100 roles. Hyperledger Fabric (Blockchain) is used in this experiment, as in the previous one. The size of data is obtained from the peer nodes, be checking the size of the stored blockchain blocks:<list list-type="simple">
<list-item>
<p>&#x2212; In case of using DecStore: 592&#xa0;KB</p>
</list-item>
<list-item>
<p>&#x2212; In case of using Hyperledger Fabric directly: 5.4&#xa0;MB</p>
</list-item>
</list>
</p>
<p>It is important to mention that the roles were assigned directly. It is clear that the storage size in DecStore is significantly smaller than storing on Blockchain directly. Consecutive updating roles and adding more files will result in much bigger size when using Blockchain compared with Decstore. For example, adding or revoking a role from the whole system will require updating all affected files entries on blockchain to add/revoke the required role in the case of Blockchain, which is time consuming and results of having many transactions (storage size), while in DecStore, one transaction is required, which adds&#x2013;remove the role hash.</p>
<p>Based on the performance tests results, we can conclude that the speed of the proposed system in various operations is not by far behind other systems, while it supports scalability unlike other systems. Also, it is clear that JSON files can be a good way to represent the trees. However, the performance might differ when implementing using other stack of technologies.</p>
</sec>
<sec id="s6">
<label>6</label>
<title>Discussions and limitations</title>
<p>The presented model has a number of advantages over the solutions discussed earlier in <xref ref-type="sec" rid="s3">Section 3</xref>. It minimizes the size of the DAC and RBAC access rights data stored in the blockchain and is capable of scaling.</p>
<p>When adding new access to the user&#x2019;s combined tree, running the compressing algorithm and converting the tree to a binary can be performed faster than when creating from scratch, as the tree might not require compressing at all, and the result of running the algorithm of converting the tree to binary can end up with adding few nodes without changing most of the nodes as it is already in binary form.</p>
<p>Threats were analyzed using STRIDE modeling framework (<xref ref-type="bibr" rid="B23">Shostack, 2014</xref>):<list list-type="simple">
<list-item>
<label>-</label>
<p>Spoofing: If the attacker were able to spoof the Merkle proof, he would not be able to use it to access data (as in replay attack), because the Merkle proof&#x2019;s hash is verified against the users&#x2019; identity value, which is tied to their wallet. Additionally, manipulating nodes data by colluding nodes is not possible, as the network is permissioned, which means that outsider nodes cannot join and provide fake data, which prevents against attacks such as Sybil (<xref ref-type="bibr" rid="B16">Iqbal and Matulevicius, 2021</xref>).</p>
</list-item>
<list-item>
<label>-</label>
<p>Tampering: If a user attempts to change his local tree copy by adding access to a file or changing the type of access from read to write, then the resulting Merkle proof will differ from the one stored on the blockchain, and access will be denied.</p>
</list-item>
<list-item>
<label>-</label>
<p>Repudiation: If a user&#x2019;s access to a file was revoked and he does not allow updating his local tree and sends the Merkle proof he had before the revocation, he would not get access, as the Merkle proof does not match</p>
</list-item>
<list-item>
<label>-</label>
<p>Information Disclosure: If the attacker were able to copy the Merkle tree cache from another user, this would not be enough to access data, as he has a different identity. The attack can only succeed when he also steals the identity (wallet) of a user.</p>
</list-item>
<list-item>
<label>-</label>
<p>Denial of Service (DoS): Such a problem is considered when the attack is performed against a storage node rather than a blockchain node, as blockchain nodes are replicated. However, it is required to attack two nodes which have VDs that belongs to VCs that are shared among those 2 nodes to stop data availability.</p>
</list-item>
<list-item>
<label>-</label>
<p>Elevation of Privilege (EoP): Users cannot self-assign data access. Permissions must be granted by data owners. Additionally, it is possible to track who has access to a specific file using trees built in storage nodes, and access of unwanted users can be revoked.</p>
</list-item>
</list>
</p>
<p>However, the proposed system has some limitations:<list list-type="simple">
<list-item>
<label>-</label>
<p>Users are required to synchronize their trees regularly, in order to access the system. However, synchronization does not mean copying all the users&#x2019; trees. Changes can be detected by comparing the total hash with the one stored in blockchain. In case the hash is different, the node which has the modified tree can be detected by its hash.</p>
</list-item>
<list-item>
<label>-</label>
<p>Frequent changes to access rules means frequent synchronization of changes and running the associated algorithms. However, access can be assigned by directories instead of selecting individual files, and RBAC can be used in some cases instead of DAC, which can effectively minimize the number of required processes.</p>
</list-item>
<list-item>
<label>-</label>
<p>Time of revoking a user&#x2019;s access operation is relatively long, which means that the proposed model is not suitable for systems where frequent deletion of the access rights is necessary.</p>
</list-item>
<list-item>
<label>-</label>
<p>Deployment: Results and performance depend on the system settings, like the chosen blockchain network, which directly affects various parameters, such as transaction speed, gas cost, smart contracts, etc. Additionally, the system has several components, which may necessitate additional deployment time to ensure proper configuration and integration.</p>
</list-item>
</list>
</p>
</sec>
<sec id="s7">
<label>7</label>
<title>Conclusion and future work</title>
<p>In this research, we proposed a new access control system that can work with blockchain in combination with off-chain storage with caching on the users&#x2019; side. In this system, a part of the PIP data is stored on the users themselves who request authorization, yet the model uses Merkle tree root hashes stored on the blockchain to prevent data manipulation. The proposed model uses a distributed system for access control management and provides the mechanism for maintaining data fairly distributed in several cases, including adding or removing storage nodes. The access control model consists of several algorithms which allow managing access control in different scenarios. The caching mechanism reduces the number of required requests, which means less pressure on storage nodes. Also, it means less response time, as the decision is made in blockchain itself, without requesting more data from the storage node.</p>
<p>As experiments have shown, the proposed model is scalable and minimizes the size of the rights storage in the blockchain several times. However, the provided tests are implemented on a local machine, and we plan to perform stress tests on the cloud in the future.</p>
<p>This study considered a distributed file storage system (DecStore) as a study case. However, this work can be adapted to fit other types of systems that use blockchain and off-chain storage to store any type of data. The approach proposed here does not depend on the method of encoding or restoring data, but considers the issue of reducing the dimension of the DAC matrix and the distribution of this data in blockchain-based systems.</p>
<p>In future, we plan to work on integrating this access control model with other technological platforms and study the outcome of such integration.</p>
</sec>
</body>
<back>
<sec sec-type="data-availability" id="s8">
<title>Data availability statement</title>
<p>Publicly available datasets were analyzed in this study. This data can be found here: <ext-link ext-link-type="uri" xlink:href="https://github.com/Obadah-H/DistributedFileSystem">https://github.com/Obadah-H/DistributedFileSystem</ext-link>.</p>
</sec>
<sec sec-type="author-contributions" id="s9">
<title>Author contributions</title>
<p>OH: Validation, Conceptualization, Writing &#x2013; original draft, Visualization, Software. IT: Supervision, Writing &#x2013; review and editing, Conceptualization.</p>
</sec>
<sec sec-type="COI-statement" id="s11">
<title>Conflict of interest</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
<sec sec-type="correction-note" id="s32">
<title>Correction note</title>
<p>A correction has been made to this article. Details can be found at: <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.3389/fbloc.2026.1806905">10.3389/fbloc.2026.1806905</ext-link>.</p>
</sec>
<sec sec-type="ai-statement" id="s12">
<title>Generative AI statement</title>
<p>The author(s) declare that no Generative AI was used in the creation of this manuscript.</p>
</sec>
<sec sec-type="disclaimer" id="s13">
<title>Publisher&#x2019;s note</title>
<p>All claims expressed in this article are solely those of the authors and do not necessarily represent those of their affiliated organizations, or those of the publisher, the editors and the reviewers. Any product that may be evaluated in this article, or claim that may be made by its manufacturer, is not guaranteed or endorsed by the publisher.</p>
</sec>
<fn-group>
<fn fn-type="custom" custom-type="edited-by">
<p>
<bold>Edited by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1578203/overview">Alex Zarifis</ext-link>, University of Southampton, United Kingdom</p>
</fn>
<fn fn-type="custom" custom-type="reviewed-by">
<p>
<bold>Reviewed by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/2762614/overview">Chengzu Dong</ext-link>, Lingnan University, Hong Kong, SAR China</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1492610/overview">Qasem Abu Al-Haija</ext-link>, Jordan University of Science and Technology, Jordan</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1788763/overview">Abdur Rasool</ext-link>, University of Hawaii at Manoa, United States</p>
</fn>
</fn-group>
<ref-list>
<title>References</title>
<ref id="B1">
<mixed-citation publication-type="book">
<person-group person-group-type="author">
<name>
<surname>Adams</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2005</year>). &#x201c;<article-title>Authorization architecture</article-title>,&#x201d; in <source>Encyclopedia of cryptography and security</source>. Editor <person-group person-group-type="editor">
<name>
<surname>van Tilborg</surname>
<given-names>H. C. A.</given-names>
</name>
</person-group> (<publisher-loc>Boston, MA</publisher-loc>: <publisher-name>Springer US</publisher-name>), <fpage>23</fpage>&#x2013;<lpage>27</lpage>. <pub-id pub-id-type="doi">10.1007/0-387-23483-7_18</pub-id>
</mixed-citation>
</ref>
<ref id="B2">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Balaji</surname>
<given-names>S. B.</given-names>
</name>
<name>
<surname>Nikhil Krishnan</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Vajha</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Ramkumar</surname>
<given-names>V.</given-names>
</name>
<name>
<surname>Sasidharan</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Vijay Kumar</surname>
<given-names>P.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>Erasure coding for distributed storage: an overview</article-title>. <source>Sci. China Inf. Sci.</source> <volume>61</volume> (<issue>10</issue>), <fpage>100301</fpage>. <pub-id pub-id-type="doi">10.1007/s11432-018-9482-6</pub-id>
</mixed-citation>
</ref>
<ref id="B3">
<mixed-citation publication-type="book">
<person-group person-group-type="editor">
<name>
<surname>Benantar</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2006</year>). &#x201c;<article-title>Discretionary-access control and the access-matrix model</article-title>,&#x201d; <source>Access control systems: security, identity management and trust models</source> (<publisher-loc>Boston, MA</publisher-loc>: <publisher-name>Springer US</publisher-name>), <fpage>147</fpage>&#x2013;<lpage>167</lpage>. <pub-id pub-id-type="doi">10.1007/0-387-27716-1_5</pub-id>
</mixed-citation>
</ref>
<ref id="B4">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Butincu</surname>
<given-names>C. N.</given-names>
</name>
<name>
<surname>Alexandrescu</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>Design aspects of decentralized identifiers and self-sovereign identity systems</article-title>. <source>IEEE Access</source> <volume>12</volume>, <fpage>60928</fpage>&#x2013;<lpage>60942</lpage>. <pub-id pub-id-type="doi">10.1109/ACCESS.2024.3394537</pub-id>
</mixed-citation>
</ref>
<ref id="B5">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chen</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Lu</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Kunpittaya</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Luo</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>A review of Zk-SNARKs</article-title>. <source>arXiv</source>. <pub-id pub-id-type="doi">10.48550/ARXIV.2202.06877</pub-id>
</mixed-citation>
</ref>
<ref id="B6">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Cheng</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Yan</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>G.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>The blockchain based access control scheme for the internet of things</article-title>. <source>Procedia Comput. Sci. Int. Conf. Identif. Inf. Knowl. internet Things</source> <volume>202</volume> (<issue>January</issue>), <fpage>342</fpage>&#x2013;<lpage>347</lpage>. <pub-id pub-id-type="doi">10.1016/j.procs.2022.04.046</pub-id>
</mixed-citation>
</ref>
<ref id="B7">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Dai</surname>
<given-names>Yi</given-names>
</name>
<name>
<surname>Lu</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Huang</surname>
<given-names>Y.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>A blockchain-based access control system for secure and efficient hazardous material supply chains</article-title>. <source>Mathematics</source> <volume>12</volume> (<issue>17</issue>), <fpage>2702</fpage>. <pub-id pub-id-type="doi">10.3390/math12172702</pub-id>
</mixed-citation>
</ref>
<ref id="B8">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>De Oliveira</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Reis</surname>
<given-names>L. H. A.</given-names>
</name>
<name>
<surname>Verginadis</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Mattos</surname>
<given-names>D. M. F.</given-names>
</name>
<name>
<surname>Olabarriaga</surname>
<given-names>S. D.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>SmartAccess: attribute-based access control system for medical records based on smart contracts</article-title>. <source>IEEE Access</source> <volume>10</volume>, <fpage>117836</fpage>&#x2013;<lpage>117854</lpage>. <pub-id pub-id-type="doi">10.1109/ACCESS.2022.3217201</pub-id>
</mixed-citation>
</ref>
<ref id="B9">
<mixed-citation publication-type="book">
<person-group person-group-type="author">
<name>
<surname>Dong</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Xiang</surname>
<given-names>Y.</given-names>
</name>
</person-group> (<year>2020</year>). &#x201c;<article-title>BBM: a blockchain-based model for open banking via self-sovereign identity</article-title>,&#x201d; in <source>Blockchain &#x2013; ICBC 2020. Lecture notes in computer science</source>. Editors <person-group person-group-type="editor">
<name>
<surname>Chen</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Cui</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Palanisamy</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>L.-J.</given-names>
</name>
</person-group> (<publisher-loc>Cham</publisher-loc>: <publisher-name>Springer International Publishing</publisher-name>), <volume>12404</volume>, <fpage>61</fpage>&#x2013;<lpage>75</lpage>. <pub-id pub-id-type="doi">10.1007/978-3-030-59638-5_5</pub-id>
</mixed-citation>
</ref>
<ref id="B10">
<mixed-citation publication-type="web">
<collab>Facebook</collab> (<year>2023</year>). <article-title>Facebook</article-title>. <comment>Available online at: <ext-link ext-link-type="uri" xlink:href="https://www.facebook.com">https://www.facebook.com</ext-link> (Accessed August 1, 2023)</comment>.</mixed-citation>
</ref>
<ref id="B11">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Gupta</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Stoller</surname>
<given-names>S. D.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>Z.</given-names>
</name>
</person-group> (<year>2014</year>). <article-title>Abductive analysis of administrative policies in rule-based access control</article-title>. <source>IEEE Trans. Dependable Secure Comput.</source> <volume>11</volume> (<issue>5</issue>), <fpage>412</fpage>&#x2013;<lpage>424</lpage>. <pub-id pub-id-type="doi">10.1109/TDSC.2013.42</pub-id>
</mixed-citation>
</ref>
<ref id="B12">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Hammoud</surname>
<given-names>O.</given-names>
</name>
<name>
<surname>Tarkhanov</surname>
<given-names>I.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>A novel blockchain-integrated distributed data storage model with Built-in load balancing</article-title>. <pub-id pub-id-type="doi">10.1109/AICT55583.2022.10013548</pub-id>
</mixed-citation>
</ref>
<ref id="B13">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Hammoud</surname>
<given-names>O.</given-names>
</name>
<name>
<surname>Tarkhanov</surname>
<given-names>I.</given-names>
</name>
<name>
<surname>Kosmarski</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>An architecture for distributed electronic documents storage in decentralized blockchain B2B applications</article-title>. <source>Computers</source> <volume>10</volume> (<issue>11</issue>), <fpage>142</fpage>. <pub-id pub-id-type="doi">10.3390/computers10110142</pub-id>
</mixed-citation>
</ref>
<ref id="B14">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Han</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Sui</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Wu</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2025</year>). <article-title>A secure and efficient access-control scheme based on blockchain and CP-ABE for UAV swarm</article-title>. <source>Drones</source> <volume>9</volume> (<issue>2</issue>), <fpage>148</fpage>. <pub-id pub-id-type="doi">10.3390/drones9020148</pub-id>
</mixed-citation>
</ref>
<ref id="B15">
<mixed-citation publication-type="journal">
<collab>HYPERLEDGER</collab> (<year>2019</year>). <article-title>Hyperledger architecture, volume 1 introduction to hyperledger business blockchain design philosophy and consensus</article-title>. <source>Hyperledger Archit.</source> <volume>1</volume>. <comment>Available online at: <ext-link ext-link-type="uri" xlink:href="https://8112310.fs1.hubspotusercontent-na1.net/hubfs/8112310/Hyperledger/Offers/Hyperledger_Arch_WG_Paper_1_Consensus.pdf">https://8112310.fs1.hubspotusercontent-na1.net/hubfs/8112310/Hyperledger/Offers/Hyperledger_Arch_WG_Paper_1_Consensus.pdf</ext-link>.</comment>
</mixed-citation>
</ref>
<ref id="B16">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Iqbal</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Matulevicius</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Exploring sybil and double-spending risks in blockchain systems</article-title>. <source>IEEE Access</source> <volume>9</volume>, <fpage>76153</fpage>&#x2013;<lpage>76177</lpage>. <pub-id pub-id-type="doi">10.1109/access.2021.3081998</pub-id>
</mixed-citation>
</ref>
<ref id="B17">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Maesa</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Mori</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Ricci</surname>
<given-names>L.</given-names>
</name>
</person-group> (<year>2017</year>). <article-title>Blockchain based access control</article-title>. <pub-id pub-id-type="doi">10.1007/978-3-319-59665-5_15</pub-id>
</mixed-citation>
</ref>
<ref id="B18">
<mixed-citation publication-type="book">
<person-group person-group-type="author">
<name>
<surname>Masi</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Pugliese</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Tiezzi</surname>
<given-names>F.</given-names>
</name>
</person-group> (<year>2012</year>). &#x201c;<article-title>Formalisation and implementation of the XACML access control mechanism</article-title>,&#x201d; in <source>Engineering secure software and systems. Lecture notes in computer science</source>. Editors <person-group person-group-type="editor">
<name>
<surname>Barthe</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Livshits</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Scandariato</surname>
<given-names>R.</given-names>
</name>
</person-group> (<publisher-loc>Berlin, Heidelberg</publisher-loc>: <publisher-name>Springer</publisher-name>), <fpage>60</fpage>&#x2013;<lpage>74</lpage>. <pub-id pub-id-type="doi">10.1007/978-3-642-28166-2_7</pub-id>
</mixed-citation>
</ref>
<ref id="B19">
<mixed-citation publication-type="web">
<collab>Merkle Tree: A Fundamental Component of Blockchains&#x7c;IEEE Conference Publication&#x7c;IEEE Xplore</collab> (<year>2023</year>). <comment>Available online at: <ext-link ext-link-type="uri" xlink:href="https://ieeexplore.ieee.org/document/9588047">https://ieeexplore.ieee.org/document/9588047</ext-link> (Accessed September 30, 2023)</comment>.</mixed-citation>
</ref>
<ref id="B20">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Mudarri</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Abdo</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Al-Rabeei</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Security fundamentals: access control models</article-title>. <source>Interdiscip. Theory Pract</source>.</mixed-citation>
</ref>
<ref id="B21">
<mixed-citation publication-type="journal">
<collab>Obadah Hammoud</collab> (<year>n.d.</year>). <article-title>accessControl_Github</article-title>. <source>GitHub</source>. <comment>Available online at: <ext-link ext-link-type="uri" xlink:href="https://github.com/Obadah-H/DistributedFileSystem/tree/main/access_control">https://github.com/Obadah-H/DistributedFileSystem/tree/main/access_control</ext-link> (Accessed July 3, 2025)</comment>.</mixed-citation>
</ref>
<ref id="B22">
<mixed-citation publication-type="book">
<person-group person-group-type="author">
<name>
<surname>Paillisse</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Subira</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Lopez</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Rodriguez-Natal</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ermagan</surname>
<given-names>V.</given-names>
</name>
<name>
<surname>Maino</surname>
<given-names>F.</given-names>
</name>
<etal/>
</person-group> (<year>2019</year>). &#x201c;<article-title>Distributed access control with blockchain</article-title>,&#x201d; in <source>ICC 2019 - 2019 IEEE international conference on communications (ICC)</source>, <fpage>1</fpage>&#x2013;<lpage>6</lpage>. <pub-id pub-id-type="doi">10.1109/ICC.2019.8761995</pub-id>
</mixed-citation>
</ref>
<ref id="B23">
<mixed-citation publication-type="book">
<person-group person-group-type="author">
<name>
<surname>Shostack</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2014</year>). <source>Threat modeling: designing for security</source>. <publisher-loc>Indianapolis</publisher-loc>: <publisher-name>Wiley</publisher-name>.</mixed-citation>
</ref>
<ref id="B24">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sun</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Du</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>W.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Blockchain-based IoT access control system: towards security, lightweight, and cross-domain</article-title>. <source>IEEE Access</source> <volume>9</volume>, <fpage>36868</fpage>&#x2013;<lpage>36878</lpage>. <pub-id pub-id-type="doi">10.1109/ACCESS.2021.3059863</pub-id>
</mixed-citation>
</ref>
<ref id="B25">
<mixed-citation publication-type="book">
<person-group person-group-type="author">
<name>
<surname>Tarjan</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>1971</year>). &#x201c;<article-title>Depth-first search and linear graph algorithms</article-title>,&#x201d; in <source>12th annual symposium on switching and automata theory (swat 1971)</source>, <fpage>114</fpage>&#x2013;<lpage>121</lpage>. <pub-id pub-id-type="doi">10.1109/SWAT.1971.10</pub-id>
</mixed-citation>
</ref>
<ref id="B26">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Tarkhanov</surname>
<given-names>I.</given-names>
</name>
</person-group> (<year>2016</year>). <article-title>Extension of access control policy in secure role-based workflow model</article-title>. <pub-id pub-id-type="doi">10.1109/ICAICT.2016.7991691</pub-id>
</mixed-citation>
</ref>
<ref id="B27">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Wang</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>Y.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>A blockchain-based framework for data sharing with fine-grained access control in decentralized storage systems</article-title>. <source>IEEE Access</source> <volume>6</volume>, <fpage>38437</fpage>&#x2013;<lpage>38450</lpage>. <pub-id pub-id-type="doi">10.1109/ACCESS.2018.2851611</pub-id>
</mixed-citation>
</ref>
<ref id="B28">
<mixed-citation publication-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Kasahara</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Shen</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Jiang</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Wan</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2019</year>). <article-title>Smart contract-based access control for the internet of things</article-title>. <source>IEEE Internet Things J.</source> <volume>6</volume> (<issue>2</issue>), <fpage>1594</fpage>&#x2013;<lpage>1605</lpage>. <pub-id pub-id-type="doi">10.1109/JIOT.2018.2847705</pub-id>
</mixed-citation>
</ref>
</ref-list>
</back>
</article>
