Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Concept of BlockChain & Decentralized Application

4,033 views

Published on

「Concept of BlockChain & Decentralized Application(副題:俺たちのブロックチェーン)」 @ YAP(achimon)C::Asia Hachioji 2016 mid in Shinagawa

Published in: Engineering

Concept of BlockChain & Decentralized Application

  1. 1. Concept of BlockChain & Decentralized Application timakin / @__timakin__ YAP(achimon)C::Asia Hachioji 2016 mid in Shinagawa
  2. 2. • github: timakin • twitter: @__timakin__ • DeNA -> Translimit • Go / Ruby / Node • Blog
 medium: https://medium.com/@timakin
 timekin.log: http://tech-savvy.hatenablog.com/
  3. 3. • • • • •
  4. 4. • • • •
  5. 5. P2P 

  6. 6. P2P 

  7. 7. Chain Flow hash target nonce transactions transactions transactions blockblock block
  8. 8. Inside of blockchain • JSON JSON • nonce • parent hash hash
  9. 9. 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', }
  10. 10. Chain management • P2P Node json • Node
  11. 11. A B C fork
  12. 12. 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
  13. 13. • • PoW 
 10 • • • PoS • • • Node •
  14. 14. DApp Stack
  15. 15. Decentralized Application P2P Node 
 Permanent web

  16. 16. Decentralized Application Processing File Storage Database
  17. 17. Decentralized Application Processing File Storage Database Processing File Storage Database
  18. 18. Euthareum • • ether
  19. 19. Euthareum Client • Geth (go-euthareum) Node
  20. 20. 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
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. Contract Code # Solidity contract SingleNumRegister { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } } Solidity JavaScript
  25. 25. 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
  26. 26. Contract Code $ contract { address: '0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb', transactionHash: '0xeb76caefdfe5a9aa10b11743d317cf15f881d3b2e52ba3251dcf8e0718ed5b33' , allEvents: function (), get: function (), set: function () } # $ contractAbiDefinition
  27. 27. 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()
  28. 28. 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
  29. 29. 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(); ```
  30. 30. 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> ```
  31. 31. 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> ```
  32. 32. 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 

  33. 33. Euthareum • • Euthareum
  34. 34. BigChainDB • • • key-value JSON • python
  35. 35. BigChainDB RethinkDB BigChainDB https://speakerdeck.com/vrde/bigchaindb-how-we-built-a-blockchain-database- on-top-of-rethinkdb
  36. 36. 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
 ```
  37. 37. 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
  38. 38. 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
  39. 39. BigChainDB • • key-value RethinkDB
  40. 40. IPFS • • gateway REST API curl • P2P
  41. 41. 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
  42. 42. WEBUI
  43. 43. 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
  44. 44. 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
  45. 45. ex) gx-go https://github.com/whyrusleeping/gx-go ipfs version 
 go package manager
  46. 46. ex) ipfs-pics https://ipfs.pics/ ipfs script
  47. 47. IPFS • • gateway REST API curl • gateway 
 (https://ipfs.io/ipfs/$hash) •
  48. 48. DApp • • DB Storage CDN BigChainDB Peer Node IPFS Peer Node Processing File Storage Database tr tr tr bb b bb b bb b
  49. 49. • • P2P CDN • Node Client-Server • or <
  50. 50. • 
 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
  51. 51. • 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
  52. 52. • OSS Go Go • Docs White Paper pdf • • Euthareum Github Github

×