Concept of
BlockChain
&
Decentralized
Application
timakin / @__timakin__
YAP(achimon)C::Asia Hachioji 2016 mid in Shinagawa
• github: timakin
• twitter: @__timakin__
• DeNA -> Translimit
• Go / Ruby / Node
• Blog

medium: https://medium.com/@timakin

timekin.log: http://tech-savvy.hatenablog.com/
•
•
•
•
•
•
•
•
•
P2P 

P2P 

Chain Flow
hash
target nonce
transactions transactions transactions
blockblock block
Inside of blockchain
• JSON
JSON
•
nonce
• parent hash
hash
Example of block
{
difficulty: '137447',
extraData: '0x476574682f76312e302e312f6c696e75782f676f312e342e32',
gasLimit: 3141592,
gasUsed: 0,
hash:
'0x4d3063b91cbaa12bf2de81014c1319febc9f197c93f81b0746afaffaa9496620',
nonce: '0x28fda83cb19ed497',
number: 100,
parentHash:
'0x5885cdec1d1410580eaaf1fb7ef9db245a735822d48e816c73d926b7c9872f15',
size: 536,
timestamp: 1439451765,
totalDifficulty: '13551548',
transactions: [ ],
transactionsRoot:
'0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
}
Chain management
• P2P
Node json
• Node
A
B
C
fork
Consensus Algorithm
• Proof of Work
• Node 0 

Node
• target nonce(hash value)
• Node 



• Proof of Stake
•
• ex) SHA256(prevhash + address + timestamp) <= 2^256 * balance (volume of stake) / diff
• 

Proof of Stake Velocity
•
• PoW 

10
•
•
• PoS
•
•
• Node
•
DApp Stack
Decentralized Application
P2P Node 

Permanent web

