<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
<!-- Begin Jekyll SEO tag v2.5.0 -->
< title > Overview of the Atlas network | Blockstack< / title >
< meta name = "generator" content = "Jekyll v3.8.3" / >
< meta property = "og:title" content = "Overview of the Atlas network" / >
< meta name = "author" content = "Blockstack" / >
< meta property = "og:locale" content = "en_US" / >
< meta name = "description" content = "Overview of the Atlas network" / >
< meta property = "og:description" content = "Overview of the Atlas network" / >
< link rel = "canonical" href = "https://zbabystack.netlify.com/core/auth/overview.html" / >
< meta property = "og:url" content = "https://zbabystack.netlify.com/core/auth/overview.html" / >
< meta property = "og:site_name" content = "Blockstack" / >
< meta property = "og:type" content = "article" / >
< meta property = "article:published_time" content = "2018-09-05T15:55:10-07:00" / >
< script type = "application/ld+json" >
{"description":"Overview of the Atlas network","author":{"@type":"Person","name":"Blockstack"},"@type":"BlogPosting","url":"https://zbabystack.netlify.com/core/auth/overview.html","headline":"Overview of the Atlas network","dateModified":"2018-09-05T15:55:10-07:00","datePublished":"2018-09-05T15:55:10-07:00","mainEntityOfPage":{"@type":"WebPage","@id":"https://zbabystack.netlify.com/core/auth/overview.html"},"@context":"http://schema.org"}< / script >
<!-- End Jekyll SEO tag -->
<!-- <meta property="og:image" content="https://zbabystack.netlify.com/assets/posts/logo.png"/> -->
< meta property = "og:image" content = "/assets/posts/logo.png" / >
< link rel = "stylesheet" href = "/assets/css/main.css" >
< link rel = "shortcut icon" type = "image/png" href = "/assets/img/touch-icon.png" >
< link rel = "alternate" type = "application/rss+xml" title = "Blockstack" href = "/feed.xml" >
< script src = "/assets/js/main.js" > < / script >
< / head >
< body >
< header class = "uk-background-secondary" >
< div data-uk-sticky = "sel-target: .uk-navbar-container; cls-active: uk-navbar-sticky" class = "uk-sticky uk-sticky-fixed" style = "position: fixed; top: 0px; width: 1904px;" >
< nav class = "uk-navbar-container" >
< div class = "uk-container" >
< div data-uk-navbar >
< div class = "uk-navbar-left" >
<!-- <a class="uk - navbar - item uk - logo" href="/"><img src="https://zbabystack.netlify.com/assets/posts/logo.png" alt="Docs"></a> -->
< a class = "uk-navbar-item uk-logo" href = "/" > < img src = "/assets/posts/logo.png" alt = "Docs" > < / a >
< / div >
< div class = "uk-navbar-right" >
< ul class = "uk-navbar-nav uk-visible@m" >
< li > < a href = "https://blockstack.org" target = "_blank" > Blockstack.org< / a > < / li >
< li > < a href = "https://forum.blockstack.org/" target = "_blank" > Forums< / a > < / li >
< li > < a href = "https://github.com/blockstack" target = "_blank" > GitHub< / a > < / li >
< / ul >
< div >
< a class = "uk-navbar-toggle" uk-search-icon href = "#" > < / a >
< div class = "uk-drop uk-background-default uk-border-rounded" uk-drop = "mode: click; pos: left-center; offset: 0" >
< form class = "uk-search uk-search-navbar uk-width-1-1" onsubmit = "return false;" >
< input id = "searchBox" class = "uk-search-input" type = "search" placeholder = "Search..." autofocus >
< / form >
< ul id = "searchBox-results" class = "uk-position-absolute uk-width-1-1 uk-list" > < / ul >
< / div >
< / div >
< a class = "uk-navbar-toggle uk-hidden@m" href = "#offcanvas" data-uk-navbar-toggle-icon data-uk-toggle > < / a >
< / div >
< / div >
< / div >
< / nav >
< / div >
< / header >
< div class = "uk-section" >
< div class = "uk-container" >
< div class = "uk-grid-large" data-uk-grid >
< div class = "sidebar-fixed-width uk-visible@m" >
< div class = "sidebar-docs uk-position-fixed" >
<!-- -->
< ul class = "uk-nav uk-nav-default doc-nav" >
<!-- -->
< li class = "uk-active" > < a href = "/core/auth/overview.html" > Overview of the Atlas network< / a > < / li >
<!-- -->
< li class = "" > < a href = "/core/auth/howitworks.html" > How Atlas Works< / a > < / li >
<!-- -->
< li class = "" > < a href = "/core/auth/howtouse.html" > How to Use the Atlas Network< / a > < / li >
< / ul >
<!-- -->
< / div >
< / div >
< div class = "uk-width-1-1 uk-width-expand@m" >
< article class = "uk-article" >
< h1 class = "uk-article-title" > Overview of the Atlas network< / h1 >
< div class = "uk-article-meta uk-margin-top uk-margin-medium-bottom" >
<!-- <img class="avatar avatar - small" alt="Blockstack" width="32" height="32" data - proofer - ignore="true" src="https://avatars2.githubusercontent.com/Blockstack?v=3&s=32" srcset="https://avatars2.githubusercontent.com/Blockstack?v=3&s=32 1x, https://avatars2.githubusercontent.com/Blockstack?v=3&s=64 2x, https://avatars2.githubusercontent.com/Blockstack?v=3&s=96 3x, https://avatars2.githubusercontent.com/Blockstack?v=3&s=128 4x" /> -->
<!-- Written by <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">Blockstack</span></span><br> -->
< time datetime = "2018-09-05T15:55:10-07:00" itemprop = "datePublished" >
< a " target = "_blank" href = "https://github.com/moxiegirl/docs-new/blob/master/_core/auth/overview.md" class = "btn btn-default githubEditButton" role = "button" > < span data-uk-icon = "icon: pencil; ratio: 1.2" > < / span > Edit this page on Github< / a >
< span style = "font-family:Wingdings" > w < / span > Sep 5, 2018
< / time >
< / div >
< div class = "article-content" >
< p class = "no_toc" > This document describes the Atlas network, a peer-to-peer content-addressed
storage system whose chunks’ hashes are announced on a public blockchain. Atlas
allows users and developers to < strong > permanently store< / strong > chunks of data that are
< strong > replicated across every peer.< / strong > As long as at least one Atlas peer is online,
all chunks are available to clients.< / p >
< p > This document is aimed at developers and technical users. The following
concepts are discussed:< / p >
< ul id = "markdown-toc" >
< li > < a href = "#architecture" id = "markdown-toc-architecture" > Architecture< / a > < / li >
< li > < a href = "#motivation" id = "markdown-toc-motivation" > Motivation< / a > < / li >
< li > < a href = "#feature-comparison" id = "markdown-toc-feature-comparison" > Feature Comparison< / a > < / li >
< / ul >
< p > The reader of this document is expected to be familiar with the < a href = "blockstack_naming_service.md" > Blockstack
Naming Service< / a > (BNS), as well as Blockstack’s
storage system < a href = "https://github.com/blockstack/gaia" > Gaia< / a > . We advise the reader
to familiarize themselves with both systems before approaching this document.< / p >
< h2 id = "architecture" > Architecture< / h2 >
< p > Atlas is designed to integrate with BNS in order to allow users to
store name state off-chain, encoded as a DNS zone file.
The overwhelmingly-common use-cases in Blockstack are:< / p >
< ul >
< li > Storing a name’s routing information for its owners’ < a href = "https://github.com/blockstack/gaia" > Gaia< / a >
datastores.< / li >
< li > Storing BNS subdomain transactions and associated state.< / li >
< / ul >
< p > Atlas is a middleware system in Blockstack. Most developers do not
interact with it directly. BNS clients like the
< a href = "https://github.com/blockstack/blockstack-browser" > Blockstack Browser< / a >
automatically generate zone files for the names they register, and automatically
propagate them to the Atlas network. BNS API endpoints, including our
< a href = "https://core.blockstack.org" > public endpoint< / a > and the
< a href = "https://github.com/blockstack/blockstack.js" > blockstack.js< / a > library,
will automatically fetch zone files from Atlas when they need to look
up data in Gaia (such as profiles and app data).< / p >
< div class = "highlighter-rouge" > < pre class = "highlight" > < code > +--------------+ +---------------+ +----------------+
clients | Blockstack | | blockstack.js | | BNS API module |
| Browser | | | | |
+--------------+ +---------------+ +----------------+
^ ^ ^ ^ ^ ^
| | | | | |
| | | | | |
V | V | V |
+----------+ | +----------+ | +----------+ |
Gaia | Gaia hub | | | Gaia hub | | | Gaia hub | |
+----------+ | +----------+ | +----------+ |
| | |
| | |
V V V
+---------------------------------------------------------------+
Atlas | Atlas Peer Network |
+----------+------+----------+-----+----------+------+----------+
BNS | BNS node | | BNS node | | BNS node | | BNS node |
+----------+ +----------+ +----------+ +----------+
^ ^ ^ ^
| (indexing | | |
| blockchain) | | |
+---------------------------------------------------------------+
Blockchain | Blockchain Peer Network |
+---------------------------------------------------------------+
Figure 1: Location of Atlas in the Blockstack architecture. Each BNS node
implements an Atlas peer. An Atlas peer treats a name state value in BNS as
the hash of a DNS zone file. Atlas peers exchange zone files with one another
until they each have a full replica of all known zone files. Clients can look
up zone files for names using the name's stat value as a zone file hash. Clients
can broadcast zone files to the network if they match a previously-announced
hash. In practice, zone files store URLs to a name owner's Gaia hubs, thereby
allowing Blockstack apps to read and write data in Gaia.
< / code > < / pre >
< / div >
< p > Nevertheless, Atlas is a general-purpose content-addressed storage
system that advanced developers can use to < strong > host data in an immutable
and durable manner.< / strong > Beyond its default use-case in Blockstack,
Atlas is ideal for tasks like:< / p >
< ul >
< li > Announcing PGP public keys under a human-readable name< / li >
< li > Storing package hashes for a software release< / li >
< li > Securely deploying shell scripts to remote VMs< / li >
< li > Binding human-readable names to Tor .onion addresses
(< a href = "https://github.com/blockstack-packages/blockstack-tor" > example< / a > )< / li >
< / ul >
< h2 id = "motivation" > Motivation< / h2 >
< p > Atlas was designed to augment BNS. BNS allows each name to store a small
amount of state—on the order of 20 bytes. The size is so small because the
state must be recorded to a public blockchain, where the cost per byte is
high and the blockchain protocol limits the size of transactions.< / p >
< p > To compensate for this, we developed an off-chain storage system allows BNS
names to bind and store a large amount of state to each name in a way that
< em > preserves the security properties of having written that state to the
blockchain< / em > . Instead of storing 20 bytes of data on the blockchain, a BNS name
owner would store the < em > cryptograhpic hash< / em > of its state, and then store the actual state
Atlas. This decouples the name’s state size from the blockchain.< / p >
< p > The reference implementation of Atlas currently allows up to 40kb of state to be
bound to a BNS name, instead of a measly 20 bytes. The 40kb of data is
replicated to each BNS node, where it is stored forever.< / p >
< h2 id = "feature-comparison" > Feature Comparison< / h2 >
< p > Atlas is not the only peer-to-peer content-addressible chunk store in existance. The following
feature table describes Atlas in relation to other popular chunk stores.< / p >
< table >
< thead >
< tr >
< th > < strong > Features< / strong > < / th >
< th > Atlas< / th >
< th > BitTorrent< / th >
< th > < a href = "https://datproject.org/" > DAT< / a > < / th >
< th > < a href = "https://ipfs.io" > IPFS< / a > < / th >
< th > < a href = "https://github.com/ethersphere/swarm" > Swarm< / a > < / th >
< / tr >
< / thead >
< tbody >
< tr >
< td > Each peer stores all chunks< / td >
< td > X< / td >
< td > X< / td >
< td > < / td >
< td > < / td >
< td > < / td >
< / tr >
< tr >
< td > Replicas are permanent [1]< / td >
< td > X< / td >
< td > X< / td >
< td > X< / td >
< td > < / td >
< td > < / td >
< / tr >
< tr >
< td > Replicas are free< / td >
< td > < / td >
< td > X< / td >
< td > X< / td >
< td > X< / td >
< td > < / td >
< / tr >
< tr >
< td > Sybil-resistant chunk discovery< / td >
< td > X< / td >
< td > X< / td >
< td > < / td >
< td > < / td >
< td > X< / td >
< / tr >
< tr >
< td > Sybil-resistant peer discovery< / td >
< td > X< / td >
< td > < / td >
< td > < / td >
< td > < / td >
< td > < / td >
< / tr >
< tr >
< td > Fixed chunk size< / td >
< td > X< / td >
< td > < / td >
< td > X< / td >
< td > X< / td >
< td > X< / td >
< / tr >
< / tbody >
< / table >
< p > [1] Here, “permanent” means that once a peer has data, they will never evict it
as part of the protocol.< / p >
< div class = "share uk-text-center" >
< a href = "https://twitter.com/intent/tweet?text=Overview of the Atlas network&url=https://zbabystack.netlify.com/core/auth/overview.html&via=&related=" rel = "nofollow" target = "_blank" title = "Share on Twitter" onclick = "window.open(this.href, 'twitter', 'width=550,height=235');return false;" > < span data-uk-icon = "icon: twitter; ratio: 1.2" > < / span > < / a >
< a class = "uk-margin-small-left" href = "https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fzbabystack.netlify.com%2Fcore%2Fauth%2Foverview.html" rel = "nofollow" target = "_blank" title = "Share on Facebook" onclick = "window.open(this.href, 'facebook-share','width=580,height=296');return false;" > < span data-uk-icon = "icon: facebook; ratio: 1.2" > < / span > < / a >
< / div >
< / div >
< hr class = "uk-margin-medium" >
<!-- <div class="uk - margin - large - top">
< h3 > Related Articles< / h3 >
< ul class = "uk-list" >
< / ul >
< / div >
-->
< / article >
< script >
// Table of contents scroll to
UIkit.scroll('#markdown-toc a', {
duration: 400,
offset: 120
});
< / script >
< / div >
< / div >
< / div >
< div id = "offcanvas" data-uk-offcanvas = "flip: true; overlay: true" >
< div class = "uk-offcanvas-bar" >
< button class = "uk-offcanvas-close" type = "button" data-uk-close > < / button >
< ul class = "uk-nav uk-nav-default" >
<!-- <li><a class="uk - logo uk - margin - small - bottom" href="/"><img src="https://zbabystack.netlify.com/assets/posts/logo.png" alt="Docs"></a></li> -->
< li > < a class = "uk-logo uk-margin-small-bottom" href = "/" > < img src = "/assets/posts/logo.png" alt = "Docs" > < / a > < / li >
< li > < a href = "https://blockstack.org" target = "_blank" > Blockstack.org< / a > < / li >
< li > < a href = "https://forum.blockstack.org/" target = "_blank" > Forums< / a > < / li >
< li > < a href = "https://github.com/blockstack" target = "_blank" > GitHub< / a > < / li >
< / ul >
< div class = "uk-margin-small-top uk-text-center uk-text-muted uk-link-muted" >
< div data-uk-grid class = "uk-child-width-auto uk-grid-small uk-flex-center uk-grid" >
< div class = "uk-first-column" >
< a href = "https://twitter.com/" data-uk-icon = "icon: twitter" class = "uk-icon-link uk-icon" target = "_blank" > < / a >
< / div >
< div >
< a href = "https://www.facebook.com/" data-uk-icon = "icon: facebook" class = "uk-icon-link uk-icon" target = "_blank" > < / a >
< / div >
< div >
< a href = "https://www.instagram.com/" data-uk-icon = "icon: instagram" class = "uk-icon-link uk-icon" target = "_blank" > < / a >
< / div >
< div >
< a href = "https://vimeo.com/" data-uk-icon = "icon: vimeo" class = "uk-icon-link uk-icon" target = "_blank" > < / a >
< / div >
< / div >
< / div >
< / div >
< / div >
< footer class = "uk-section uk-text-center uk-text-muted uk-link-muted" >
< div class = "uk-container uk-container-small" >
<!-- <div>
< ul class = "uk-subnav uk-flex-center" >
< li > < a href = "https://blockstack.org" target = "_blank" > Blockstack.org< / a > < / li >
< li > < a href = "https://forum.blockstack.org/" target = "_blank" > Forums< / a > < / li >
< li > < a href = "https://github.com/blockstack" target = "_blank" > GitHub< / a > < / li >
< / ul >
< / div >
< div class = "uk-margin-medium" >
< div data-uk-grid class = "uk-child-width-auto uk-grid-small uk-flex-center uk-grid" >
< div class = "uk-first-column" >
< a href = "https://twitter.com/" data-uk-icon = "icon: twitter" class = "uk-icon-link uk-icon" target = "_blank" > < / a >
< / div >
< div >
< a href = "https://www.facebook.com/" data-uk-icon = "icon: facebook" class = "uk-icon-link uk-icon" target = "_blank" > < / a >
< / div >
< div >
< a href = "https://www.instagram.com/" data-uk-icon = "icon: instagram" class = "uk-icon-link uk-icon" target = "_blank" > < / a >
< / div >
< div >
< a href = "https://vimeo.com/" data-uk-icon = "icon: vimeo" class = "uk-icon-link uk-icon" target = "_blank" > < / a >
< / div >
< / div >
< / div > -->
< div class = "uk-margin-medium uk-text-small copyright" > © 2018 Blockstack< / div >
< / div >
< / footer >
< script type = "text/javascript" >
/* Create a configuration object */
var ss360Config = {
/* Your site id */
siteId: 'blockstack',
/* A CSS selector that points to your search box */
searchBox: {selector: '#searchBox'}
};
< / script >
< script src = "https://cdn.sitesearch360.com/sitesearch360-v11.min.js" async > < / script >
< / body >
< / html >