SlideShare ist ein Scribd-Unternehmen logo
1 von 48
TECHNOMOBILE
GROUP
HEAD OFFICE
TOKUSHIMA development section
| 5floor Column Minamiaoyama,7-1-5,Minamiaoyama,Minato-ku,Tokyo 107-0062,Japan
| 3floor Tokushimakenkohkagaku-center,Hiraishisumiyoshi,Kawauchi-cho,Tokushima-shi Tokushima 771-0134,Japan
Ethereumをさわって実感するブロックチェーンハンズオン
2
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
みなさんBitcoin知ってますか?
3
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
逮捕されたり。。。仮想だし。。。
なんか怖いですよね
4
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
マウントゴックスの件は、不正会計や
かってに送金されただけで、Bitcoinの
セキュリティーをがハックされたわけ
ではないのです。
5
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
上下しながら取引されています。
6
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Bitcoinで使われているブロックチェー
ンは通貨だけではなく広くサービスと
して使われつつあります。管理サー
バー無しで。。
Swarm
クラウドファンディングのプラットフォーム
Storjcoin X
分散型ストレージサービス
Gems
分散型メッセンジャーアプリ
LTBcoin
「Let's Talk Bitcoin」というビットコインのPodcastサービスの広告枠の利用等
に使用
7
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
まずはBitcoinを使ってみましたか?
今回は、Ethereumを使って実際にブ
ロックチェーンの操作をしながら深く
内容を理解していきます。
8
「Gethのインストール」と「テストネットに接続しましょう」「Contract作成の環
境設定
」「Contract作成のSolc設定」ページを参考にGethとSolcのインストールをして
おいてください。MacでもDocker環境がおすすめです。
SlideShareのスライドをDownloadしておくと、テキストのコピペが楽になりま
す。
6
事前準備
9
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
この学びの対象者は?
→Bitcoinなどに使われているブロック
チェーンを操作しながら理解・体験したい
人。簡単なプログラムを理解できる人。
Linuxの基本コマンドが分かる人。
ブロックチェーンアプリを作りたい人。
WindowsのDocker環境で説明をします。
教えないことは?
→ブロックチェーンの専門家ではないの
で。。。
10
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
講師
Gashfara,Inc.代表
デジタルハリウッド大学院客員講師
茂木健一
mogi@gashfara.com
kenichi.mogi@tcmobile.jp
http://facebook.com/mogiken
http://www.slideshare.net/mogiken1
自己紹介
[プロフィール/実績]
もぎ・けんいち●青山学院大学大学院卒。Gashfara,Inc.代表。本社はハワイですが出社したことなし。
ホノルルマラソンには参加w
青山学院大学大学院卒:エニックスでオリジナルゲーム制作(Z80アセンブラ CP/M)、SmallTalkで
人工知能開発(企業買収)。
(株)東洋情報システム退社後、(株)エイチアイ、グランスフィア(株)、(株)ファッション
ウォーカー(えびもえのEC)など数社のベンチャー企業の立ち上げ・創業期に参画し、ガシュファ
ラ・インクをUSで起業。システム開発ではゲーム、TOL(ツタヤオンライン)の立ち上げ。動画配
信システム(USENのGate01:Gyaoの前進)、電子マネーシステム(Bitcash)、ECフルフィルメント
システムなど、多彩な分野を経験。IT関連教育では1998年ころからデジハリの2.5階に間借りしな
がら教育コンテンツ作成(JIB社)。Brew、Java、セキュリティーなどの講師として活躍。現在、
(株)HUGGを設立し、スマホのカップル向けSNSサービス[HUGG]をグローバルに展開。㈱テクノ
モバイルにて技術サポート。
【著書】
BREWプログラミング実践バイブル [共著] (インプレス)、PHP逆引き大全 516の極意[共著](秀和
システム)
11
成長を実現させるシステム”モバイルトータルソリュー
ション”
Web
システム
1
スマホ
アプリ
2 ゲーム
アプリ
3
モバイルトータルソリューション
B2B2C
• コンシューマ向けの大規模Webシステムの開発からアプリ・ゲーム開発までをマルチデバイスで対応
高い技術力 市場ニーズとマッチ
大規模
Webシステム
に強い
Java,PHP
Strong1
最先端技術・独自
フレームワークで
効率的な
開発
Strong2
高トラフィック、
インフラ
ネットワーク
に強い
Strong3 プライマリー
ベンダー、
ヒアリング・
要件定義
に強い
StrongⅠ
情報資産の活用
最先端と
知見に強い
StrongⅡ
最先端のマルチ
デバイス
ウェアラブルに
強い
StrongⅢ
Mashup Awards 5年連続 受賞
会社名 株式会社テクノモバイル
設 立 2008年
資本金 2,500万円
代 表 播田 誠
従業員数 100名(グループ合計)
本社所在地
〒 107-0062
東京都港区南青山7-1-5 コラム南青山 5F
開発室
〒771-0134
徳島県徳島市川内町平石住吉209-5
徳島健康科学総合センター 3F
12
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Bitcoinとは
・2009年から運用が始まった仮想通貨。単
位:BTC
・管理サーバーを持たず、ルールに基づいた
P2Pネットワーク上に信用のもと構築・運用
・手数料が安い
・信用はブロックチェーンの仕組み。
・誰でも情報にアクセスして検証することが
できる
・取引所で現金化も可能
・実店舗でも利用可能。
http://jpbitcoin.com/shops
※ここがわかりやすい。
http://gigazine.net/news/20131007
-what-is-bitcoin/
13
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Ethereumとは
・ブロックチェーンを使った分散アプリケー
ションプラットフォームです。
・Bitcoinのように仮想通貨の送金のみならず、
仮想通貨を使ったアプリケーションの実行環
境を提供します。→Contract
・通貨単位:ether
・Bitcoinと同じように取引が可能です。
・プライベートネットワークでも実行可能。
トランザクションDBのかわりに使うことがで
きる。プライベート上のetherは取引不可能。
参考 https://www.gitbook.com/book/a-mitani/mastering-ethereum/details
14
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
ブロックチェーンとは
・この解説が一番わかり易い。
http://www.slideshare.net/cookle/5-58379474
こまかいロジックはBitcoinのソースコードを
読むのが正解らしい。。。
※ポイントは。。。。
チェーンの改ざんを抑止するためにハッシュ値の計算(マイニング)
する難しさを定期的に調整しているが、調整が間に合わないような高速
演算できる環境を持ち込まれると長いチェーンを作成されてしまい、改
ざんできる余地がある。→完璧ではない。十分難しい状態のまま。
15
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
・この書籍がわかりやすい。おすすめ
http://www.amazon.co.jp/gp/product/B00IZG
MCFC/ref=oh_aui_d_detailpage_o00_?ie=UTF
8&psc=1
16
GethがEthereumのプロセスになります。これらが複数集まってブロックチェー
ンのP2Pネットワークを構成します。
Macの場合:次ページにあるWindowsとおなじDocker環境でも動作します。
MacなどのLinux系では下記のコマンドでインストールできます。英語でインス
トールするか聞かれたらyを入力。参考http://book.ethereum-
jp.net/first_use/installing_geth.html
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Gethのインストール
bash <(curl -L https://install-geth.ethereum.org)
WindowsとおなじくDockerがおすすめ
17
Windows Macの場合:
下記の手順でDocker環境を作成します。
1.Docker Toolboxのインストール
https://www.docker.com/products/docker-toolbox からDockerToolboxをダウン
ロードしてインストールしてください。デフォルトのままインストールを進めて
OKです。
インストールされたDocker Quickstart Terminalを起動して下記のようなターミナ
ルが表示されればインストールはOKです。exitで終了できます。
※MacOS Sierraの場合はこれを参考 http://qiita.com/Ryosuke-
Hujisawa/items/67f9dff2fadd729165dc
2.コンテナethertestを作成。exitで終了します。
docker run -it --name "ethertest" --entrypoint="/bin/sh" ethereum/client-go
exit でぬけます
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
18
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
テストネットに接続しましょう
自分だけのテスト用の環境テストネットに接続しましょう。参考
https://goo.gl/zcG2rZ
0.Docker環境の人は下記のコマンドでログインできます。
docker start ethertest
docker attach ethertest
1.gethデータのフォルダーを「~/gethdata」のように作成しましょう。ここに
ブロックチェーンやアカウント情報が保存されます。
mkdir ~/gethdata
3.下記のコマンドを実行するとコンソールで操作できるgethが起動します。こ
れがノードです。exitと入力すると終了します。
geth --networkid "10" --datadir "~/gethdata" --dev --nodiscover console
※networkid : テストネットの番号です。適当でOK。
datadir : 上記で作成したフォルダーの場所です。
dev: 開発用の設定。gasは常に0.マイニングなどが早い。参考:https://goo.gl/OXFN6u 動作テストではolympic
を使う。
console : コンソール付きで起動します。&をつければバックグラウンドで動作できます。
nodiscover:ほかのネットワークにつなげないようにする。
※本番ネットはここを参考に接続できます。http://book.ethereum-
jp.net/first_use/connect_to_livenet.html
exitでconsoleを抜けます
コマンド一覧:http://qiita.com/toshikase/items/fa7a826db483177d1e80
19
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contract作成の環境設定
1.コンパイラーsolcのインストールを確認しましょう。gethのコンソールを使いま
す。参考:https://goo.gl/11HsGx
eth.getCompilers()
→[""] 空の時は未インストール
2.solcをインストール。★めちゃ時間がかかります。OSで実行します。exitで
consoleを抜けます。
Macの場合
brew install cpp-ethereum
brew linkapps cpp-ethereum
solc -version →メッセージが表示されればOK.
Docker環境(Windows)の場合
apk --update add git
git clone https://github.com/ethereum/solidity.git
cd solidity
./scripts/install_deps.sh
mkdir build && cd build
cmake ..
make
cp -p build/solc/solc /usr/bin
solc –-version →メッセージが表示されればOK.
コマンドがなくなってます
WindowsとおなじくDockerがおすすめ
20
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contract作成のSolc設定
1.OSでsolcのインストールパスを確認します。
which solc でインストールパスをメモします。
-> /usr/bin/solc
2.gethのコンソールで上記のインストールパスを指定してsolcを設定します。
admin.setSolc("/usr/bin/solc")
3.eth.getCompilers() で["Solidity"]が表示されれば設定はOK
コマンドがなくなってます
21
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
アカウントを作成しましょう
1.コンソールを使い下記のコマンドを入力して2名のアカウントを作成しま
しょう。
personal.newAccount("hogehoge01")
パスワードhogehoge01のアカウントのIDが表示されます。
→ “0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268” AさんのID
personal.newAccount("hogehoge02")
パスワードhogehoge02のアカウントのIDが表示されます。
→ “0x9620dd004b3715210b30690ec95589ec9830f3bc” BさんのID
2.作成した全アカウントを確認します。
eth.accounts
→["0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268",
"0x9620dd004b3715210b30690ec95589ec9830f3bc"]
22
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
マイニング(採掘)しましょう
1.採掘するアカウントを確認
eth.coinbase
→ "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268"
このノードで採掘するアカウントIDが表示されます。デフォルトは最初に作成したA
さんのID
miner.setEtherbase(eth.accounts[1])のように別アカウントに変更も可能。
2.採掘を開始
miner.start()
3.報酬の確認。下記でAさんの報酬のetherを確認できます。単位をweiからetherに
変換しています。プライベートネットワークではトランザクションの要求がなくても
報酬が得られます。ライブネット(本番)ではこんなに簡単には採掘できません。
web3.fromWei(eth.getBalance(eth.coinbase),"ether")
23
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
4.採掘の停止。報酬が得られたら適当なタイミングで停止しましょう。最初は時間
がかかるので、しばらくはstopしないほうがよい。ログに「Generating DAG: 54%」
などと出ている時はDAGデータの作成中で、このあと採掘される。--dev以外のオプ
ションではかなり時間がかかる。
miner.stop()
eth.hashrate を実行して0以上の数値が表示されると採掘中です。
採掘していなくても0以上の数値になります。仕様が変わった?
24
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
送金しましょう
1.Aさん、Bさんの現在の報酬を確認しましょう。
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
→13.5
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
→0
2.AさんからBさんに5ether送金しましょう。データはJSONで表記します。実行時
にパスワードを入力します。この処理のトランザクションIDが表示されます。
personal.unlockAccount(eth.accounts[0],"hogehoge01",60000) <-送金者をunlock
eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5,
"ether")})
→"0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09"
3.A,Bさんの報酬を確認しましょう。コマンドは1と同じです。→報酬が変わって
いない?です。だれもマイニングしていないためです。
25
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
4.採掘を停止していたら、採掘を開始しましょう。
miner.start()
5.A,Bさんの報酬を確認しましょう。マイニングされたので送金完了しています。
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
→11.5(送金分と手数料分のマイナス、マイニング分のプラス)
--devでgethを起動していると手数料gasは0
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
→5(Aさんからの送金分)
6.コマンドを操作したいので停止しましょう
miner.stop()
26
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
送金トランザクションを確認しましょう
全体構造
parentHash hash
nonce
Transaction
TransactionReceipt
Block
stateRoot
parentHash hash
nonce
Transaction
TransactionReceipt
stateRoot
parentHash hash
nonce
Transaction
TransactionReceipt
stateRoot
参考:
WhitePaper: https://goo.gl/7R8TL5
YellowPage https://goo.gl/A6H4oL
スニペット https://goo.gl/9Fw2qb
https://goo.gl/9Scucd
transactionsRoot transactionsRoottransactionsRoot
27
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
1.送金時のトランザクションIDからトランザクションの状態を確認しましょう。
eth.sendTransactionを実行したときの結果のアドレスがトランザクションIDです。
eth.getTransaction("0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524f
a47b3b0fb09")
→
{
blockHash: "0x1c5f0241b80ca16205b99b2833da4c7a323784fa218290785791430c12f191ea",
blockNumber: 4,
from: "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268",
gas: 90000,
gasPrice: 21142503856,
hash: "0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09",
input: "0x",
nonce: 0,
r: "0x21bcb629404fd66dce492928f022ccd60ce32612df3cee6110af79bd65eed5d4",
s: "0x112f50f9a1c9ecf21010598f0b04a1c74d1e38f2675b7f029cdc1796a2138010",
to: "0x9620dd004b3715210b30690ec95589ec9830f3bc",
transactionIndex: 0,
v: "0x1b",
value: 5000000000000000000
}
28
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
2.主な項目です。
blockHash & blockNumber:このトランザクションを含んだブロックのヘッダ・ハッ
シュとブロック高を示しています。まだこのトランザクションを含んだブロックが採
掘されていないときには、これらのフィールドは空の状態で表示されます。
hash:トランザクションID
gas:トランザクションの処理時のgasの使用量の「最大値」を示しています。(実
際のトランザクション処理時のgasの使用量ではないので、注意してください。
gasPrice:トランザクションの処理時に採掘者に支払う1 gas 当たりの手数料
(wei)を示しています。
from & to & value:それぞれ、トランザクションにより送金する送金元、宛先、送金
額(wei)を示しています。
29
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
3.このトランザクションの詳細レシートを確認しましょう。hash値(トランザク
ションID)でレシートが確認できます。マイニングされるまで作成されない。
eth.getTransactionReceipt("0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524
fa47b3b0fb09")
→
{
blockHash: "0x1c5f0241b80ca16205b99b2833da4c7a323784fa218290785791430c12f191ea",
blockNumber: 4,
contractAddress: null,
cumulativeGasUsed: 21000,
from: "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268",
gasUsed: 21000,
logs: [],
logsBloom:
"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000",
root: "0x39f372967a04790d5f9d03be5bf43e17d3e76ced6b13cf6fcb3c21a90b612624",
to: "0x9620dd004b3715210b30690ec95589ec9830f3bc",
transactionHash: "0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09",
transactionIndex: 0
}
contractAddress...contractのトランザクションの時にアドレスがセット
gasUsed...使われたgas
30
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
※
コントラクトの場合 contractAddress がセットされるが
実行時にエラーがthrowされると下記のように実行コードが作成されないので下
記の結果のlength>3でエラーがないか確認する必要がある
eth.getCode(’アドレス’)
→"0x"
31
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
4.このトランザクションのブロックを見てみましょう. 参考:eth.blockNumberの結果
が最終ブロックです。
eth.getBlock(4)
->
{
difficulty: 131072,
extraData: "0xd783010501846765746887676f312e372e33856c696e7578",
gasLimit: 4712388,
gasUsed: 21000,
hash: "0x1c5f0241b80ca16205b99b2833da4c7a323784fa218290785791430c12f191ea",
logsBloom:
"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000",
miner: "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268",
mixHash: "0xd53177889fc004fe809409045c318bc7506d2a2fa610d32cdb2b1b1ce7730002",
nonce: "0x76d2a8cd7fb50d0d",
number: 4,
parentHash: "0xe23f79fb6a7747ed3965c53e8ccf8a2b11dacee75aff81af30cd834afc2b4eb9",
receiptsRoot: "0x189025d0b71a0d06f4e72c54e1d0c768375314b9422f0fa02b99c9bd58740638",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 649,
stateRoot: "0x8cf12f49b25835524c65c9f37db282715f813c53ab9a7561d2d57a1ed6ea4f06",
timestamp: 1479893472,
totalDifficulty: 655360,
transactions: ["0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09"],
transactionsRoot: "0x075d3b93f7daa5d9c185d0bb4a6227f77e6937d8040c052d7fdee001263819e2",
uncles: []
}
32
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
5.主な項目です。
difficulty...採掘の難しさです。
hash...このブロック番号のハッシュ値
miner...採掘したアカウント
nonce...採掘されたときのnonce値。採掘では、このブロックのhash値になるようにnonce値を
計算します。
number ... このブロックの番号
parentHash...前のブロックのhash値.つまりブロック3のhash値になる。
timestamp...作成日時
transactions...このブロックに含まれるトランザクションの配列
stateRoot...ここにパトリシア木構造で残高などが保存されているみたい。
https://goo.gl/SQuYg2
receiptsRoot...レシートのパトリシア木構造?
transactionsRoot...トランザクションのパトリシア木構造。このブロックのトランザクションの概
要が入っている。
全体構造はビットコインのこの解説がわかりやすい。
https://goo.gl/wpnEeS
33
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractとは
Contract:
オブジェクト指向言語での「クラス」に似たものです。Contractは、各自にクラス変
数に相当するような、内部状態を保持するストレージ部分と、メソッドに相当するよ
うな、実行コードである「コントラクト・コード」を持っています。
取引情報の代わりにこのContractをブロックチェーン内に保持します。
Solidity:
Solidityは Java Script に似た言語です。Contractを表現するために使われます。
文法解説:
http://qiita.com/hshimo/items/0feca242ab97fa36fc33
34
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractの作成手順
1.Contractの作成
Solidity言語でコントラクト・コードをプログラミングします。solcを使って
コードをコンパイルします。
2.Contractをブロックチェーンへ登録
コンパイル結果を用いて、Contract を生成するトランザクションをEthereum
ネットワークに送信する。そのトランザクションを受信した採掘者は、トラン
ザクションをブロックチェーンに登録する(=Contractをブロックチェーンに
登録する)。この時Contractのアドレスが発行される。
3.Contractへアクセス
Contractを利用するユーザーは、Contract作成者からContractへのアクセス情報
の取得します。その情報をもとにContractへアクセスし、コントラクト・コー
ドの実行等を行う。値が変更になるメソッドを実行する時は、ブロックチェー
ンへの登録が必要になります。値を参照するだけでは登録の必要はありません。
35
1.Solidyで下記のプログラムを作成します。値のsetとgetを行います。
参考: https://goo.gl/4zG5cO
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractの作成
pragma solidity ^0.4.6;
contract SingleNumRegister {
uint storedData;
function set(uint x) {
storedData = x;
}
function get() constant returns (uint retVal) {
return storedData;
}
}
36
1.Solcコマンドを使ってContractをコンパイルします。
echo "pragma solidity ^0.4.6; contract SingleNumRegister { uint
storedData; function set(uint x) { storedData = x; } function get() constant
returns (uint retVal) { return storedData; }}" | solc --abi --bin
→ソースをコンパイル (前記プログラムを改行なしで指定します)
下記のような結果が表示されます。
Binaryが実行コード、ABIがABI情報というContractのインターフェース情報で
す。
この2つを使ってContractをブロックチェーンに登録します
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractのコンパイル
Binary:
6060604052341561000f57600080fd5b60cb8061001d6000396000f30060606040526000357c010000000000000000000000
0000000000000000000000000000000000900463ffffffff16806360fe47b11460465780636d4ce63c14606657600080fd5b3415
605057600080fd5b60646004808035906020019091905050608c565b005b3415607057600080fd5b60766096565b60405180
82815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a72305820a929288f
cb2c4830b5557eae8bc26023756ef2aae165b82f6b9a93a644f364090029
Contract JSON ABI
[{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonp
ayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable
":false,"stateMutability":"view","type":"function"}]
37
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractをブロックチェーンへ登録
1.gethを起動
geth --networkid "10" --datadir "~/gethdata" --dev --nodiscover console
2.ABI情報を変数に登録。
var contractAbiDefinition
=[{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","ou
tputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"c
onstant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uin
t256"}],"payable":false,"stateMutability":"view","type":"function"}]
3.コントラクトを作成。メモリー上のみ。
var sourceCompiledContract = eth.contract(contractAbiDefinition)
4.実行コードを変数に登録。
var sourceCompiledCode =
"6060604052341561000f57600080fd5b60cb8061001d6000396000f300606060405
26000357c0100000000000000000000000000000000000000000000000000000000
900463ffffffff16806360fe47b11460465780636d4ce63c14606657600080fd5b3415
605057600080fd5b60646004808035906020019091905050608c565b005b3415607
057600080fd5b60766096565b6040518082815260200191505060405180910390f3
5b8060008190555050565b600080549050905600a165627a7a72305820a929288fc
b2c4830b5557eae8bc26023756ef2aae165b82f6b9a93a644f364090029"
38
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractをブロックチェーンへ登録
5.登録者をunlock。Etherが0では登録できない。
personal.unlockAccount(eth.accounts[0],"hogehoge01",60000)
6.コントラクトを作成するトランザクションを投げる。コードは0xをつけないと
エラー。
var contract = sourceCompiledContract.new({from:eth.accounts[0], data:
"0x"+sourceCompiledCode , gas: 1000000})
→
fullhash=0x240934ec11de43b074aaa607bbe498cf117ec17ede565f9ba11157e1cb2
0d9e4
FullhashがトランザクションID。Aさんのアカウントでブロックチェーンに登録。
Unlockが必要。
contractでマイニングの状態がわかる。
採掘していない時はminer.start()で採掘してください。
完了したらminer.stop()
39
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
7.contractの中身を確認しましょう。採掘されてブロックチェーンに登録され
ると、 address:に値がセットされます。
transactionHashは前頁の登録時のトランザクションの値です。 addressが登録
されたコントラクトのアドレスです。
contract
→
{
abi: [{
constant: false,
inputs: [{...}],
name: "set",
outputs: [],
payable: false,
stateMutability: "nonpayable",
type: "function"
}, {
constant: true,
inputs: [],
name: "get",
outputs: [{...}],
payable: false,
stateMutability: "view",
type: "function"
}],
address: "0x25bfc344ad63686c2eb8bc25335d908f7c3d46ad",
transactionHash: "0x240934ec11de43b074aaa607bbe498cf117ec17ede565f9ba11157e1cb20d9e4",
allEvents: function(),
get: function(),
set: function()
}
40
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractにアクセスしましょう
1.Contractを使うためにはContractのaddressとABI情報(Contractの仕様書み
たいなもの)が必要です。
addressは前頁のaddress値
ABI情報は変数contractAbiDefinitionの値を確認しましょう。
contractAbiDefinition
→
[{
constant: false,
inputs: [{
name: "x",
type: "uint256"
}],
name: "set",
outputs: [],
payable: false,
type: "function"
}, {
constant: true,
inputs: [],
name: "get",
outputs: [{
name: "retVal",
type: "uint256"
}],
payable: false,
type: "function"
}]
41
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
2.下記のようにcontractにアクセスするための変数cntを作成しましょう。
address部分は自分のcontractの値で。
var cnt =
eth.contract(contractAbiDefinition).at("0x25bfc344ad63686c2eb8bc25335d908f7
c3d46ad")
3.Aさんがcontractのset関数を実行するには下記のように実行します。6を
セットしています。値が変化するのでブロックチェーンへの登録が必要です。
つまり採掘が必要です。
personal.unlockAccount(eth.accounts[0],"hogehoge01",60000)
cnt.set.sendTransaction(6,{from:eth.accounts[0]})
→fullhash=0x0d892e531b767acd18b4dc551c0dc023d0e6f8feb5faf58bd5e7689
707cdd51b
4.採掘されると下記の実行で値6が表示されます。 miner.start() miner.stop()な
ど実行
cnt.get()
→6
42
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractの楽な作りかた
Gethを使った方法では開発効率がよくありません。
下記の参考URLのようにブラウザを使ったIDEが用意されているのでこれを使い
ましょう。 http://ethereum.github.io/browser-solidity/
注意としてGethの起動オプションに下記を追加しましょう。
--rpc --rpccorsdomain="*" --unlock
0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268
(コントラクトを登録するアカウントのアドレスです。Gethの起動時にパスワー
ドが聞かれます。)
43
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
サーバーサービスとして作成するには
gethプロセスをRPCで起動し、下記のweb3.jsを使うとnode.jsでgethにアクセス
することが可能です。
この環境でアプリを開発します。
参考書籍にサンプルプログラムがありますが、フロントのJSのみで作成されて
います。Node.jsで作成したほうが安全です。
下記のようなオプションでgethを起動し、Node.jsと接続します。
--rpc --rpcapi "db,eth,net,web3,personal,admin,miner" --rpccorsdomain="*" --
rpcaddr "0.0.0.0"
参考: https://goo.gl/qxXYax
Node.js Web3.js geth
PHP
RPC
44
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
プライベートネットワークの作り方
下記を参考にすれば複数ノードに分散されたプライベートネットワークを作成
することが出来ます。
参考:http://qiita.com/hshimo/items/8b69975d40466022f278
45
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
・このスライドにまとまってます
https://goo.gl/VFepav
Ethereumの情報の集め方
46
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
・http://amzn.to/2xMmJZ9
Ethereum開発の参考書籍
47
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
・http://amzn.to/2fAhDCv
Bitcoinアルゴリズム・データ構造の参
考書籍
48
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
・ブロックチェーンを使ったシステム設計の
基礎
適用事例(経営者・営業担当の方に)

Weitere ähnliche Inhalte

Mehr von 健一 茂木

Cocos2d js セットアップ for windows
Cocos2d js セットアップ for windowsCocos2d js セットアップ for windows
Cocos2d js セットアップ for windows健一 茂木
 
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオンHyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン健一 茂木
 
Docker環境でetherium開発環境を作る際のはまりどころ
Docker環境でetherium開発環境を作る際のはまりどころDocker環境でetherium開発環境を作る際のはまりどころ
Docker環境でetherium開発環境を作る際のはまりどころ健一 茂木
 
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオン
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオンTensorflowのチュートリアルで理解するdeep learningはじめてハンズオン
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオン健一 茂木
 
pケモンGoみたいなarアプリをandroidで作るハンズオン
pケモンGoみたいなarアプリをandroidで作るハンズオンpケモンGoみたいなarアプリをandroidで作るハンズオン
pケモンGoみたいなarアプリをandroidで作るハンズオン健一 茂木
 
Slackとgoogle appsscript(js)で作る俺の秘書ハンズオン
Slackとgoogle appsscript(js)で作る俺の秘書ハンズオンSlackとgoogle appsscript(js)で作る俺の秘書ハンズオン
Slackとgoogle appsscript(js)で作る俺の秘書ハンズオン健一 茂木
 
Java script初心者のためのnode.jsで学ぶドローン制御プログラミング
Java script初心者のためのnode.jsで学ぶドローン制御プログラミングJava script初心者のためのnode.jsで学ぶドローン制御プログラミング
Java script初心者のためのnode.jsで学ぶドローン制御プログラミング健一 茂木
 
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオンシンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン健一 茂木
 
ひとりでできるもん!サーバープログラム不要、Java Scriptだけで作るハイブリッドアプリ(iphone,android,web)...
ひとりでできるもん!サーバープログラム不要、Java Scriptだけで作るハイブリッドアプリ(iphone,android,web)...ひとりでできるもん!サーバープログラム不要、Java Scriptだけで作るハイブリッドアプリ(iphone,android,web)...
ひとりでできるもん!サーバープログラム不要、Java Scriptだけで作るハイブリッドアプリ(iphone,android,web)...健一 茂木
 
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオンJava ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン健一 茂木
 

Mehr von 健一 茂木 (11)

自己紹介Lt
自己紹介Lt自己紹介Lt
自己紹介Lt
 
Cocos2d js セットアップ for windows
Cocos2d js セットアップ for windowsCocos2d js セットアップ for windows
Cocos2d js セットアップ for windows
 
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオンHyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
 
Docker環境でetherium開発環境を作る際のはまりどころ
Docker環境でetherium開発環境を作る際のはまりどころDocker環境でetherium開発環境を作る際のはまりどころ
Docker環境でetherium開発環境を作る際のはまりどころ
 
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオン
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオンTensorflowのチュートリアルで理解するdeep learningはじめてハンズオン
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオン
 
pケモンGoみたいなarアプリをandroidで作るハンズオン
pケモンGoみたいなarアプリをandroidで作るハンズオンpケモンGoみたいなarアプリをandroidで作るハンズオン
pケモンGoみたいなarアプリをandroidで作るハンズオン
 
Slackとgoogle appsscript(js)で作る俺の秘書ハンズオン
Slackとgoogle appsscript(js)で作る俺の秘書ハンズオンSlackとgoogle appsscript(js)で作る俺の秘書ハンズオン
Slackとgoogle appsscript(js)で作る俺の秘書ハンズオン
 
Java script初心者のためのnode.jsで学ぶドローン制御プログラミング
Java script初心者のためのnode.jsで学ぶドローン制御プログラミングJava script初心者のためのnode.jsで学ぶドローン制御プログラミング
Java script初心者のためのnode.jsで学ぶドローン制御プログラミング
 
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオンシンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
 
ひとりでできるもん!サーバープログラム不要、Java Scriptだけで作るハイブリッドアプリ(iphone,android,web)...
ひとりでできるもん!サーバープログラム不要、Java Scriptだけで作るハイブリッドアプリ(iphone,android,web)...ひとりでできるもん!サーバープログラム不要、Java Scriptだけで作るハイブリッドアプリ(iphone,android,web)...
ひとりでできるもん!サーバープログラム不要、Java Scriptだけで作るハイブリッドアプリ(iphone,android,web)...
 
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオンJava ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
Java ScriptでつくるはじめてのiPhoneAndroidゲーム開発体験ハンズオン
 

Kürzlich hochgeladen

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Kürzlich hochgeladen (8)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

Ethereumをさわって実感するブロックチェーンハンズオン

  • 1. TECHNOMOBILE GROUP HEAD OFFICE TOKUSHIMA development section | 5floor Column Minamiaoyama,7-1-5,Minamiaoyama,Minato-ku,Tokyo 107-0062,Japan | 3floor Tokushimakenkohkagaku-center,Hiraishisumiyoshi,Kawauchi-cho,Tokushima-shi Tokushima 771-0134,Japan Ethereumをさわって実感するブロックチェーンハンズオン
  • 2. 2 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 みなさんBitcoin知ってますか?
  • 3. 3 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 逮捕されたり。。。仮想だし。。。 なんか怖いですよね
  • 4. 4 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 マウントゴックスの件は、不正会計や かってに送金されただけで、Bitcoinの セキュリティーをがハックされたわけ ではないのです。
  • 5. 5 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 上下しながら取引されています。
  • 6. 6 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Bitcoinで使われているブロックチェー ンは通貨だけではなく広くサービスと して使われつつあります。管理サー バー無しで。。 Swarm クラウドファンディングのプラットフォーム Storjcoin X 分散型ストレージサービス Gems 分散型メッセンジャーアプリ LTBcoin 「Let's Talk Bitcoin」というビットコインのPodcastサービスの広告枠の利用等 に使用
  • 7. 7 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 まずはBitcoinを使ってみましたか? 今回は、Ethereumを使って実際にブ ロックチェーンの操作をしながら深く 内容を理解していきます。
  • 9. 9 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 この学びの対象者は? →Bitcoinなどに使われているブロック チェーンを操作しながら理解・体験したい 人。簡単なプログラムを理解できる人。 Linuxの基本コマンドが分かる人。 ブロックチェーンアプリを作りたい人。 WindowsのDocker環境で説明をします。 教えないことは? →ブロックチェーンの専門家ではないの で。。。
  • 10. 10 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 講師 Gashfara,Inc.代表 デジタルハリウッド大学院客員講師 茂木健一 mogi@gashfara.com kenichi.mogi@tcmobile.jp http://facebook.com/mogiken http://www.slideshare.net/mogiken1 自己紹介 [プロフィール/実績] もぎ・けんいち●青山学院大学大学院卒。Gashfara,Inc.代表。本社はハワイですが出社したことなし。 ホノルルマラソンには参加w 青山学院大学大学院卒:エニックスでオリジナルゲーム制作(Z80アセンブラ CP/M)、SmallTalkで 人工知能開発(企業買収)。 (株)東洋情報システム退社後、(株)エイチアイ、グランスフィア(株)、(株)ファッション ウォーカー(えびもえのEC)など数社のベンチャー企業の立ち上げ・創業期に参画し、ガシュファ ラ・インクをUSで起業。システム開発ではゲーム、TOL(ツタヤオンライン)の立ち上げ。動画配 信システム(USENのGate01:Gyaoの前進)、電子マネーシステム(Bitcash)、ECフルフィルメント システムなど、多彩な分野を経験。IT関連教育では1998年ころからデジハリの2.5階に間借りしな がら教育コンテンツ作成(JIB社)。Brew、Java、セキュリティーなどの講師として活躍。現在、 (株)HUGGを設立し、スマホのカップル向けSNSサービス[HUGG]をグローバルに展開。㈱テクノ モバイルにて技術サポート。 【著書】 BREWプログラミング実践バイブル [共著] (インプレス)、PHP逆引き大全 516の極意[共著](秀和 システム)
  • 11. 11 成長を実現させるシステム”モバイルトータルソリュー ション” Web システム 1 スマホ アプリ 2 ゲーム アプリ 3 モバイルトータルソリューション B2B2C • コンシューマ向けの大規模Webシステムの開発からアプリ・ゲーム開発までをマルチデバイスで対応 高い技術力 市場ニーズとマッチ 大規模 Webシステム に強い Java,PHP Strong1 最先端技術・独自 フレームワークで 効率的な 開発 Strong2 高トラフィック、 インフラ ネットワーク に強い Strong3 プライマリー ベンダー、 ヒアリング・ 要件定義 に強い StrongⅠ 情報資産の活用 最先端と 知見に強い StrongⅡ 最先端のマルチ デバイス ウェアラブルに 強い StrongⅢ Mashup Awards 5年連続 受賞 会社名 株式会社テクノモバイル 設 立 2008年 資本金 2,500万円 代 表 播田 誠 従業員数 100名(グループ合計) 本社所在地 〒 107-0062 東京都港区南青山7-1-5 コラム南青山 5F 開発室 〒771-0134 徳島県徳島市川内町平石住吉209-5 徳島健康科学総合センター 3F
  • 12. 12 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Bitcoinとは ・2009年から運用が始まった仮想通貨。単 位:BTC ・管理サーバーを持たず、ルールに基づいた P2Pネットワーク上に信用のもと構築・運用 ・手数料が安い ・信用はブロックチェーンの仕組み。 ・誰でも情報にアクセスして検証することが できる ・取引所で現金化も可能 ・実店舗でも利用可能。 http://jpbitcoin.com/shops ※ここがわかりやすい。 http://gigazine.net/news/20131007 -what-is-bitcoin/
  • 13. 13 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Ethereumとは ・ブロックチェーンを使った分散アプリケー ションプラットフォームです。 ・Bitcoinのように仮想通貨の送金のみならず、 仮想通貨を使ったアプリケーションの実行環 境を提供します。→Contract ・通貨単位:ether ・Bitcoinと同じように取引が可能です。 ・プライベートネットワークでも実行可能。 トランザクションDBのかわりに使うことがで きる。プライベート上のetherは取引不可能。 参考 https://www.gitbook.com/book/a-mitani/mastering-ethereum/details
  • 14. 14 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ブロックチェーンとは ・この解説が一番わかり易い。 http://www.slideshare.net/cookle/5-58379474 こまかいロジックはBitcoinのソースコードを 読むのが正解らしい。。。 ※ポイントは。。。。 チェーンの改ざんを抑止するためにハッシュ値の計算(マイニング) する難しさを定期的に調整しているが、調整が間に合わないような高速 演算できる環境を持ち込まれると長いチェーンを作成されてしまい、改 ざんできる余地がある。→完璧ではない。十分難しい状態のまま。
  • 15. 15 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ・この書籍がわかりやすい。おすすめ http://www.amazon.co.jp/gp/product/B00IZG MCFC/ref=oh_aui_d_detailpage_o00_?ie=UTF 8&psc=1
  • 17. 17 Windows Macの場合: 下記の手順でDocker環境を作成します。 1.Docker Toolboxのインストール https://www.docker.com/products/docker-toolbox からDockerToolboxをダウン ロードしてインストールしてください。デフォルトのままインストールを進めて OKです。 インストールされたDocker Quickstart Terminalを起動して下記のようなターミナ ルが表示されればインストールはOKです。exitで終了できます。 ※MacOS Sierraの場合はこれを参考 http://qiita.com/Ryosuke- Hujisawa/items/67f9dff2fadd729165dc 2.コンテナethertestを作成。exitで終了します。 docker run -it --name "ethertest" --entrypoint="/bin/sh" ethereum/client-go exit でぬけます COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6
  • 18. 18 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 テストネットに接続しましょう 自分だけのテスト用の環境テストネットに接続しましょう。参考 https://goo.gl/zcG2rZ 0.Docker環境の人は下記のコマンドでログインできます。 docker start ethertest docker attach ethertest 1.gethデータのフォルダーを「~/gethdata」のように作成しましょう。ここに ブロックチェーンやアカウント情報が保存されます。 mkdir ~/gethdata 3.下記のコマンドを実行するとコンソールで操作できるgethが起動します。こ れがノードです。exitと入力すると終了します。 geth --networkid "10" --datadir "~/gethdata" --dev --nodiscover console ※networkid : テストネットの番号です。適当でOK。 datadir : 上記で作成したフォルダーの場所です。 dev: 開発用の設定。gasは常に0.マイニングなどが早い。参考:https://goo.gl/OXFN6u 動作テストではolympic を使う。 console : コンソール付きで起動します。&をつければバックグラウンドで動作できます。 nodiscover:ほかのネットワークにつなげないようにする。 ※本番ネットはここを参考に接続できます。http://book.ethereum- jp.net/first_use/connect_to_livenet.html exitでconsoleを抜けます コマンド一覧:http://qiita.com/toshikase/items/fa7a826db483177d1e80
  • 19. 19 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contract作成の環境設定 1.コンパイラーsolcのインストールを確認しましょう。gethのコンソールを使いま す。参考:https://goo.gl/11HsGx eth.getCompilers() →[""] 空の時は未インストール 2.solcをインストール。★めちゃ時間がかかります。OSで実行します。exitで consoleを抜けます。 Macの場合 brew install cpp-ethereum brew linkapps cpp-ethereum solc -version →メッセージが表示されればOK. Docker環境(Windows)の場合 apk --update add git git clone https://github.com/ethereum/solidity.git cd solidity ./scripts/install_deps.sh mkdir build && cd build cmake .. make cp -p build/solc/solc /usr/bin solc –-version →メッセージが表示されればOK. コマンドがなくなってます WindowsとおなじくDockerがおすすめ
  • 20. 20 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contract作成のSolc設定 1.OSでsolcのインストールパスを確認します。 which solc でインストールパスをメモします。 -> /usr/bin/solc 2.gethのコンソールで上記のインストールパスを指定してsolcを設定します。 admin.setSolc("/usr/bin/solc") 3.eth.getCompilers() で["Solidity"]が表示されれば設定はOK コマンドがなくなってます
  • 21. 21 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 アカウントを作成しましょう 1.コンソールを使い下記のコマンドを入力して2名のアカウントを作成しま しょう。 personal.newAccount("hogehoge01") パスワードhogehoge01のアカウントのIDが表示されます。 → “0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268” AさんのID personal.newAccount("hogehoge02") パスワードhogehoge02のアカウントのIDが表示されます。 → “0x9620dd004b3715210b30690ec95589ec9830f3bc” BさんのID 2.作成した全アカウントを確認します。 eth.accounts →["0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268", "0x9620dd004b3715210b30690ec95589ec9830f3bc"]
  • 22. 22 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 マイニング(採掘)しましょう 1.採掘するアカウントを確認 eth.coinbase → "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268" このノードで採掘するアカウントIDが表示されます。デフォルトは最初に作成したA さんのID miner.setEtherbase(eth.accounts[1])のように別アカウントに変更も可能。 2.採掘を開始 miner.start() 3.報酬の確認。下記でAさんの報酬のetherを確認できます。単位をweiからetherに 変換しています。プライベートネットワークではトランザクションの要求がなくても 報酬が得られます。ライブネット(本番)ではこんなに簡単には採掘できません。 web3.fromWei(eth.getBalance(eth.coinbase),"ether")
  • 23. 23 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 4.採掘の停止。報酬が得られたら適当なタイミングで停止しましょう。最初は時間 がかかるので、しばらくはstopしないほうがよい。ログに「Generating DAG: 54%」 などと出ている時はDAGデータの作成中で、このあと採掘される。--dev以外のオプ ションではかなり時間がかかる。 miner.stop() eth.hashrate を実行して0以上の数値が表示されると採掘中です。 採掘していなくても0以上の数値になります。仕様が変わった?
  • 24. 24 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 送金しましょう 1.Aさん、Bさんの現在の報酬を確認しましょう。 web3.fromWei(eth.getBalance(eth.accounts[0]),"ether") →13.5 web3.fromWei(eth.getBalance(eth.accounts[1]),"ether") →0 2.AさんからBさんに5ether送金しましょう。データはJSONで表記します。実行時 にパスワードを入力します。この処理のトランザクションIDが表示されます。 personal.unlockAccount(eth.accounts[0],"hogehoge01",60000) <-送金者をunlock eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")}) →"0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09" 3.A,Bさんの報酬を確認しましょう。コマンドは1と同じです。→報酬が変わって いない?です。だれもマイニングしていないためです。
  • 25. 25 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 4.採掘を停止していたら、採掘を開始しましょう。 miner.start() 5.A,Bさんの報酬を確認しましょう。マイニングされたので送金完了しています。 web3.fromWei(eth.getBalance(eth.accounts[0]),"ether") →11.5(送金分と手数料分のマイナス、マイニング分のプラス) --devでgethを起動していると手数料gasは0 web3.fromWei(eth.getBalance(eth.accounts[1]),"ether") →5(Aさんからの送金分) 6.コマンドを操作したいので停止しましょう miner.stop()
  • 26. 26 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 送金トランザクションを確認しましょう 全体構造 parentHash hash nonce Transaction TransactionReceipt Block stateRoot parentHash hash nonce Transaction TransactionReceipt stateRoot parentHash hash nonce Transaction TransactionReceipt stateRoot 参考: WhitePaper: https://goo.gl/7R8TL5 YellowPage https://goo.gl/A6H4oL スニペット https://goo.gl/9Fw2qb https://goo.gl/9Scucd transactionsRoot transactionsRoottransactionsRoot
  • 27. 27 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 1.送金時のトランザクションIDからトランザクションの状態を確認しましょう。 eth.sendTransactionを実行したときの結果のアドレスがトランザクションIDです。 eth.getTransaction("0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524f a47b3b0fb09") → { blockHash: "0x1c5f0241b80ca16205b99b2833da4c7a323784fa218290785791430c12f191ea", blockNumber: 4, from: "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268", gas: 90000, gasPrice: 21142503856, hash: "0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09", input: "0x", nonce: 0, r: "0x21bcb629404fd66dce492928f022ccd60ce32612df3cee6110af79bd65eed5d4", s: "0x112f50f9a1c9ecf21010598f0b04a1c74d1e38f2675b7f029cdc1796a2138010", to: "0x9620dd004b3715210b30690ec95589ec9830f3bc", transactionIndex: 0, v: "0x1b", value: 5000000000000000000 }
  • 28. 28 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 2.主な項目です。 blockHash & blockNumber:このトランザクションを含んだブロックのヘッダ・ハッ シュとブロック高を示しています。まだこのトランザクションを含んだブロックが採 掘されていないときには、これらのフィールドは空の状態で表示されます。 hash:トランザクションID gas:トランザクションの処理時のgasの使用量の「最大値」を示しています。(実 際のトランザクション処理時のgasの使用量ではないので、注意してください。 gasPrice:トランザクションの処理時に採掘者に支払う1 gas 当たりの手数料 (wei)を示しています。 from & to & value:それぞれ、トランザクションにより送金する送金元、宛先、送金 額(wei)を示しています。
  • 29. 29 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 3.このトランザクションの詳細レシートを確認しましょう。hash値(トランザク ションID)でレシートが確認できます。マイニングされるまで作成されない。 eth.getTransactionReceipt("0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524 fa47b3b0fb09") → { blockHash: "0x1c5f0241b80ca16205b99b2833da4c7a323784fa218290785791430c12f191ea", blockNumber: 4, contractAddress: null, cumulativeGasUsed: 21000, from: "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268", gasUsed: 21000, logs: [], logsBloom: "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000", root: "0x39f372967a04790d5f9d03be5bf43e17d3e76ced6b13cf6fcb3c21a90b612624", to: "0x9620dd004b3715210b30690ec95589ec9830f3bc", transactionHash: "0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09", transactionIndex: 0 } contractAddress...contractのトランザクションの時にアドレスがセット gasUsed...使われたgas
  • 30. 30 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ※ コントラクトの場合 contractAddress がセットされるが 実行時にエラーがthrowされると下記のように実行コードが作成されないので下 記の結果のlength>3でエラーがないか確認する必要がある eth.getCode(’アドレス’) →"0x"
  • 31. 31 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 4.このトランザクションのブロックを見てみましょう. 参考:eth.blockNumberの結果 が最終ブロックです。 eth.getBlock(4) -> { difficulty: 131072, extraData: "0xd783010501846765746887676f312e372e33856c696e7578", gasLimit: 4712388, gasUsed: 21000, hash: "0x1c5f0241b80ca16205b99b2833da4c7a323784fa218290785791430c12f191ea", logsBloom: "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000", miner: "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268", mixHash: "0xd53177889fc004fe809409045c318bc7506d2a2fa610d32cdb2b1b1ce7730002", nonce: "0x76d2a8cd7fb50d0d", number: 4, parentHash: "0xe23f79fb6a7747ed3965c53e8ccf8a2b11dacee75aff81af30cd834afc2b4eb9", receiptsRoot: "0x189025d0b71a0d06f4e72c54e1d0c768375314b9422f0fa02b99c9bd58740638", sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", size: 649, stateRoot: "0x8cf12f49b25835524c65c9f37db282715f813c53ab9a7561d2d57a1ed6ea4f06", timestamp: 1479893472, totalDifficulty: 655360, transactions: ["0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09"], transactionsRoot: "0x075d3b93f7daa5d9c185d0bb4a6227f77e6937d8040c052d7fdee001263819e2", uncles: [] }
  • 32. 32 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 5.主な項目です。 difficulty...採掘の難しさです。 hash...このブロック番号のハッシュ値 miner...採掘したアカウント nonce...採掘されたときのnonce値。採掘では、このブロックのhash値になるようにnonce値を 計算します。 number ... このブロックの番号 parentHash...前のブロックのhash値.つまりブロック3のhash値になる。 timestamp...作成日時 transactions...このブロックに含まれるトランザクションの配列 stateRoot...ここにパトリシア木構造で残高などが保存されているみたい。 https://goo.gl/SQuYg2 receiptsRoot...レシートのパトリシア木構造? transactionsRoot...トランザクションのパトリシア木構造。このブロックのトランザクションの概 要が入っている。 全体構造はビットコインのこの解説がわかりやすい。 https://goo.gl/wpnEeS
  • 33. 33 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractとは Contract: オブジェクト指向言語での「クラス」に似たものです。Contractは、各自にクラス変 数に相当するような、内部状態を保持するストレージ部分と、メソッドに相当するよ うな、実行コードである「コントラクト・コード」を持っています。 取引情報の代わりにこのContractをブロックチェーン内に保持します。 Solidity: Solidityは Java Script に似た言語です。Contractを表現するために使われます。 文法解説: http://qiita.com/hshimo/items/0feca242ab97fa36fc33
  • 34. 34 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractの作成手順 1.Contractの作成 Solidity言語でコントラクト・コードをプログラミングします。solcを使って コードをコンパイルします。 2.Contractをブロックチェーンへ登録 コンパイル結果を用いて、Contract を生成するトランザクションをEthereum ネットワークに送信する。そのトランザクションを受信した採掘者は、トラン ザクションをブロックチェーンに登録する(=Contractをブロックチェーンに 登録する)。この時Contractのアドレスが発行される。 3.Contractへアクセス Contractを利用するユーザーは、Contract作成者からContractへのアクセス情報 の取得します。その情報をもとにContractへアクセスし、コントラクト・コー ドの実行等を行う。値が変更になるメソッドを実行する時は、ブロックチェー ンへの登録が必要になります。値を参照するだけでは登録の必要はありません。
  • 35. 35 1.Solidyで下記のプログラムを作成します。値のsetとgetを行います。 参考: https://goo.gl/4zG5cO COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractの作成 pragma solidity ^0.4.6; contract SingleNumRegister { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } }
  • 36. 36 1.Solcコマンドを使ってContractをコンパイルします。 echo "pragma solidity ^0.4.6; contract SingleNumRegister { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; }}" | solc --abi --bin →ソースをコンパイル (前記プログラムを改行なしで指定します) 下記のような結果が表示されます。 Binaryが実行コード、ABIがABI情報というContractのインターフェース情報で す。 この2つを使ってContractをブロックチェーンに登録します COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractのコンパイル Binary: 6060604052341561000f57600080fd5b60cb8061001d6000396000f30060606040526000357c010000000000000000000000 0000000000000000000000000000000000900463ffffffff16806360fe47b11460465780636d4ce63c14606657600080fd5b3415 605057600080fd5b60646004808035906020019091905050608c565b005b3415607057600080fd5b60766096565b60405180 82815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a72305820a929288f cb2c4830b5557eae8bc26023756ef2aae165b82f6b9a93a644f364090029 Contract JSON ABI [{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonp ayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable ":false,"stateMutability":"view","type":"function"}]
  • 37. 37 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractをブロックチェーンへ登録 1.gethを起動 geth --networkid "10" --datadir "~/gethdata" --dev --nodiscover console 2.ABI情報を変数に登録。 var contractAbiDefinition =[{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","ou tputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"c onstant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uin t256"}],"payable":false,"stateMutability":"view","type":"function"}] 3.コントラクトを作成。メモリー上のみ。 var sourceCompiledContract = eth.contract(contractAbiDefinition) 4.実行コードを変数に登録。 var sourceCompiledCode = "6060604052341561000f57600080fd5b60cb8061001d6000396000f300606060405 26000357c0100000000000000000000000000000000000000000000000000000000 900463ffffffff16806360fe47b11460465780636d4ce63c14606657600080fd5b3415 605057600080fd5b60646004808035906020019091905050608c565b005b3415607 057600080fd5b60766096565b6040518082815260200191505060405180910390f3 5b8060008190555050565b600080549050905600a165627a7a72305820a929288fc b2c4830b5557eae8bc26023756ef2aae165b82f6b9a93a644f364090029"
  • 38. 38 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractをブロックチェーンへ登録 5.登録者をunlock。Etherが0では登録できない。 personal.unlockAccount(eth.accounts[0],"hogehoge01",60000) 6.コントラクトを作成するトランザクションを投げる。コードは0xをつけないと エラー。 var contract = sourceCompiledContract.new({from:eth.accounts[0], data: "0x"+sourceCompiledCode , gas: 1000000}) → fullhash=0x240934ec11de43b074aaa607bbe498cf117ec17ede565f9ba11157e1cb2 0d9e4 FullhashがトランザクションID。Aさんのアカウントでブロックチェーンに登録。 Unlockが必要。 contractでマイニングの状態がわかる。 採掘していない時はminer.start()で採掘してください。 完了したらminer.stop()
  • 39. 39 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 7.contractの中身を確認しましょう。採掘されてブロックチェーンに登録され ると、 address:に値がセットされます。 transactionHashは前頁の登録時のトランザクションの値です。 addressが登録 されたコントラクトのアドレスです。 contract → { abi: [{ constant: false, inputs: [{...}], name: "set", outputs: [], payable: false, stateMutability: "nonpayable", type: "function" }, { constant: true, inputs: [], name: "get", outputs: [{...}], payable: false, stateMutability: "view", type: "function" }], address: "0x25bfc344ad63686c2eb8bc25335d908f7c3d46ad", transactionHash: "0x240934ec11de43b074aaa607bbe498cf117ec17ede565f9ba11157e1cb20d9e4", allEvents: function(), get: function(), set: function() }
  • 40. 40 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractにアクセスしましょう 1.Contractを使うためにはContractのaddressとABI情報(Contractの仕様書み たいなもの)が必要です。 addressは前頁のaddress値 ABI情報は変数contractAbiDefinitionの値を確認しましょう。 contractAbiDefinition → [{ constant: false, inputs: [{ name: "x", type: "uint256" }], name: "set", outputs: [], payable: false, type: "function" }, { constant: true, inputs: [], name: "get", outputs: [{ name: "retVal", type: "uint256" }], payable: false, type: "function" }]
  • 41. 41 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 2.下記のようにcontractにアクセスするための変数cntを作成しましょう。 address部分は自分のcontractの値で。 var cnt = eth.contract(contractAbiDefinition).at("0x25bfc344ad63686c2eb8bc25335d908f7 c3d46ad") 3.Aさんがcontractのset関数を実行するには下記のように実行します。6を セットしています。値が変化するのでブロックチェーンへの登録が必要です。 つまり採掘が必要です。 personal.unlockAccount(eth.accounts[0],"hogehoge01",60000) cnt.set.sendTransaction(6,{from:eth.accounts[0]}) →fullhash=0x0d892e531b767acd18b4dc551c0dc023d0e6f8feb5faf58bd5e7689 707cdd51b 4.採掘されると下記の実行で値6が表示されます。 miner.start() miner.stop()な ど実行 cnt.get() →6
  • 42. 42 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractの楽な作りかた Gethを使った方法では開発効率がよくありません。 下記の参考URLのようにブラウザを使ったIDEが用意されているのでこれを使い ましょう。 http://ethereum.github.io/browser-solidity/ 注意としてGethの起動オプションに下記を追加しましょう。 --rpc --rpccorsdomain="*" --unlock 0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268 (コントラクトを登録するアカウントのアドレスです。Gethの起動時にパスワー ドが聞かれます。)
  • 43. 43 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 サーバーサービスとして作成するには gethプロセスをRPCで起動し、下記のweb3.jsを使うとnode.jsでgethにアクセス することが可能です。 この環境でアプリを開発します。 参考書籍にサンプルプログラムがありますが、フロントのJSのみで作成されて います。Node.jsで作成したほうが安全です。 下記のようなオプションでgethを起動し、Node.jsと接続します。 --rpc --rpcapi "db,eth,net,web3,personal,admin,miner" --rpccorsdomain="*" -- rpcaddr "0.0.0.0" 参考: https://goo.gl/qxXYax Node.js Web3.js geth PHP RPC
  • 44. 44 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 プライベートネットワークの作り方 下記を参考にすれば複数ノードに分散されたプライベートネットワークを作成 することが出来ます。 参考:http://qiita.com/hshimo/items/8b69975d40466022f278
  • 45. 45 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ・このスライドにまとまってます https://goo.gl/VFepav Ethereumの情報の集め方
  • 46. 46 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ・http://amzn.to/2xMmJZ9 Ethereum開発の参考書籍
  • 47. 47 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ・http://amzn.to/2fAhDCv Bitcoinアルゴリズム・データ構造の参 考書籍
  • 48. 48 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ・ブロックチェーンを使ったシステム設計の 基礎 適用事例(経営者・営業担当の方に)

Hinweis der Redaktion

  1. 弊社がご提供しているソリューション内容です。 企画から運営・保守にいたるまでを一気通貫で、 軸となるコンシューマ向けの大規模Webシステムをはじめ、スマホアプリ、ゲーム開発などをご提供しております。 特に大きな実績として、大規模ECシステム、求人検索サイトの開発となっております。 他にも音楽DLサイトや、業務を効率する管理系のシステムの実績も多数あります。 (30秒)