Decentralized Application
Processing
File Storage Database
Decentralized Application
Processing
File Storage Database
Processing
File Storage Database
Euthareum
•
•
ether
Euthareum Client
• Geth (go-euthareum)
Node
Install
https://github.com/ethereum/go-ethereum
OS
# install euthareum
$ brew tap ethereum/ethereum
$ brew install ethereum
# install go, gmp
$ brew install gmp go
# install geth
$ git clone https://github.com/ethereum/go-ethereum
$ cd go-ethereum
$ make geth
Build private network
$ mkdir /home/test_u/eth_private_net
{
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash":
"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0",
"gasLimit": "0x8000000",
"difficulty": "0x4000",
"mixhash":
"0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}
Genesis
Connect to private network
$ geth --networkid "10" --nodiscover --datadir "/home/test_u/
eth_private_net" --genesis "/home/test_u/eth_private_net/
myGenesis.json" console 2>> /home/test_u/eth_private_net/
geth_err.log
# private 10 id
# peer
# console
Contract Code
# Solidity
$ sudo add-apt-repository ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install solc
$ brew install cpp-ethereum
$ brew linkapps cpp-ethereum
$ solc —-version
$ which solc
# solc geth
$ admin.setSolc(“which solc path")
$ eth.getCompilers()
•
• Ethereum Virtual Machine

Euthareum
• Solidity
• IDE: https://github.com/ethereum/browser-solidity
Contract Code
# Solidity
contract SingleNumRegister {
uint storedData;
function set(uint x) {
storedData = x;
}
function get() constant returns (uint retVal) {
return storedData;
}
}
Solidity JavaScript
Contract Code
#
$ var source = "contract SingleNumRegister { uint storedData;
function set(uint x) { storedData = x; } function get() constant
returns (uint retVal) { return storedData; }}"
$ var sourceCompiled = eth.compile.solidity(source)
#
$ var contractAbiDefinition =
sourceCompiled.SingleNumRegister.info.abiDefinition
$ var sourceCompiledContract = eth.contract(contractAbiDefinition)
$ var contract = sourceCompiledContract.new({from:eth.accounts[0],
data: sourceCompiled.SingleNumRegister.code})
Node
Contract Code
$ contract
{
address: '0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb',
transactionHash:
'0xeb76caefdfe5a9aa10b11743d317cf15f881d3b2e52ba3251dcf8e0718ed5b33'
,
allEvents: function (),
get: function (),
set: function ()
}
#
$ contractAbiDefinition
Contract Code
#
$ var cnt = eth.contract([{ constant: false, inputs: [{ name: 'x',
type: 'uint256' } ], name: 'set', outputs: [ ], type: 'function' },
{ constant: true, inputs: [ ], name: 'get', outputs: [{ name:
'retVal', type: 'uint256' } ], type:
'function' } ]).at(‘0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb');
#
$ cnt.set.sendTransaction(3,{from:eth.accounts[0]})
‘0x979c4e413a647673632d74a6c8b7f5b25a3260f3fefa4abea2dc265d61215939'
#
$ cnt.get()
Run the app on EVM
# RPC geth
$ geth --networkid "10" --nodiscover --datadir "/home/test_u/
eth_private_net" --genesis "/home/test_u/eth_private_net/myGenesis.json"
--mine --unlock 0xa7653f153f9ead98dc3be08abfc5314f596f97c6 --rpc --rpcaddr
"192.168.5.6" --rpcport "8545" --rpccorsdomain "*" console 2>> /home/
test_u/eth_private_net/geth_err.log
# meteor project
$ cd ~/eth-test #
$ meteor create simple-app # Meteor
$ meteor add twbs:bootstrap
$ meteor add ethereum:web3
$ meteor add ethereum:accounts
$ meteor add ethereum:blocks
EVM
Run the app on EVM
# geth
$ vim client/lib/init.js
```
//Web3
web3 = new Web3();
//RPC
if(!web3.currentProvider)
web3.setProvider(new web3.providers.HttpProvider("http://localhost:
8545"));
// EthAccounts
EthAccounts.init();
//EthBlocks
EthBlocks.init();
```
Run the app on EVM
$ vim client/main.html
```
<head>
<title>Simple Ether Wallet</title>
</head>
<body>
<template name="nodeStatusComponent">
<div class="panel panel-default">
<div class="panel-heading">
<h4>Node Status</h4>
</div>
<table class="table">
<tbody>
<tr>
<th scope="row">Node</th>
<td>{{currentProvider}}</td>
</tr>
<tr>
<th scope="row">Is Mining?</th>
<td>{{isMining}}</td>
</tr>
<tr>
<th scope="row">Hashrate</th>
<td>{{currentHashrate}}</td>
</tr>
<tr>
<th scope="row">Peer Count</th>
<td>{{currentPeerCount}}</td>
</tr>
</tbody>
</table>
</div>
</template>
```
Run the app on EVM
#
$ vim client/main.html
```
<head>
<title>Simple Ether Wallet</title>
</head>
<body>
<template name="nodeStatusComponent">
<div class="panel panel-default">
<div class="panel-heading">
<h4>Node Status</h4>
</div>
<table class="table">
<tbody>
<tr>
<th scope="row">Node</th>
<td>{{currentProvider}}</td>
</tr>
<tr>
<th scope="row">Is Mining?</th>
<td>{{isMining}}</td>
</tr>
<tr>
<th scope="row">Hashrate</th>
<td>{{currentHashrate}}</td>
</tr>
<tr>
<th scope="row">Peer Count</th>
<td>{{currentPeerCount}}</td>
</tr>
</tbody>
</table>
</div>
</template>
```
Run the app on EVM
#
$ vim client/main.js
```
// nodeStatusComponent
Template.nodeStatusComponent.helpers({
//
currentProvider: function(){
return web3.currentProvider.host;
},
//
// true false
isMining: function(){
return web3.eth.mining;
},
//
currentHashrate: function(){
return web3.eth.hashrate;
},
//
currentPeerCount: function(){
return web3.net.peerCount;
}
});
```
meteor 

Euthareum
•
• Euthareum
BigChainDB
•
•
• key-value
JSON
• python
BigChainDB
RethinkDB
BigChainDB
https://speakerdeck.com/vrde/bigchaindb-how-we-built-a-blockchain-database-
on-top-of-rethinkdb
Install, Configuration
# rethinkdb http://rethinkdb.com/docs/install/
# bigchainDB
$ sudo pip install bigchaindb
$ vim instance1.conf
```

server-tag=original
directory=/data
bind=all
direct-io
# Replace node?_hostname with actual node hostnames below, e.g.
rdb.examples.com
join=node0_hostname:29015
join=node1_hostname:29015
join=node2_hostname:29015
# continue until there's a join= line for each node in the
federation

```
Run the BigChainDB server
# rethinkdb bigchaindb server
$ rethinkdb --config-file path/to/instance1.conf
$ bigchaindb init
$ bigchaindb set-shards 1
$ bigchaindb set-replicas 1
$ bigchaindb start
Create a Digital Asset
from bigchaindb import crypto
#
testuser1_priv, testuser1_pub = crypto.generate_key_pair()
#
digital_asset_payload = {'msg': 'Hello BigchainDB!'}
#
tx = b.create_transaction(b.me, testuser1_pub, None, 'CREATE',
payload=digital_asset_payload)
#
tx_signed = b.sign_transaction(tx, b.me_private)
#
b.write_transaction(tx_signed)
#
tx_retrieved = b.get_transaction(tx_signed['id'])
tx_retrieved
BigChainDB
•
• key-value RethinkDB
IPFS
•
• gateway REST API
curl
• P2P
Install
https://ipfs.io/docs/install/
go
#
$ ipfs init
$ ipfs daemon


# peer
$ ipfs swarm peers
# ipfs image
$ ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg
>cat.jpg
$ open cat.jpg
# localhost webui
$ open http://localhost:5001/webui
WEBUI
Upload assets
#
$ ipfs add test.jpg
added QmaC9pUA3grWJ948u1VWRLG1wPLP8YZe7b3HopBGk4zZyA test.jpg
$ ipfs cat /ipfs/QmaC9pUA3grWJ948u1VWRLG1wPLP8YZe7b3HopBGk4zZyA > butaman.jpg
$ open https://ipfs.io/ipfs/QmaC9pUA3grWJ948u1VWRLG1wPLP8YZe7b3HopBGk4zZyA
#
$ ipfs add -r ~/myproject
# Fuse
$ ipfs mount
$ ls /ipfs/$hash/
#
$ ipfs add -q test.mp4
API Client
var ipfs = require('ipfs-client');
var stream =
ipfs.cat('QmTE9Xp76E67vkYeygbKJrsVj8W2LLcyUifuMHMEkyRfUL');
stream.pipe(process.stdout);
ipfs.add(process.stdin, function(err, hash) {
console.log(hash);
});
https://www.npmjs.com/package/ipfs-client
API
Scala Go JavaScript
ex) gx-go
https://github.com/whyrusleeping/gx-go
ipfs version 

go package manager
ex) ipfs-pics
https://ipfs.pics/
ipfs
script
IPFS
•
• gateway REST API curl
• gateway


