mirror of https://github.com/lukechilds/docs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
386 lines
17 KiB
386 lines
17 KiB
6 years ago
|
# Blockstack Technical FAQ
|
||
|
|
||
|
This document lists frequently-asked questions and answers to technical
|
||
|
questions about Blockstack.
|
||
|
|
||
|
If you are new to Blockstack, you should read the
|
||
|
[non-technical FAQ](https://blockstack.org/faq) first.
|
||
|
|
||
|
If you have a technical question that gets frequently asked on the
|
||
|
[forum](https://forum.blockstack.org) or [Slack](https://blockstack.slack.com),
|
||
|
feel free to send a pull-request with the question and answer.
|
||
|
|
||
|
# General Questions
|
||
|
|
||
|
## What is Blockstack?
|
||
|
|
||
|
Blockstack is a new Internet for decentralized applications. Blockstack
|
||
|
applications differ from Web applications in two ways:
|
||
|
|
||
|
* **Users own their identities**. The user brings their identity to the
|
||
|
applications; applications do not require the user to create accounts and
|
||
|
passwords.
|
||
|
* **Users own their data**. Users control who can read it, and where it gets stored.
|
||
|
The application does not need to worry about hosting any user data.
|
||
|
|
||
|
The Blockstack project provides all of the infrastructure required for building
|
||
|
these kinds of applications.
|
||
|
|
||
|
## Is Blockstack decentralized?
|
||
|
|
||
|
Yes! The components that make up Blockstack do not have any central points of
|
||
|
control.
|
||
|
|
||
|
* The [Blockstack Naming Service](blockstack_naming_service.md) runs on top of
|
||
|
the Bitcoin blockchain, which itself is decentralized. It binds Blockstack
|
||
|
IDs to a small amount of on-chain data (usually a hash of off-chain data).
|
||
|
* The [Atlas Peer Network](atlas_network.md) stores chunks of data referenced by
|
||
|
names in BNS. It operates under similar design principles to BitTorrent, and
|
||
|
has no single points of failure. The network is self-healing---if a node
|
||
|
crashes, it quickly recovers all of its state from its peers.
|
||
|
* The [Gaia storage system](https://github.com/blockstack/gaia) lets users
|
||
|
choose where their application data gets hosted. Gaia reduces all storage
|
||
|
systems---from cloud storage to peer-to-peer networks---to dumb, interchangeable
|
||
|
hard drives. Users have maximum flexibility and control over their data in a
|
||
|
way that is transparent to app developers.
|
||
|
|
||
|
## Are Blockstack applications usable today?
|
||
|
|
||
|
Yes! Blockstack applications are as easy to use as normal Web applications, if
|
||
|
not easier. Moreover, they are just as performant if not more so.
|
||
|
|
||
|
If you install the [Blockstack
|
||
|
Browser](https://github.com/blockstack/blockstack-browser), or use our
|
||
|
[Web-hosted Blockstack Browser](https://browser.blockstack.org), you can get
|
||
|
started with them right away.
|
||
|
|
||
|
## Where does Blockstack keep my user account?
|
||
|
|
||
|
Your user account is ultimately controlled by a [private
|
||
|
key](https://en.wikipedia.org/wiki/Public-key_cryptography). You and only you
|
||
|
know what the private key is, and using your private key, you can prove to other
|
||
|
people that you own a particular piece of data (such as your Blockstack ID).
|
||
|
|
||
|
Your private key resides within your locally-running Blockstack Browser.
|
||
|
It never leaves your computer.
|
||
|
|
||
|
Your public keys are stored off-chain, and the *hash* of your public key is
|
||
|
stored on the Bitcoin blockchain. The [Blockstack Naming
|
||
|
Service](blockstack_naming_service.md) allows anyone to look up your public key
|
||
|
hash, given your Blockstack ID.
|
||
|
|
||
|
## Where does Blockstack keep my app data?
|
||
|
|
||
|
As a Blockstack user, you can choose exactly where your data gets stored.
|
||
|
Blockstack uses a decentralized storage system called
|
||
|
[Gaia](https://github.com/blockstack/gaia) to host your data. Gaia is different
|
||
|
from other storage systems because it lets you securely host your data wherever you want---in cloud
|
||
|
storage providers, on your personal server, or in another decentralized storage
|
||
|
system like BitTorrent or IPFS.
|
||
|
|
||
|
When you register, you are given a default Gaia hub that replicates your
|
||
|
data to a bucket in Microsoft Azure. However, you can configure and
|
||
|
deploy your own Gaia hub and have Blockstack store your data there instead.
|
||
|
|
||
|
The [Blockstack Naming Service](blockstack_naming_service.md) and the [Atlas
|
||
|
network](atlas_network.md) work together to help other users discover your
|
||
|
app-specific public data, given your Blockstack ID.
|
||
|
|
||
|
# Blockstack IDs
|
||
|
|
||
|
## What is a Blockstack ID?
|
||
|
|
||
|
Blockstack IDs are usernames. Unlike normal Web app usernames, Blockstack IDs
|
||
|
are usable *across every Blockstack app.* They fill a similar role to
|
||
|
centralized single-signon services like Facebook or Google. However, you and
|
||
|
only you control your Blockstack ID, and no one can track your logins.
|
||
|
|
||
|
## How do I get a Blockstack ID?
|
||
|
|
||
|
If you install the [Blockstack
|
||
|
Browser](https://github.com/blockstack/blockstack-browser) or use the
|
||
|
[Web-hosted Blockstack Browser](https://browser.blockstack.org), you can
|
||
|
purchase one with Bitcoin.
|
||
|
|
||
|
## Do I need a Blockstack ID to use Blockstack apps?
|
||
|
|
||
|
No, you can use Blockstack applications right away. However, if you want to
|
||
|
*share data with other users*, then you need a Blockstack ID.
|
||
|
|
||
|
## Why do I need a Blockstack ID?
|
||
|
|
||
|
Blockstack IDs are used to discover where you are keeping your
|
||
|
(publicly-readable) application data. For example, if `alice.id` wants to share
|
||
|
a document with `bob.id`, then `bob.id`'s browser uses the Blockstack ID
|
||
|
`alice.id` to look up where `alice.id` stored it.
|
||
|
|
||
|
The technical descriptions of how and why this works are quite long.
|
||
|
Please see the [Blockstack Naming Service](blockstack_naming_service.md)
|
||
|
documentation for a full description.
|
||
|
|
||
|
## What is a Blockstack Subdomain?
|
||
|
|
||
|
This is also a Blockstack ID, and can be used for all the things a Blockstack ID
|
||
|
can be used for. The only difference is that they have the format `foo.bar.baz`
|
||
|
instead of `bar.baz`. For example,
|
||
|
[jude.personal.id](https://core.blockstack.org/v1/users/jude.personal.id) is a
|
||
|
Blockstack ID, and is a subdomain of `personal.id`.
|
||
|
|
||
|
Subdomains are first-class Blockstack IDs---they can be used for all the same
|
||
|
things that an on-chain Blockstack ID can be used for, and they have all of
|
||
|
the same safety properties. They are globally unique, they are strongly owned
|
||
|
by a private key, and they are human-readable.
|
||
|
|
||
|
Subdomains are considerably cheaper than Blockstack IDs, since hundreds of them
|
||
|
can be registered with a single transaction. The [BNS
|
||
|
documentation](blockstack_naming_service.md) describes them in detail.
|
||
|
|
||
|
Subdomains provide a fast, inexpensive way to onboard many users at once.
|
||
|
|
||
|
## Can I get a Blockstack ID without spending Bitcoin?
|
||
|
|
||
|
Blockstack subdomains can be obtained without spending Bitcoin
|
||
|
by asking a subdomain registrar to create one for you.
|
||
|
|
||
|
## Is there a Blockstack name explorer?
|
||
|
|
||
|
Yes! It's at https://explorer.blockstack.org
|
||
|
|
||
|
# Blockstack App Development
|
||
|
|
||
|
## I'm a Web developer. Can I build on Blockstack?
|
||
|
|
||
|
Yes! Blockstack is geared primarily towards Web developers. All of your
|
||
|
existing knowledge is immediately applicable to Blockstack. Anything you can do
|
||
|
in a Web browser, you can do in a Blockstack app.
|
||
|
|
||
|
## I'm a non-Web developer. Can I build on Blockstack?
|
||
|
|
||
|
Yes! Blockstack implements a [RESTful API](https://core.blockstack.org) which
|
||
|
lets you interact with Blockstack from any language and any runtime. In fact,
|
||
|
the reference client
|
||
|
([blockstack.js](https://github.com/blockstack/blockstack.js)) is mainly a
|
||
|
wrapper around these RESTful API calls, so you won't be missing much by using a
|
||
|
language other than Javascript.
|
||
|
|
||
|
## What's the difference between a Web app and a Blockstack app?
|
||
|
|
||
|
Blockstack apps are built like [single-page Web
|
||
|
apps](https://en.wikipedia.org/wiki/Single-page_application)---they are, in
|
||
|
fact, a type of Web application.
|
||
|
|
||
|
Blockstack apps are a subset of Web applications that use Blockstack's
|
||
|
technology to preserve the user's control over their identities and data.
|
||
|
As such, they tend to be simpler
|
||
|
in design and operation, since in many cases they don't have to host anything
|
||
|
besides the application's assets.
|
||
|
|
||
|
## Do I need to learn any new languages or frameworks?
|
||
|
|
||
|
No. Blockstack applications are built using existing Web frameworks and programming
|
||
|
The only new thing you need to learn is either [blockstack.js](https://github.com/blockstack/blockstack.js) or
|
||
|
the [Blockstack RESTful API](https://core.blockstack.org).
|
||
|
|
||
|
## How does my Web app interact with Blockstack?
|
||
|
|
||
|
The [blockstack.js](https://github.com/blockstack/blockstack.js) library gives
|
||
|
any Web application the ability to interact with Blockstack's authentication and
|
||
|
storage services. In addition, we supply a [public RESTful API](https://core.blockstack.org).
|
||
|
|
||
|
## What does `blockstack.js` do?
|
||
|
|
||
|
This is the reference client implementation for Blockstack. You use it in your
|
||
|
Web app to do the following:
|
||
|
|
||
|
* Authenticate users
|
||
|
* Load and store user data
|
||
|
* Read other users' public data
|
||
|
|
||
|
## How do I use `blockstack.js`?
|
||
|
|
||
|
Please see the API documentation [here](https://github.com/blockstack/blockstack.js).
|
||
|
|
||
|
## How can I look up names and profiles?
|
||
|
|
||
|
You can use `blockstack.js`, or you can use the [public Blockstack Core
|
||
|
endpoint](https://core.blockstack.org).
|
||
|
|
||
|
## How can I read my public app data without `blockstack.js`?
|
||
|
|
||
|
The URLs to a user's public app data are in a canonical location in their
|
||
|
profile. For example, here's how you would get public data from the
|
||
|
[Publik](https://publik.ykliao.com) app, stored under the Blockstack ID `ryan.id`.
|
||
|
|
||
|
1. Get the bucket URL
|
||
|
```bash
|
||
|
$ BUCKET_URL="$(curl -sL https://core.blockstack.org/v1/users/ryan.id | jq -r '."ryan.id"["profile"]["apps"]["http://publik.ykliao.com"]')"
|
||
|
$ echo "$BUCKET_URL"
|
||
|
https://gaia.blockstack.org/hub/1FrZTGQ8DM9TMPfGXtXMUvt2NNebLiSzad/
|
||
|
```
|
||
|
|
||
|
2. Get the data
|
||
|
```bash
|
||
|
$ curl -sL "${BUCKET_URL%%/}/statuses.json"
|
||
|
[{"id":0,"text":"Hello, Blockstack!","created_at":1515786983492}]
|
||
|
```
|
||
|
|
||
|
## How do I register Blockstack IDs?
|
||
|
|
||
|
You should use the [Blockstack Browser](https://github.com/blockstack/blockstack-browser).
|
||
|
|
||
|
## How do I register Blockstack Subdomains?
|
||
|
|
||
|
You can deploy and use a [Blockstack Subdomain Registrar](subdomains.md), or
|
||
|
use an existing one.
|
||
|
|
||
|
## Can I programmatically register Blockstack IDs?
|
||
|
|
||
|
Blockstack applications do not currently have
|
||
|
have access to the user's wallet. Users are expected to
|
||
|
register Blockstack IDs themselves.
|
||
|
|
||
|
However, if you feel particularly ambitious, you can do one of the following:
|
||
|
|
||
|
* Set up a `blockstack api` endpoint (see the project [README](../README.md)) and write a
|
||
|
program to automatically register names. Also, see the [API
|
||
|
documentation](https://blockstack.github.io/blockstack-core/#managing-names-register-a-name)
|
||
|
for registering names on this endpoint.
|
||
|
|
||
|
* Write a `node.js` program that uses `blockstack.js` to register
|
||
|
names. This is currently in development.
|
||
|
|
||
|
## Can I programmatically register Blockstack Subdomains?
|
||
|
|
||
|
Yes! Once you deploy your own subdomain registrar, you can have your Web app
|
||
|
send it requests to register subdomains on your Blockstack ID. You can also
|
||
|
create a program that drives subdomain registration on your Blockstack ID.
|
||
|
|
||
|
## Do you have a testnet or sandbox to experiment with Blockstack?
|
||
|
|
||
|
We have an [integration test framework](../integration_tests) that provides a
|
||
|
private Blockstack testnet. It uses `bitcoin -regtest` to create a private
|
||
|
blockchain that you can interact with, without having to spend any Bitcoin or
|
||
|
having to wait for blocks to confirm. Please see the
|
||
|
[README](../integration_tests/README.md) for details.
|
||
|
|
||
|
## Does Blockstack have a smart contract system?
|
||
|
|
||
|
No, not yet. This is because
|
||
|
Blockstack's design philosophy focuses on keeping system complexity at the
|
||
|
"edges" of the network (e.g. clients), instead of the "core" of the network (e.g.
|
||
|
the blockchain), in accordance with the [end-to-end
|
||
|
principle](https://en.wikipedia.org/wiki/End-to-end_principle).
|
||
|
Generally speaking, this can be interpreted as "if you can do X without
|
||
|
a smart contract, you should do X without a smart contract." This organizing
|
||
|
principle applies to a lot of useful decentralized applications.
|
||
|
|
||
|
## Can Blockstack applications interact with Bitcoin? Ethereum? Smart contracts? Other blockchains?
|
||
|
|
||
|
Yes! Since Blockstack applications are built like Web applications, all you need to do is include the
|
||
|
relevant Javascript library into your application.
|
||
|
|
||
|
## Do you have a Blockstack app development tutorial?
|
||
|
|
||
|
Yes! See [here](https://blockstack.org/tutorials).
|
||
|
|
||
|
# Comparisons to Other Systems
|
||
|
|
||
|
## Blockstack vs DNS
|
||
|
|
||
|
Blockstack and DNS both implement naming systems, but in fundamentally
|
||
|
different ways. Blockstack *can be used* for resolving host names to IP
|
||
|
addresses, but this is not its default use-case. The [Blockstack Naming
|
||
|
Service](blockstack_naming_service.md) (BNS) instead behaves
|
||
|
more like a decentralized
|
||
|
[LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) system for
|
||
|
resolving user names to user data.
|
||
|
|
||
|
While DNS and BNS handle different problems, they share some terminology and
|
||
|
serialization formats. However, it is important to recognize that this is the
|
||
|
*only* thing they have in common---BNS has fundamentally different semantics
|
||
|
than DNS:
|
||
|
|
||
|
* **Zone files**: Blockstack stores a DNS zone file for each name. However,
|
||
|
the semantics of a BNS zone file are nothing like the semantics of a DNS zone
|
||
|
file---the only thing they have in common is their format.
|
||
|
A "standard" Blockstack zone files only have `URI` and `TXT` resource records
|
||
|
that point to the user's application data. Moreover, a Blockstack ID has a
|
||
|
*history* of zone files, and historic zone files can alter the way in which a
|
||
|
Blockstack ID gets resolved (DNS has no such concept). It is conceivable that an advanced
|
||
|
user could add `A` and `AAAA` records to their Blockstack ID's zone file,
|
||
|
but these are not honored by any Blockstack software at this time.
|
||
|
|
||
|
* **Subdomains**: Blockstack has the concept of a subdomain, but it is
|
||
|
semantically very different from a DNS subdomain. In Blockstack, a subdomain
|
||
|
is a Blockstack ID whose state and transaction history are anchored to the
|
||
|
blockchain, but stored within an on-chain Blockstack ID's zone file history.
|
||
|
Unlike DNS subdomains, a BNS subdomain has
|
||
|
its own owner and is a first-class BNS name---all subdomains are resolvable,
|
||
|
and only the subdomain's owner can update the subdomain's records. The only thing BNS subdomains and DNS
|
||
|
subdomains have in common is the name format (e.g. `foo.bar.baz` is a subdomain
|
||
|
of `bar.baz` in both DNS and BNS).
|
||
|
|
||
|
More details can be found in the [Blockstack vs
|
||
|
DNS](https://blockstack.org/docs/blockstack-vs-dns) document. A feature
|
||
|
comparison can be found at the end of the [Blockstack Naming
|
||
|
Service](blockstack_naming_service.md) document.
|
||
|
|
||
|
## Blockstack vs Namecoin
|
||
|
|
||
|
Namecoin also implements a decentralized naming service on top of a blockchain,
|
||
|
just like BNS. In fact, early versions of Blockstack were built on Namecoin.
|
||
|
However, [it was discovered](https://www.usenix.org/node/196209) that Namecoin's
|
||
|
merged mining with Bitcoin regularly placed it under the *de facto* control of a single
|
||
|
miner. This prompted a re-architecting of the system to be *portable* across
|
||
|
blockchains, so that if Blockstack's underlying blockchain (currently Bitcoin)
|
||
|
ever became insecure, the system could migrate to a more secure blockchain.
|
||
|
|
||
|
A feature comparison can be found at the end of the [Blockstack Naming
|
||
|
Service](blockstack_naming_service.md) document.
|
||
|
|
||
|
## Blockstack vs ENS
|
||
|
|
||
|
ENS also implements a decentralized naming system on top of a blockchain, but as
|
||
|
a smart contract on Ethereum. Like BNS, ENS is geared towards resolving names
|
||
|
to off-chain state (ENS names resolve to a hash, for example). Moreover, ENS is
|
||
|
geared towards providing programmatic control over names with Turing-complete
|
||
|
on-chain resolvers.
|
||
|
|
||
|
BNS has a fundamentally different relationship with blockchains than ENS.
|
||
|
WHereas ENS tries to use on-chain logic as much as possible, BNS
|
||
|
tries to use the blockchain as little as possible. BNS only uses it to store a
|
||
|
database log for name operations (which are interpreted with an off-chain BNS
|
||
|
node like Blockstack Core). BNS name state and BNS subdomains reside entirely
|
||
|
off-chain in the Atlas network. This has allowed BNS to migrate from blockchain
|
||
|
to blockchain in order to survive individual blockchain failures, and this has
|
||
|
allowed BNS developers to upgrade its consensus rules without having to get the
|
||
|
blockchain's permission (see the [virtualchain
|
||
|
paper](https://blockstack.org/virtualchain_dccl2016.pdf) for details).
|
||
|
|
||
|
A feature comparison can be found at the end of the [Blockstack Naming
|
||
|
Service](blockstack_naming_service.md) document.
|
||
|
|
||
|
## Blockstack vs Ethereum
|
||
|
|
||
|
Blockstack and Ethereum both strive to provide a decentralized application
|
||
|
platform. Blockstack's design philosophy differs from Ethereum's design
|
||
|
philosophy in that Blockstack emphasizes treating the blockchain as a "dumb
|
||
|
ledger" with no special functionality or properties beyond a few bare minimum
|
||
|
requirements. Instead, it strives to do everything off-chain---an application of the [end-to-end principle](https://en.wikipedia.org/wiki/End-to-end_principle).
|
||
|
Most Blockstack applications do *not*
|
||
|
interact with the blockchain, and instead interact with Blockstack
|
||
|
infrastructure through client libraries and RESTful endpoints.
|
||
|
This is evidenced by Blockstack's decision to implement its naming system (BNS), discovery and routing system
|
||
|
(Atlas), and storage system (Gaia) as blockchain-agnostic components that can be
|
||
|
ported from one blockchain to another.
|
||
|
|
||
|
Ethereum takes the opposite approach. Ethereum dapps are expected to interface
|
||
|
directly with on-chain smart contract logic, and are expected to host a
|
||
|
non-trivial amount of state in the blockchain itself. This is necessary for
|
||
|
them, because many Ethereum dapps' business logic is centered around the
|
||
|
mechanics of an ERC20 token.
|
||
|
|
||
|
Blockstack does not implement a smart contract system (yet), but it will soon
|
||
|
implement a [native token](https://blockstack.com/distribution.pdf) that will be
|
||
|
accessible to Blockstack applications.
|