Paper.tex 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. \documentclass{article}
  2. \usepackage{amsfonts,amssymb,amsmath}
  3. \usepackage[scale=0.75]{geometry}
  4. \usepackage{hyperref}
  5. \title{Blocktree \\
  6. \large A platform for distributed computing.}
  7. \author{Matthew Carr}
  8. \date{May 28, 2022}
  9. \begin{document}
  10. \maketitle
  11. \begin{abstract}
  12. Blocktree is a platform which aims to make developing reliable distributed systems easy and safe.
  13. It does this by defining a format for data stored in the system, a mechanism for replicating
  14. that data, and a programming interface for accessing it. It aims to solve the difficult problems
  15. of cryptographic key management, consensus, and global addressing so that user code can focus on
  16. solving problems germane to their application.
  17. \end{abstract}
  18. \section{Introduction}
  19. The online services that users currently have access to are incredible. They handle all
  20. the details of backing up user data and implementing access controls to facilitate
  21. safe sharing. However, because these are closed systems, users are forced to trust that
  22. the operators are benevolent, and they lack any real way of ensuring that the access
  23. control they prescribe will actually be enforced. There have been several systems proposed
  24. as an alternative to the conventional model, but these systems suffer from several shortcommings.
  25. They either assume the need for cloud storage providers (Blockstack) or implement all operations
  26. using a global blockchain, limiting performance (FileCoin). Blocktree takes a different approach.
  27. The idea behind blocktree is to organize a user's computers into a cooperative unit, called a
  28. blocktree. The user is said to own the blocktree, and they wield soveriegn authority over it.
  29. The artifact granting them this authority is the root private key for the blocktree. Measures for protecting
  30. this key and delegating its authority are important design considerations of the system.
  31. The owners of blocktrees are encouraged to collaborate with each to store data by
  32. means of a cryptocurrency known as blockcoin. The blockchain implementing this cryptocurrency
  33. is the source of global state for the system, and allows for the creation of global paths.
  34. All data stored in blocktree is contained in units called blocks. The blocks in a blocktree, of
  35. course, form a tree. Each block has a path corresponding to its location in the tree. The first
  36. component of a fully qualified block tree path is the fingerprint of the root public key of the
  37. blocktree. Thus a blocktree path can globally specify a block. If a block is not a leaf,
  38. then it is called a directory, and the data it contains is managed by the system,
  39. including the list of blocks which are children of the block. In addition to its payload of data,
  40. each block has a header containing cryptographic access control mechanisms. These mechanisms ensure
  41. that only authorized users can read or optionally write to the block.
  42. Users and nodes in the blocktree system are identified by hashes of their public keys. These hashes
  43. are referred to as principals, as they are the units used for setting access control policy.
  44. This remainder of this paper is as follows:
  45. \begin{itemize}
  46. \item A description of the operations of a single blocktree.
  47. \item The definition of a blockchain which provides global state and links individual blocktrees
  48. together.
  49. \item The programming interface for interacting with blocktrees and sending messages.
  50. \item An exploration of applications that could be written using this platform.
  51. \item Conclusion.
  52. \end{itemize}
  53. \section{An Individual Blocktree}
  54. The atomic unit of data storage, confidentiality and authenticity is called a block. A
  55. block contains a payload of data. Confidentiality of this data is achieved by encrypting it using
  56. a symmetric cipher using a random key. This random key is known as the block key.
  57. The block key is encapsualated using the public key of the principal whose is being given access.
  58. The resulting cipher text is stored in the header of the block. Thus
  59. the person possessing the corresponding private key will be able to access the contents of
  60. the block. Blocks are arranged into trees, and the parent of the block also has a block key.
  61. The child's block key is always encapsulated using the parent's key and stored in the block
  62. header. This ensures that if a principal is given access to a block, they automatically have
  63. access to every child of that block. The encapsulated block key is known as a read capability,
  64. or readcap, as it grants the holder the ability to read the block.
  65. Authenticity guarantees are provided using a digital signature scheme. In order to change the
  66. contents of a block a data structure called a write capability, or writecap, is needed. A
  67. writecap is approximately an x509 certificate chain. A writecap contains the following data:
  68. \begin{itemize}
  69. \item The path the writecap can be used under.
  70. \item The principal that the writecap was issued to.
  71. \item The timestamp when the writecap expires.
  72. \item The public key of the principal who issued the writecap.
  73. \item A digital signature produced by the private key corresponding to the above public key.
  74. \item Optionally, the next writecap in the chain.
  75. \end{itemize}
  76. The last item is only excluded in the case of a self-signed writecap, i.e. one that was signed by
  77. the same principal it was issued to. A writecap is considered valid for use on a block if all
  78. of the following conditions are true:
  79. \begin{itemize}
  80. \item The signature on every writecap in the chain is valid.
  81. \item The signing principal matches the principal the next writecap was issued to for every
  82. write cap in the chain.
  83. \item The path of the block is contained in the path of every writecap in the chain.
  84. \item The current timestamp is strictly less than the expiration of all the writecaps in the
  85. chain.
  86. \item The principal corresponding to public key used to sign the last writecap in the chain,
  87. is the owner of the blocktree.
  88. \end{itemize}
  89. The intuition behind these rules is that a writecap is only valid if there is a chain of trust
  90. that leads back to the owner of the block tree. The owner may delegate their trust to any number
  91. of intermediaries by issuing them writecaps. These writecaps are scoped based on the path
  92. specified when they are issued. These intermediaries can then delegate this trust as well.
  93. A block is considered valid if it contains a valid writecap, it was signed using the key
  94. corresponding to the first writecap's public key, and this signature is valid.
  95. Blocks are used for more than just orgnaizing data, they also organize computation. A program
  96. participating in the blocktree network is referred to as a node. Multiple nodes may be run on
  97. a single computer. Every node is attached to the blocktree at a specific path. This information
  98. is recorded in the block where the node is attached. A node is responsible for the storage of
  99. the block where it is attached and the blocks that are descended from this block, unless there
  100. is another node attached to a descendent block.
  101. In this way data storage can be delegated, allowing
  102. the system to scale. When more than one node is attached to the same block they form a cluster.
  103. Each node in the cluster contains a copy of the data that the cluster is reponsible for. They
  104. maintain consistency of this data by running the Raft consensus protocol.
  105. Every blocktree requires at least one node attached to the root block to function. The nodes
  106. in the root block contain the user's private key. For security, it is highly recommended that
  107. this key be stored in a Trusted Platform Module (TPM), and that the TPM be configured to disallow
  108. unauthenticate key use. As it is envisioned for multiple nodes to run on a single computer,
  109. thus sharing a single TPM, this last point is particularly important. Even though these nodes
  110. contain the root key, they do not use it for most operations, and instead use the scheme described
  111. in the next paragraph to obtain their own credentials.
  112. When a new node is created, it generates a new public-private key pair. The public key of this
  113. node then needs to be transmitted to another node that's already part of the user's blocktree. The
  114. mechanism used will depend on the nature of the device on which the node is running, and is
  115. outside the scope of this description. For example, a phone could scan a QR code which contains
  116. the IP address of the user's root node, and then transmit its public key to that internet host.
  117. In order for the new node to be added to the user's blocktree, it needs to be issued a writecap
  118. and the block where it will attach needs to have a readcap added.
  119. This could be accomplished
  120. by providing a user interface on the node which received the public key from the new node.
  121. This interface would show the user the requests that have been received from new nodes attempting
  122. to join their blocktree. The user can then choose to approve or deny the request, and can specify
  123. the path where the node will attach. If the user chooses to approve the request, they are
  124. prompted for the root password. This is used to send an authenticated signing request to the TPM on
  125. the node containing the user's root key. If the password is correct, the TPM will sign the requested
  126. data, producing a valid writecap, which the node can then send back to the new node.
  127. The ability to cope with key compromise is an important design consideration in any real-world
  128. cryptosystem. In blocktree the compromise of a node key is handled by re-keying every block under
  129. the block where the node was attached. Specifically, this means that a new block key is generated for
  130. each block, and the readcap for the compromised node is removed. This ensures that new writes to
  131. these blocks will not be visible to the holder of the compromised key. To ensure that writes
  132. will not be allowed, the root directory contains a revokation list containing the public keys
  133. which have been revoked by the tree. These only need to be maintained until their writecaps
  134. expire, after which time the list can be cleaned. Note that if the root private key is compromised or lost,
  135. then the blocktree must be abandoned, there is no recovery. This is real security, the artifact
  136. which grants control over the blocktree is the root private key. That is why storing the root
  137. private key in multiple secure cryptographic co-processors is so important.
  138. A concept that has proven to be very useful in the world of filesystems is the symbolic link.
  139. This is a short file that contains the path to another file, and is interpreted by most programs
  140. as being a "link" to that file. Blocktree supports a similar system, where a block can be
  141. marked as a symbolic link when its body contains a blocktree path. This also provides us with
  142. a convenient way of storing readcaps for data that a node would otherwise not have access to.
  143. For instance a symbolic link could be created which points to a block in another user's blocktree.
  144. The other user only knows the public key of the owner of our blocktree, so they issue
  145. a readcap to it. But the root nodes, when given the user's password, can open this readcap and extract
  146. the block key. This key can then be encapsulated using he public key of the node which
  147. requires access, and placed in the symbolic link. When the node needs to read the data
  148. in the block, it opens the readcap in the symbolic link, follows the link to the block (how
  149. that actually happens will be discussed below) and decrypts its contents.
  150. While the consistency of an individual block can be maintained using Raft, in order to enable
  151. transactions which span multiple blocks a distributed locking mechanism is employed. This is
  152. accomplished by exploiting hierarchical arrangement of nodes in the tree. In order to describe
  153. this, its first helpful to define a new term. The \emph{nodetree} of a blocktree is tree obtained
  154. from the blocktree by collapsing all the blocks that a node (or cluster of nodes) is responsible
  155. for into a single logical block representing the node itself. Thus we can talk about the node
  156. which is the parent of another node, and by these we mean it is the parent of the node in the
  157. nodetree. What this means in terms of the blocktree is that it is the first node encountered
  158. when one traverses the path from the current block back to the root. Now, distributed locking
  159. works as follows:
  160. \begin{itemize}
  161. \item A node sends a request to lock a block to the current concensus leader in its cluster.
  162. If the node is not part of a cluster, then it is the leader. This request contains a timestamp
  163. for when the lock expires, preventing the situation where a lock is never released.
  164. \item If the leader is responsible for the block then it moves on to the next step. Otherwise
  165. it contacts its parent and forwards the lock request and this step is repeated for the parent.
  166. \item The responsible node checks to see if there is already a lock for this block. If there is
  167. then the request fails. Otherwise the request succeeds and a lock is placed on the block. A
  168. message indicating the result is then pass back up the tree ending at the orignal node. This
  169. message includes the principal of the node enforcing the lock.
  170. \item Once the locking node is done making its updates it sends a message directly to the node
  171. enforcing the lock, causing it to remove the lock.
  172. \end{itemize}
  173. Locking a block locks the subtree rooted at that block. Thus no writes to any path contained in
  174. the path of the locked block will be allowed, unless they come from locking node. If the locking
  175. node does not send the message
  176. unlocking the block before the lock expires, then the modifications which had been performed by
  177. it are dropped and the block reverts to its prior state. Since the locking node is the leader
  178. of the consensus cluster that is responsible for the block's, this guarantees that
  179. writes from other nodes will not be accepted.
  180. \section{Connecting Blocktrees}
  181. In order to allow nodes to access blocks in other blocktrees, a global ledger of events is used.
  182. This ledger is implemented using a proof of work (PoW) blockchain and a corresponding
  183. cryptocurrency known as blockcoin. Nodes mine chain blocks (not to be confused with the tree
  184. blocks we've been discussing up till now) in the same way they do in other PoW blockchain
  185. systems such as BitCoin. The node which manages to mine the next chain block receives a reward,
  186. which is the sum of the fees for each event in the chain and a variable amount of newly minted
  187. blockcoin. The amount of new blockcoin created by a chain block is directly proportional to the
  188. amount of data storage events contained in the chain block. Thus the total amount of blockcoin
  189. in circulation has a direct relationship to the amount of data stored in the system, reflecting
  190. the fact that blockcoin exists to provide and accounting mechanism for data stored in the system.
  191. When a node writes data to a tree block, and it wishes this block to be globally accessible, then
  192. it produces what are called fragments. Fragments are the output symbols from an Erasure Coding
  193. algorithm (such as the RaptorQ code). These algorithms are a class of fountain codes which have
  194. the property that only $m$ out of $n$ (where $m < n$) symbols are needed to reconstruct the
  195. original data. Such a code ensures that even if some of the fragments are lost, as long as $m$
  196. remain, the original data can be recovered.
  197. Once these fragments have been computed an event is created for each one and published to the
  198. blockchain. This event indicates to other nodes that this node wishes to store a fragment and
  199. states the amount of blockcoin it will pay and the frequency it will make these payments. When
  200. another nodes wishes to accept the offer, it directly contacts the first node, who then sends
  201. it the fragment an publishes and event stating that the fragment is stored with the second
  202. node. This event includes the path of the block the fragment was computed from, the fragment's
  203. ID (the sequence number from the erasure code), and the principal of the node which stored it.
  204. Thus any other node in the network can use the information contained in these events to
  205. determine the set of nodes which contain the fragments of any given path.
  206. In order for the node which stored a fragment to receive its next payment, it has to pass
  207. a time-bound challenge-response protocol initiated by the node that ownes the fragment.
  208. The owning node select a leaf in the Merkel tree of the fragment and sends the index of
  209. this leaf to the storing node. The storing node then walks the path from this leaf back to
  210. the root of the Merkle tree, and updates a hash value using the data in each node it traverses.
  211. It sends this result back to the owning node who then verifies that this value matches its
  212. own computation. If it does then the owning node signs a message indicating that the challenge
  213. passed and that the storing node should be paid. The storing node recives this message and uses
  214. it to construct an event, which it signs and publishes to the blocktree. This event causes
  215. the blockcoin amount specified to be withdrawn from the owning node's account and deposited
  216. into storing nodes account.
  217. The fact that payments occur over time provides a simple incentive for nodes to be honest and
  218. store the data they agree to. In banking terms, the storing node views the fragment as an
  219. asset, it is a loan of its disk space which provides a series of payments over time.
  220. On the other hand the owning node views the fragment as a liability, it requires payments to
  221. be made over time. In order for a blocktree owner to remain solvent, it must balance its
  222. liabitlies with its assets, incentivizing it to store data for others so that its own data
  223. will be stored.
  224. In order for nodes to be able to contact other nodes, a mechanism is required for associating
  225. an internet protocol (IP) address with a principal. This is done by having nodes publish events
  226. to the blockchain when their IP address changes. This event includes their new IP address,
  227. their public key, and a digital signature computed using their private key. Other nodes can
  228. then verify this signature to ensure that an attacker cannot bind the wrong
  229. IP address to a principal in order to receive messages it was not meant to have.
  230. While this event ledger is useful for appending new
  231. events, and ensuring that previous events
  232. cannot be changed, another data structure is required to ensure that queries on this data can
  233. be performed efficiently. In particular, it's important to be able to quickly perform the
  234. following queries:
  235. \begin{itemize}
  236. \item Find the set of nodes storing the fragments for a given path.
  237. \item Find the IP address of a node or owner given a principal.
  238. \item Find the public key associated with a principal.
  239. \end{itemize}
  240. To enable these queries a special blocktree is maintained by each node in the network: the global blocktree.
  241. This tree does not support the usual writing and locking sematics of local blocktrees. It can be thought of as
  242. a left fold of all of the events in the blockchain, where each event is processed by updating blocks in the
  243. global tree appropriately. The above queries are facilitate by the following blocks:
  244. \begin{itemize}
  245. \item \emph{/global/fragments}: this block contains a hashtable where the key is a path and the value is the list
  246. of nodes storing the fragments for the block at that path.
  247. \item \emph{/global/principals}: contains a hashtable where the key is the a principal and the value is the tuple
  248. contining the public key of that principal, its current IP address, and its current blockcoin balance.
  249. \end{itemize}
  250. To compute the entries in these tree blocks, the nodes in the network iterate over all the chain blocks, updating
  251. their local copy of each tree block approriately. The experienced reader will recognize that this is an event
  252. sourced architecture. At this time only the two tree blocks are known to be needed, but if new events need to be
  253. added to the system it's easy to see that this system can be used for creating other data structures enabling
  254. queries that we have yet to envision. One such extension is the registration of globally unique names, which will
  255. be the focus of future work.
  256. \section{Programming Environment}
  257. Enabling an excellent developer experience is one of the primary goals of this system (the others being security
  258. and scaleability). Nodes execute user code that has been compiled into WebAssembly modules. Such code
  259. running on a blocktree node is referred to as an "app". An app
  260. executes in a sandbox that isolates it from other code, as well as the security critical operations of the node
  261. itself. The sandbox provides the code with an extension of the WebAssembly System Interface (WASI), with extra
  262. system calls to interact with the particulars of the blocktree system. The stadard WASI filesystem APIs are used
  263. to interact with the contents of blocktrees. For instance a file descriptor for a remote block can be obtained
  264. by calling path\_open. Writes and reads of blocks are performed using the privledges of the node on which
  265. the app is running. The extra system calls fall into three categories:
  266. \begin{itemize}
  267. \item Distributed Locking
  268. \item Messaging
  269. \item Supervision Trees
  270. \item Protocol Contracts (Session Types)
  271. \end{itemize}
  272. When an app is installed it is given a block under which it can store data that is shared between all nodes
  273. in the blocktree. The path of this block is formed by prefixing the path the app was published at
  274. with the string "/apps". When an app is installed on a particular node, it is run in a block contained
  275. in the node's block. It can read and write blocks in this block, and to allow it to access shared data,
  276. a symbolic link is created to the app's block in "/apps".
  277. % App Publishing
  278. These apps are, of course, distributed in a blocktree. The path of the block used to publish the app is used to
  279. identify the app, and must be unique. The block containing the app contains the WebAssembly module itself as
  280. well as JSON file containing the app's manifest. This manifest defines the app's name as well as the list
  281. of permissions it requires. This list of persmissions is used to determine which APIs the app will have access to.
  282. % Privacy Safe vs Unsafe
  283. Apps are broken into two large categories: those that are privacy safe and those that are not.
  284. An app is privacy unsafe if it requests any permissions which allow it to send data
  285. to any node that is not part of the blocktree in which it's running. Thus request the ability to
  286. open a TCP socket would cause an app to be privacy unsafe. Similarly the creation of a protocol handler for
  287. HTTP would also be privacy unsafe. Privacy unsafe apps can limit the scope of their unsafety by
  288. imposing limits on the unsafe APIs that they request. For instance an app which needs to send
  289. blocktree message back to the blocktree it was published in can request the messaging permission
  290. for a path in this tree. Similarly, an app which only wants to open a TCP socket listening on the
  291. local network, can limit the scope of its requested permission.
  292. % Protocol Contracts
  293. In order to make it easy to write apps which interface with existing systems, most notably
  294. those using HTTP, apps are able to define protocols using a contract language and then register
  295. call backs for these protocols. This works by providing a system call which the app can
  296. supply a protocol contract to. This contract is then compiled into a state machine by the node
  297. and a handle is returned to the app. This handle is then used to register callbacks for different
  298. parts of the protocol. This ensures that the protocol is handled by the node itself and that
  299. protocols can be shared between many different apps as a library. For instance, the HTTP protocol
  300. would be compiled to a particularly simply state maching, with only one state: the listening state.
  301. This state would expose a hook that where a callback can be registered to handle the request.
  302. This state also defines the record format used to pass the request information to the callback
  303. and the record format of the return value that is expected in order to produce the response.
  304. More complicated (stateful) protocols would more states, each defining their own request and
  305. response records, as well as hooks. One nice thing about this setup is that it will enable
  306. optimizations where the state machine and the user callbacks can be compiled into a program
  307. which can be safely run in the node itself, or even in a SmartNIC. This would require that
  308. the callbacks only use an approved set of APIs, but it can enable much higher performance
  309. network services.
  310. % Supervision Trees
  311. Apps can also arrange themselves into supervision trees, in the same way that Erlang
  312. processes are arranged. In this scheme, when a child app crashes, or the node its
  313. running on dies (which is detected by the node), then the app receives a message. In the
  314. simplest case this can be used to implement a logging system, where crashes and node
  315. deaths are recorded. More interestingly, this could be used to integrate with a control
  316. plan. For instance, if a blocktree were running in AWS, when a message is recevied indicating
  317. that a node has died a new EC2 instance could be started to replace it. Of course these
  318. are just two of the potential applications of this mechanism. The reliability of Erlang
  319. and other system employing the Actor Model have shown the robustness of this approach.
  320. \section{A Brave New Web}
  321. In order to explore how this system can be used, the design of several hypothetical systems
  322. is discussed. It's important to note that blocktree does not try to force all compuatation
  323. to be local to a user's device, it merely trys to enable this for applications where it
  324. is possible.
  325. \subsection{Contacts and Mail}
  326. The first application we'll consider is one which manages a user's contacts. This would expose
  327. the usual CRUD operations, allowing a user to input the name of a person they know and associate
  328. that name with their public key. Once the principal of a person is known, then their public
  329. key can be looked up in the global blocktree. This principal needs to be communicated to the
  330. user via some out-of-band method. They could receive it in an email, a text message, or embedded
  331. in a QR code. Of course this out-of-band communications needs to be authenticated, otherwise
  332. it would be easy to fool the user into associating an attacker's key for the person.
  333. The user now has a way of associating a blocktree with the name of this person. However, the
  334. root public key of this block tree is not enough to establish secure communications, because
  335. the root private key is not avialable to every node in the person's blocktree. In particular
  336. it would be inadvisable for the root private key to be stored on a user's mobile device,
  337. so a message encrypted using the root public key would not be readable on this device. To
  338. address this mailbox blocks are created.
  339. For each contact two blocks are created: the inbox and the outbox. The user creates a readcap
  340. for the person and adds it to the outbox. The inbox is a symbolic link to the user's outbox in
  341. the blocktree of the person. Thus each person can read messages sent to them using their readcap,
  342. and they can write messages into their own blocktree where the other party knows how to find them.
  343. Now to solve the problem outlined above, the person needs to give permission to a node in their
  344. blocktree in order for it to read messages from the user. It does this by creating a new readcap
  345. for the node, containing the block key in the readcap it was issued. It then stores that
  346. readcap in the symbolic link in its blocktree (the inbox for the user). When the person uses
  347. their mobile to read messages from the user, it looks at the union of the readcaps in the
  348. symbolic link and the inbox. Once it finds the one for its principal, it decryptes the block key
  349. and uses it to decypher the contents of the inbox.
  350. In addition to being able to check its inbox for messages, the person also receives a blocktree
  351. message from the user when a new message is sent. This means that the person doesn't need to
  352. constantly poll the inbox to see if it has new messages, it can be assured it will be
  353. notified.
  354. \subsection{Social Network}
  355. Building a social network on top of the contacts app is fairly straight-forward. Once
  356. an contacts entry has been created for a person, most interactions between the user and that
  357. person can be implemented via messages passed between their mailboxes. For example, when the
  358. user sends a direct message to the person a message is placed in the outbox for that person
  359. and a blocktree message is sent to the root cluster of their blocktree. If this message was
  360. meant for a group of people it could placed in the outboxes of each one. These messages need
  361. not be restricted to text, images, video, or any other kind of data could be included in them.
  362. If a large amount of data is to be shared this way (for instance a video), then it makes sense
  363. to only include the blocktree path to it in the notification messages sent to the recipients.
  364. This same mechanism can be used to implement status updates. When a user updates their status,
  365. they send mail to each of their "friends". The social networking app running on each of the contacts'
  366. devices will then display the latest status update from the user as their current status. This
  367. setup allows the user to "unfriend" anyone by simply omitting them from the list of recipients
  368. of these updates. To allow comments and likes on the status update to be visible to everyone
  369. that it was shared with, the block created in the outbox of each of the friends
  370. is a symbolic link to a single status update block. This symbolic link contains the
  371. readcap for the status update block.
  372. Comments and likes on status updates are implemented by sending mail to the user who posted the
  373. update. When one of the user's nodes recieves this mail, it then updates the block containing
  374. the status update with the new comment, or increments the like counter (dislikes should not be supported IMHO).
  375. It then sends a blocktree message to the people this status update was shared with notifiying them
  376. that the data has changed.
  377. \subsection{An ecomerce website.}
  378. The previous two examples show how to build decentralized versions of existing web applications,
  379. but blocktree also excells at building traditional web applications. Imagine an ecommerce website,
  380. with multiple warehouses, all of whose inventory is to be visible to customers of the site. Part
  381. of the design consideration for the site is that the warehouses need to be able to update their
  382. inventory even when their internet service goes down, and that these updates need to be visible
  383. on the website once connectivity is restored.
  384. To accomplish this a designer could create a directory for each warehouse. This directory would have
  385. nodes attached to it that are physically located at each warehouse. The inventory of the warehouse
  386. is then maintained in the warehouse's directory, satisfying the first requirement. Now, in order to
  387. enable efficient queries of the overall available inventory, the data from each of the warehouses
  388. needs to be merged. This is accomplished by creating another directory containing the merged data.
  389. In event sourcing terms this is called a read-model. This directory will have another cluster of nodes attached
  390. which will act as web servers. These nodes will subscribe to events published by the warehouse
  391. clusters, events indicating chaging levels of inventory, and digest this information into a format
  392. that can be efficiently queried. When a warehouse goes offline, it previous levels of inventory are
  393. still recorded in the read-model, so queries can still be answered using the cluster best knowledge
  394. of the warehouse. Once the warehouse comes back online, then the events that were recorded by the
  395. warehouse cluster while it was offline can be replayed to the web server cluster, and their read-model
  396. can be brought up to date.
  397. One of the advantages of this approach is that the cluster of webservers need not be physically
  398. close to each other. In fact they could be spread over several datacenters, or even in different
  399. cloud providers. This allows for greater fault tolerance and reliability. Of course, running a
  400. consenus cluster over a larger area means more latency and thus reduced performance, but if
  401. the workload is read-heavy, and writes can be handled in the warehouse clusters, then this
  402. tradeoff may be worthwhile.
  403. I hope this example shows that having a standard format for data and the federation of servers,
  404. can provide designers with much greater flexibility, even if they do not care about decentralization
  405. or their user's privacy.
  406. \subsection{The Open Metaverse}
  407. As a final example I'd like to consider a platform for recording spacial information. The key insight
  408. that enables this is very general: blocktree enables the creation of distributed tree-like data structures.
  409. For instance, its straight forward to imagine creating a distributed hashtable implemented as a red-black tree.
  410. This impedence match between efficient query structures and the design of blocktree is one
  411. of the reasons why I believe it is so useful. The particular datastructure germane to building the metaverse
  412. is the Binary Space Partition (BSP) tree.
  413. I don't see the metaverse as being one world, but rather many. Each world would be hosted by its own blocktree.
  414. The world will have a directory in the blocktree, that directory will be the root of a BSP. Thinking of worlds
  415. like ours, those that can be resonably approximated as the surface of a sphere, we can impose the usual latitude
  416. and longitude coordinate system. We can then define parcels in the world by specifying the polygonal boundary as
  417. a set of these coordinates (more preciesely, the parcel is the convex hull of this set of points). These parcels
  418. are then recorded as blocks in the world's directory, whose path is determined by its virtual location. If a parcel
  419. is owned by the same user who owns the world, then the data contained in the parcel is stored in
  420. the same blocktree. However, if a parcel is to be owned by another user, then a symbollic link is created
  421. pointing to a block in the owner's blocktree. They can then write whatever data they want into this block, defining
  422. the contents of their parcel. Collaboration on a single parcel is accomplished by issuing a writecap to
  423. another user.
  424. It's easy to imagine that one world would be more important than the rest and that he creation of a metaverse
  425. representation of Earth will be an important undertaking. The hierarchical nature of permissions in blocktree
  426. make such a shared world possible. National blocktrees could be given ownership of their virtual territory,
  427. this would then
  428. be delegated down to the state and municipal levels. Finally municipalities would delegate individual parcels
  429. to their actual owners. Owners could then use these as they see fit, including leasing them to third parties.
  430. The ending date of such a lease would be enforced technically by the writecap issued to the lessee; when it
  431. expires so too does the lease.
  432. \section{Conclusion}
  433. In this paper I have given the outline of a decentralized method of organizing information, computation,
  434. and trust in a way that I hope will be useful and easy to use. The use of cryptographic primitives for
  435. implementing access control were discussed, as well as methods of protecting private keys. A blockchain
  436. and corresponding cryptocurrency was proposed as a means of incentivizing the distribution of data.
  437. Erasure coding was used to ensure that distributed data could be reslient to the loss of nodes and
  438. reconstructed efficiently. A programming environment based on WASM and WASI was proposed as a way
  439. of providing an interface to this data. APIs for defining protocol contracts and efficient web servers
  440. were indicated. APIs for constructing supervision trees were mentioned as a means for building reliable
  441. systems.
  442. When Sir Tim Berners-Lee invented HTTP he could not have anticipated the applications
  443. that his inventions would bring about. It has been said that the key to the success of his system is
  444. that it made networking programming so easy that anyone could do it. I don't know what the future will
  445. bring, but I hope that this system, or one like it, will enable anyone to fearlessly build distributed
  446. systems.
  447. One thing is certain however, it is a moral imperative that we provide users with viable alternatives
  448. to online services which harvest their data and weaponize it against them. Only then will the web
  449. become the place it was meant to be.
  450. \end{document}