(https://ipfs.io/ipfs/$hash)
•
DApp
•
• DB Storage
CDN
BigChainDB
Peer Node IPFS
Peer Node
Processing
File Storage Database
tr tr tr
bb b
bb b bb b
•
• P2P
CDN
• Node
Client-Server
• or <
•


http://www.meti.go.jp/press/2016/04/20160428003/
20160428003-2.pdf
• 

http://www.slideshare.net/ks91020/ss-58535780
• 5 

http://www.slideshare.net/cookle/5-58379474
• Ethereum-WhitePaper-JP 

https://github.com/kurihei/Ethereum-WhitePaper-JP/blob/master/%5BJapanese%5D-White-
Paper.md
• Ethereum Specification 

https://github.com/ethereum/go-ethereum/wiki/Ethereum-Specification
• Gitbook Ethereum 

https://www.gitbook.com/book/a-mitani/mastering-ethereum/details
• BigchainDB: how we built a blockchain database on top of RethinkDB 

https://speakerdeck.com/vrde/bigchaindb-how-we-built-a-blockchain-database-on-top-of-rethinkdb
• White Paper: BigchainDB: A Scalable Blockchain Database(DRAFT) 

https://www.bigchaindb.com/whitepaper/bigchaindb-whitepaper.pdf
• White Paper: IPFS - Content Addressed, Versioned, P2P File System (DRAFT 3) 

https://ipfs.io/ipfs/QmR7GSQM93Cx5eAg6a6yRzNde1FQv7uL6X1o4k7zrJa3LX/ipfs.draft3.pdf
• OSS
Go Go
• Docs White Paper
pdf
•
• Euthareum
Github
Github
Concept of BlockChain & Decentralized Application

Concept of BlockChain & Decentralized Application

  • 1.
    Concept of BlockChain & Decentralized Application timakin /@__timakin__ YAP(achimon)C::Asia Hachioji 2016 mid in Shinagawa
  • 3.
    • github: timakin •twitter: @__timakin__ • DeNA -> Translimit • Go / Ruby / Node • Blog
 medium: https://medium.com/@timakin
 timekin.log: http://tech-savvy.hatenablog.com/
  • 5.
  • 7.
  • 9.
  • 11.
  • 12.
    Chain Flow hash target nonce transactionstransactions transactions blockblock block
  • 13.
    Inside of blockchain •JSON JSON • nonce • parent hash hash
  • 14.
    Example of block { difficulty:'137447', extraData: '0x476574682f76312e302e312f6c696e75782f676f312e342e32', gasLimit: 3141592, gasUsed: 0, hash: '0x4d3063b91cbaa12bf2de81014c1319febc9f197c93f81b0746afaffaa9496620', nonce: '0x28fda83cb19ed497', number: 100, parentHash: '0x5885cdec1d1410580eaaf1fb7ef9db245a735822d48e816c73d926b7c9872f15', size: 536, timestamp: 1439451765, totalDifficulty: '13551548', transactions: [ ], transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', }
  • 15.
  • 16.
  • 17.
    Consensus Algorithm • Proofof Work • Node 0 
 Node • target nonce(hash value) • Node 
 
 • Proof of Stake • • ex) SHA256(prevhash + address + timestamp) <= 2^256 * balance (volume of stake) / diff • 
 Proof of Stake Velocity
  • 19.
    • • PoW 
 10 • • •PoS • • • Node •
  • 23.
  • 24.
  • 25.
  • 26.
    Decentralized Application Processing File StorageDatabase Processing File Storage Database
  • 27.
  • 28.
    Euthareum Client • Geth(go-euthareum) Node
  • 29.
    Install https://github.com/ethereum/go-ethereum OS # install euthareum $brew tap ethereum/ethereum $ brew install ethereum # install go, gmp $ brew install gmp go # install geth $ git clone https://github.com/ethereum/go-ethereum $ cd go-ethereum $ make geth
  • 30.
    Build private network $mkdir /home/test_u/eth_private_net { "nonce": "0x0000000000000042", "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x0", "gasLimit": "0x8000000", "difficulty": "0x4000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": {} } Genesis
  • 31.
    Connect to privatenetwork $ geth --networkid "10" --nodiscover --datadir "/home/test_u/ eth_private_net" --genesis "/home/test_u/eth_private_net/ myGenesis.json" console 2>> /home/test_u/eth_private_net/ geth_err.log # private 10 id # peer # console
  • 32.
    Contract Code # Solidity $sudo add-apt-repository ppa:ethereum/ethereum $ sudo apt-get update $ sudo apt-get install solc $ brew install cpp-ethereum $ brew linkapps cpp-ethereum $ solc —-version $ which solc # solc geth $ admin.setSolc(“which solc path") $ eth.getCompilers() • • Ethereum Virtual Machine
 Euthareum • Solidity • IDE: https://github.com/ethereum/browser-solidity
  • 33.
    Contract Code # Solidity contractSingleNumRegister { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } } Solidity JavaScript
  • 34.
    Contract Code # $ varsource = "contract SingleNumRegister { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; }}" $ var sourceCompiled = eth.compile.solidity(source) # $ var contractAbiDefinition = sourceCompiled.SingleNumRegister.info.abiDefinition $ var sourceCompiledContract = eth.contract(contractAbiDefinition) $ var contract = sourceCompiledContract.new({from:eth.accounts[0], data: sourceCompiled.SingleNumRegister.code}) Node
  • 35.
    Contract Code $ contract { address:'0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb', transactionHash: '0xeb76caefdfe5a9aa10b11743d317cf15f881d3b2e52ba3251dcf8e0718ed5b33' , allEvents: function (), get: function (), set: function () } # $ contractAbiDefinition
  • 36.
    Contract Code # $ varcnt = eth.contract([{ constant: false, inputs: [{ name: 'x', type: 'uint256' } ], name: 'set', outputs: [ ], type: 'function' }, { constant: true, inputs: [ ], name: 'get', outputs: [{ name: 'retVal', type: 'uint256' } ], type: 'function' } ]).at(‘0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb'); # $ cnt.set.sendTransaction(3,{from:eth.accounts[0]}) ‘0x979c4e413a647673632d74a6c8b7f5b25a3260f3fefa4abea2dc265d61215939' # $ cnt.get()
  • 37.
    Run the appon EVM # RPC geth $ geth --networkid "10" --nodiscover --datadir "/home/test_u/ eth_private_net" --genesis "/home/test_u/eth_private_net/myGenesis.json" --mine --unlock 0xa7653f153f9ead98dc3be08abfc5314f596f97c6 --rpc --rpcaddr "192.168.5.6" --rpcport "8545" --rpccorsdomain "*" console 2>> /home/ test_u/eth_private_net/geth_err.log # meteor project $ cd ~/eth-test # $ meteor create simple-app # Meteor $ meteor add twbs:bootstrap $ meteor add ethereum:web3 $ meteor add ethereum:accounts $ meteor add ethereum:blocks EVM
  • 38.
    Run the appon EVM # geth $ vim client/lib/init.js ``` //Web3 web3 = new Web3(); //RPC if(!web3.currentProvider) web3.setProvider(new web3.providers.HttpProvider("http://localhost: 8545")); // EthAccounts EthAccounts.init(); //EthBlocks EthBlocks.init(); ```
  • 39.
    Run the appon EVM $ vim client/main.html ``` <head> <title>Simple Ether Wallet</title> </head> <body> <template name="nodeStatusComponent"> <div class="panel panel-default"> <div class="panel-heading"> <h4>Node Status</h4> </div> <table class="table"> <tbody> <tr> <th scope="row">Node</th> <td>{{currentProvider}}</td> </tr> <tr> <th scope="row">Is Mining?</th> <td>{{isMining}}</td> </tr> <tr> <th scope="row">Hashrate</th> <td>{{currentHashrate}}</td> </tr> <tr> <th scope="row">Peer Count</th> <td>{{currentPeerCount}}</td> </tr> </tbody> </table> </div> </template> ```
  • 40.
    Run the appon EVM # $ vim client/main.html ``` <head> <title>Simple Ether Wallet</title> </head> <body> <template name="nodeStatusComponent"> <div class="panel panel-default"> <div class="panel-heading"> <h4>Node Status</h4> </div> <table class="table"> <tbody> <tr> <th scope="row">Node</th> <td>{{currentProvider}}</td> </tr> <tr> <th scope="row">Is Mining?</th> <td>{{isMining}}</td> </tr> <tr> <th scope="row">Hashrate</th> <td>{{currentHashrate}}</td> </tr> <tr> <th scope="row">Peer Count</th> <td>{{currentPeerCount}}</td> </tr> </tbody> </table> </div> </template> ```
  • 41.
    Run the appon EVM # $ vim client/main.js ``` // nodeStatusComponent Template.nodeStatusComponent.helpers({ // currentProvider: function(){ return web3.currentProvider.host; }, // // true false isMining: function(){ return web3.eth.mining; }, // currentHashrate: function(){ return web3.eth.hashrate; }, // currentPeerCount: function(){ return web3.net.peerCount; } }); ``` meteor 

  • 42.
  • 43.
  • 44.
  • 45.
    Install, Configuration # rethinkdbhttp://rethinkdb.com/docs/install/ # bigchainDB $ sudo pip install bigchaindb $ vim instance1.conf ```
 server-tag=original directory=/data bind=all direct-io # Replace node?_hostname with actual node hostnames below, e.g. rdb.examples.com join=node0_hostname:29015 join=node1_hostname:29015 join=node2_hostname:29015 # continue until there's a join= line for each node in the federation
 ```
  • 46.
    Run the BigChainDBserver # rethinkdb bigchaindb server $ rethinkdb --config-file path/to/instance1.conf $ bigchaindb init $ bigchaindb set-shards 1 $ bigchaindb set-replicas 1 $ bigchaindb start
  • 47.
    Create a DigitalAsset from bigchaindb import crypto # testuser1_priv, testuser1_pub = crypto.generate_key_pair() # digital_asset_payload = {'msg': 'Hello BigchainDB!'} # tx = b.create_transaction(b.me, testuser1_pub, None, 'CREATE', payload=digital_asset_payload) # tx_signed = b.sign_transaction(tx, b.me_private) # b.write_transaction(tx_signed) # tx_retrieved = b.get_transaction(tx_signed['id']) tx_retrieved
  • 48.
  • 49.
    IPFS • • gateway RESTAPI curl • P2P
  • 50.
    Install https://ipfs.io/docs/install/ go # $ ipfs init $ipfs daemon 
 # peer $ ipfs swarm peers # ipfs image $ ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg >cat.jpg $ open cat.jpg # localhost webui $ open http://localhost:5001/webui
  • 51.
  • 52.
    Upload assets # $ ipfsadd test.jpg added QmaC9pUA3grWJ948u1VWRLG1wPLP8YZe7b3HopBGk4zZyA test.jpg $ ipfs cat /ipfs/QmaC9pUA3grWJ948u1VWRLG1wPLP8YZe7b3HopBGk4zZyA > butaman.jpg $ open https://ipfs.io/ipfs/QmaC9pUA3grWJ948u1VWRLG1wPLP8YZe7b3HopBGk4zZyA # $ ipfs add -r ~/myproject # Fuse $ ipfs mount $ ls /ipfs/$hash/ # $ ipfs add -q test.mp4
  • 53.
    API Client var ipfs= require('ipfs-client'); var stream = ipfs.cat('QmTE9Xp76E67vkYeygbKJrsVj8W2LLcyUifuMHMEkyRfUL'); stream.pipe(process.stdout); ipfs.add(process.stdin, function(err, hash) { console.log(hash); }); https://www.npmjs.com/package/ipfs-client API Scala Go JavaScript
  • 54.
  • 55.
  • 56.
    IPFS • • gateway RESTAPI curl • gateway 
 (https://ipfs.io/ipfs/$hash) •
  • 57.
    DApp • • DB Storage CDN BigChainDB PeerNode IPFS Peer Node Processing File Storage Database tr tr tr bb b bb b bb b
  • 59.
  • 60.
  • 61.
    • Ethereum-WhitePaper-JP 
 https://github.com/kurihei/Ethereum-WhitePaper-JP/blob/master/%5BJapanese%5D-White- Paper.md •Ethereum Specification 
 https://github.com/ethereum/go-ethereum/wiki/Ethereum-Specification • Gitbook Ethereum 
 https://www.gitbook.com/book/a-mitani/mastering-ethereum/details • BigchainDB: how we built a blockchain database on top of RethinkDB 
 https://speakerdeck.com/vrde/bigchaindb-how-we-built-a-blockchain-database-on-top-of-rethinkdb • White Paper: BigchainDB: A Scalable Blockchain Database(DRAFT) 
 https://www.bigchaindb.com/whitepaper/bigchaindb-whitepaper.pdf • White Paper: IPFS - Content Addressed, Versioned, P2P File System (DRAFT 3) 
 https://ipfs.io/ipfs/QmR7GSQM93Cx5eAg6a6yRzNde1FQv7uL6X1o4k7zrJa3LX/ipfs.draft3.pdf
  • 62.
    • OSS Go Go •Docs White Paper pdf • • Euthareum Github Github