Blockchains and the Web
https://ipfs.io @juanbenet
/ipns/ipfs.io 2016-06-29
0.
1. multi formats
2. IPLD
3.
0.
1. multi formats
2. IPLD
3.
WEB 1.0
WEB 2.0
WEB 3.0
verifiable, decentralized
applications
smart contracts
+ MPC
secure consensus
+ transaction ledger
secure data structures
IPLD + merkle web
secure, high perf
p2p networking
a new hypermedia distribution protocol
(a new web transport protocol)
the web has problems
bad in mobile and IoT
censorship
no offline use
huge inefficiencies
bad security model
links break
large open source project
400+ contributors
70+ contribute weekly
The Stack applications Using the Data
IPNS naming
Defining the Data
IPLD merkledag
exchange
routing Moving the Data
network
applications Etherpad Websites Orbit Mediachain uPort
naming Blockstack DNS IPNS Namecoin EthNames
IPLD
exchange BitTorrent Bitswap FTP HTTP
routing Gossip Chord Kad DHT mDNS Delegated I2P TOR
network CJDNS UDT uTP WebRTC QUIC TCP WebSockets I2P TOR
/dns/example.com/foo/bar/baz.png
dns name /ipns/example.com/foo/bar/baz.png
key name /ipns/QmYJPtosPTfoC/foo/bar/baz.png
content addr /ipfs/QmW98pJrc6FZ6/foo/bar/baz.png
fs:/ipfs/QmW98pJrc6FZ6/foo/bar/baz.png
ipfs:/ipfs/QmW98pJrc6FZ6/foo/bar/baz.png
distributed webapps
- app code stored + distributed with ipfs
- app data stored + distributed with ipfs
- browsers can connect to each other
- no origin servers!
- no central point of failure
- everything end-to-end encrypted
- app "lives on the network"
examples: forums, chat, messaging,
cms, blogs, github, ...
used for package managers
- distributed / peer-to-peer
- cryptographically verified links
- digitally signed links
- "everyone is a mirror"
- save lots of bandwidth
- versioning built in
npm on ipfs
github.com/diasdavid/registry-mirror
works with vanilla npm
npm on ipfs gx
github.com/diasdavid/registry-mirror github.com/whyrusleeping/gx
works with vanilla npm extensible pkg mgr
gx-go for Golang!
used for secure documents
- content addressed hash links
- digitally signed links
- trustless ledgers
- permanent links
- secure document web
already in use at:
- banks
- legal archives
- blockchain companies
- smart contract apps
Orbit
github.com/haadcode/orbit
p2p chat on IPFS
IPLD
0.
1. multi formats
2. IPLD
3.
multiformats - self describing values
protocol agility, interop, avoid lock in
multihash
multiaddr
multibase
multicodec
multistream
multikey
multiformats - self describing values
protocol agility, interop, avoid lock in
multihash - cryptographic hashes
multiaddr
multibase
multicodec
multistream
multikey
0x08e11fc41466fcda0af7dee0905605d9
e4aada4961542da952c8bb93080cc6f9
0x95a1b32bd70332e24f63f3802aae5f5e
1fa4622cc72750e0073bbbb6dcf6fce7
0xcaadb37a46daeda4e0d5e61574a9aaca
211d513806a026e6cc4461f7ba7867f9
0x08fbea061a5dea457d69fe5c12575c1d
9d30c49f575936f6e1c6d4ea0ab078df
256 0x08e11fc41466fcda0af7dee0905605d9
e4aada4961542da952c8bb93080cc6f9
256 0x95a1b32bd70332e24f63f3802aae5f5e
1fa4622cc72750e0073bbbb6dcf6fce7
256 0xcaadb37a46daeda4e0d5e61574a9aaca
211d513806a026e6cc4461f7ba7867f9
256 0x08fbea061a5dea457d69fe5c12575c1d
9d30c49f575936f6e1c6d4ea0ab078df
sha2 256 256 0x08e11fc41466fcda0af7dee0905605d9
e4aada4961542da952c8bb93080cc6f9
sha2 512 256 0x95a1b32bd70332e24f63f3802aae5f5e
1fa4622cc72750e0073bbbb6dcf6fce7
sha3 256 0xcaadb37a46daeda4e0d5e61574a9aaca
211d513806a026e6cc4461f7ba7867f9
blake2b 256 0x08fbea061a5dea457d69fe5c12575c1d
9d30c49f575936f6e1c6d4ea0ab078df
sha2 256 256 112008e11fc41466fcda0af7dee0905605d9
e4aada4961542da952c8bb93080cc6f9
sha2 512 256 122095a1b32bd70332e24f63f3802aae5f5e
1fa4622cc72750e0073bbbb6dcf6fce7
sha3 256 1420caadb37a46daeda4e0d5e61574a9aaca
211d513806a026e6cc4461f7ba7867f9
blake2b 256 402008fbea061a5dea457d69fe5c12575c1d
9d30c49f575936f6e1c6d4ea0ab078df
112008e11fc41466fcda0af7dee0905605d9
e4aada4961542da952c8bb93080cc6f9
11 20 08e11fc41466fcda0af7dee0905605d9
e4aada4961542da952c8bb93080cc6f9
fn code length hash digest
multihash - cryptographic hashes
- self describing
- in the value itself (not out of band)
- as small as possible
- no assumptions
- no lock in
- interop of hash functions
multiformats - self describing values
protocol agility, interop, avoid lock in
multihash - cryptographic hashes
multiaddr - network addresses
multibase - base encodings
multicodec - serialization codecs
multistream - stream wire protocols
multikey - cryptographic keys and artifacts
multiaddr - network addresses
/ip6/::1/tcp/80/http
/ip4/1.2.3.4/udp/5001/sctp/sip
/ip4/1.2.3.4/udp/5002/utp/bittorrent
/ip4/1.2.3.4/udp/5003/quic/ipfs
/onion/3g2upl4pq6kufc4m/80/http
multiformats - self describing values
protocol agility, interop, avoid lock in
multihash - cryptographic hashes
multiaddr - network addresses
multibase - base encodings
multicodec - serialization codecs
multistream - stream wire protocols
multikey - cryptographic keys and artifacts
multiformats - self describing values
protocol agility, interop, avoid lock in
multihash - In Value (not OOB)
multiaddr - Small, Binary (perf)
multibase - Human Readable
multicodec
- Stable
multistream - Starting Standard Now
multikey - Impls in many langs
0.
1. multi formats
2. IPLD
3.
distributed data structures
authenticated data structures
hash linked data structures
IPFS is like a forest of linked merkle-trees
IPLD
a common hash-chain format
for distributed data structures
IPLD
- merkle-links secure, immutable
- merkle-paths /ipfs/Qmabc…xyz/foo/bar.jpg
- canonical hashing safe
- universal nestable URIs
- serialization CBOR, JSON, YML, XML, PB
- linked data JSON-LD, RDF compatible
IPLD
a common hash-chain format
for distributed data structures
\o/ Ready for Standardization! \o/
> var ipld = require('ipld')
> var obj1 = { "data": "Hello " }
> var ipld = require('ipld')
> var obj1 = { "data": "Hello " }
> var obj1Data = ipld.marshal(obj)
> obj1Data.toString('base64')
oWRkYXRhZkhlbGxvIA==
> var ipld = require('ipld')
> var obj1 = { "data": "Hello " }
> var obj1Data = ipld.marshal(obj)
> obj1Data.toString('base64')
oWRkYXRhZkhlbGxvIA==
> var obj1Hash = ipld.multihash(obj1Data)
> obj1Hash
QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg
> var ipld = require('ipld')
> var obj1 = { "data": "Hello " }
> var obj1Data = ipld.marshal(obj1)
> var obj1Hash = ipld.multihash(obj1Data)
> var ipld = require('ipld')
> var obj1 = { "data": "Hello " }
obj1
> var obj1Data = ipld.marshal(obj1)
> var obj1Hash = ipld.multihash(obj1Data)
> var ipld = require('ipld')
> var obj1 = { "data": "Hello " }
obj1
> var obj1Data = ipld.marshal(obj1)
> var obj1Hash = ipld.multihash(obj1Data)
> var obj2 = { "data": "World\n" }
> var obj2Data = ipld.marshal(obj2) obj2
> var obj2Hash = ipld.multihash(obj2Data)
> obj2Hash
QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV
> var obj3 = {
"files": [
{ "/": "QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg" },
{ "/": "QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV" },
]
}
> var obj3Data = ipld.marshal(obj3)
> var obj3Hash = ipld.multihash(obj3Data)
> obj3Hash
QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw
obj3
> var obj3 = {
"files": [
{ "/": "QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg" },
{ "/": "QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV" },
]
} \___ HASH LINKS!
> var obj3Data = ipld.marshal(obj3)
> var obj3Hash = ipld.multihash(obj3Data)
> obj3Hash
QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw
obj3
> var obj3 = {
"files": [
{ "/": "QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg" },
{ "/": "QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV" },
]
} \___ HASH LINKS!
> var obj3Data = ipld.marshal(obj3)
> var obj3Hash = ipld.multihash(obj3Data)
HASH LINKS!
/
obj1
obj3
obj2
> var ipfs = require('ipfs')
obj1
obj3
> ipfs.add(obj1)
> ipfs.add(obj2) obj2
> ipfs.add(obj3)
> var ipfs = require('ipfs')
obj1
obj3
> ipfs.add(obj1)
> ipfs.add(obj2) obj2
> ipfs.add(obj3)
> ipfs.resolve("QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg")
{ "data": "Hello " }
> ipfs.resolve("QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV")
{ "data": "World\n" }
> var ipfs = require('ipfs')
obj1
obj3
> ipfs.add(obj1)
> ipfs.add(obj2) obj2
> ipfs.add(obj3)
> ipfs.resolve("QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg")
{ "data": "Hello " }
> ipfs.resolve("QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV")
{ "data": "World\n" }
> ipfs.resolve("QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg/data")
"Hello "
> ipfs.resolve("QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV/data")
"World "
> var ipfs = require('ipfs')
obj1
obj3
> ipfs.add(obj1)
> ipfs.add(obj2) obj2
> ipfs.add(obj3)
> ipfs.resolve("QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw")
{
"files": [
{ "/": "QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg" },
{ "/": "QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV" },
]
}
> var ipfs = require('ipfs')
obj1
obj3
> ipfs.add(obj1)
> ipfs.add(obj2) obj2
> ipfs.add(obj3)
> ipfs.resolve("QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw")
{
"files": [
{ "/": "QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg" },
{ "/": "QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV" },
]
}
> ipfs.resolve("QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw/files")
[
{ "/": "QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg" },
{ "/": "QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV" },
]
> var ipfs = require('ipfs')
obj1
obj3
> ipfs.add(obj1)
> ipfs.add(obj2) obj2
> ipfs.add(obj3)
> ipfs.resolve("QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw/files/0")
{ "data": "Hello " }
> ipfs.resolve("QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw/files/1")
{ "data": "World\n" }
> ipfs.resolve("QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw/files/0/data")
"Hello "
> ipfs.resolve("QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw/files/1/data")
"World "
> function catFile(link) {
obj1
var obj = ipfs.resolve(link) obj3
var out = obj.data || ""
for (var file of (obj.files || [])) { obj2
out += catFile(file)
}
return out
}
{
"data": "<content>",
"files": [
<subfile-link>,
<subfile-link>,
<subfile-link>,
...
]
}
> function catFile(link) {
obj1
var obj = ipfs.resolve(link) obj3
var out = obj.data || ""
for (var file of (obj.files || [])) { obj2
out += catFile(file)
}
return out
}
> catFile("QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg")
"Hello "
> catFile("QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV")
"World\n"
> function catFile(link) {
obj1
var obj = ipfs.resolve(link) obj3
var out = obj.data || ""
for (var file of (obj.files || [])) { obj2
out += catFile(file)
}
return out
}
> catFile("QmUUuaDDWvRG23zyzBQVv43etRqmbGCRNhgZYu9qvZ88Bg")
"Hello "
> catFile("QmSVuc2kjbtCFQ9ur8fnyKUKvSyLZMTBVbZugJWChydAHV")
"World\n"
> catFile("QmdhMzs1tkLYwC3jimzUABEt1xzkrokkanywe1y1QFcAhw")
"Hello World\n"
0.
1. multi formats
2. IPLD
3.
The Stack applications Using the Data
IPNS naming
Defining the Data
IPLD merkledag
exchange
routing Moving the Data
network
a collection of peer-to-peer protocols
for finding peers, and connecting to them
for finding content, and transferring it
exchange BitTorrent Bitswap FTP HTTP
routing Gossip Chord Kad DHT mDNS Delegated I2P TOR
network CJDNS UDT uTP WebRTC QUIC TCP WebSockets I2P TOR
a collection of peer-to-peer protocols
NAT
pub Kad Kad
Content Routing mDNS ICE Traversal
sub DHT ICE
Kad
Peer Routing mDNS DNS DVs STUN TURN
DHT
boot Kad
Discovery mDNS DNS PEX PKI
strap DHT
Transports TCP uTP QUIC SCTP BLE TOR I2P
libp2p
Content Routing
Peer Routing
Discovery
Transports
NAT Traversal
libp2p
Content Routing
Peer Routing
Discovery
Transports
NAT Traversal
Orbit
github.com/haadcode/orbit
p2p chat on IPFS
IPLD
Blockchains and the Web
https://ipfs.io @juanbenet
/ipns/ipfs.io 2016-06-29
applications Etherpad Websites Orbit Mediachain uPort
naming Blockstack DNS IPNS Namecoin EthNames
IPLD
exchange BitTorrent Bitswap FTP HTTP
routing Gossip Chord Kad DHT mDNS Delegated I2P TOR
network CJDNS UDT uTP WebRTC QUIC TCP WebSockets I2P TOR
application Git BitTorrent Bitcoin Ethereum BigchainDB
Blockstack ETH
naming DNS etc Names
Git Object Torrent + Bitcoin RethinkDB
RLP Format
Format bencoding Serialization
Git Repl. BitTorrent Bitcoin RethinkDB
exchange Replication
(sync heads) (Tit for Tat) Gossip
Trackers
routing
MainlineDHT
network HTTP SSH TCP uTP TCP RLPx TLS?
application Git BitTorrent Bitcoin Ethereum BigchainDB
Blockstack ETH
naming DNS etc Names
Git Object Torrent + Bitcoin RethinkDB
RLP Format
Format bencoding Serialization
Git Repl. BitTorrent Bitcoin RethinkDB
exchange Replication
(sync heads) (Tit for Tat) Gossip
Trackers
routing
MainlineDHT
network HTTP SSH TCP uTP TCP RLPx TLS?
application Git BitTorrent Bitcoin Ethereum BigchainDB
Blockstack ETH
naming DNS etc Names
Authenticated Data Structures
Git Repl. BitTorrent Bitcoin RethinkDB
exchange Replication
(sync heads) (Tit for Tat) Gossip
Trackers
routing
MainlineDHT
network HTTP SSH TCP uTP TCP RLPx TLS?
application Git BitTorrent Bitcoin Ethereum BigchainDB
Blockstack ETH
naming DNS etc Names
Hash (Merkle) Linked Data Structures
Git Repl. BitTorrent Bitcoin RethinkDB
exchange Replication
(sync heads) (Tit for Tat) Gossip
Trackers
routing
MainlineDHT
network HTTP SSH TCP uTP TCP RLPx TLS?
application Git BitTorrent Bitcoin Ethereum BigchainDB
Blockstack ETH
naming DNS etc Names
IPLD
Git Repl. BitTorrent Bitcoin RethinkDB
exchange Replication
(sync heads) (Tit for Tat) Gossip
Trackers
routing
MainlineDHT
network HTTP SSH TCP uTP TCP RLPx TLS?