Más contenido relacionado La actualidad más candente (20) Similar a Concept of BlockChain & Decentralized Application (20) Concept of BlockChain & Decentralized Application3. • github: timakin
• twitter: @__timakin__
• DeNA -> Translimit
• Go / Ruby / Node
• Blog
medium: https://medium.com/@timakin
timekin.log: http://tech-savvy.hatenablog.com/
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',
}
17. 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
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 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
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
contract SingleNumRegister {
uint storedData;
function set(uint x) {
storedData = x;
}
function get() constant returns (uint retVal) {
return storedData;
}
}
Solidity JavaScript
34. 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
35. Contract Code
$ contract
{
address: '0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb',
transactionHash:
'0xeb76caefdfe5a9aa10b11743d317cf15f881d3b2e52ba3251dcf8e0718ed5b33'
,
allEvents: function (),
get: function (),
set: function ()
}
#
$ contractAbiDefinition
36. 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()
37. 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
38. 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();
```
39. 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>
```
40. 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>
```
41. 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
45. 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
```
46. 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
47. 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
52. 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
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
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