Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ethereumをさわって実感するブロックチェーンハンズオン
Search
mogiken
July 14, 2018
Technology
0
240
Ethereumをさわって実感するブロックチェーンハンズオン
Gethの基本から学びます. geth 1.8.x対応
mogiken
July 14, 2018
Tweet
Share
More Decks by mogiken
See All by mogiken
自己紹介LT
mogiken
0
520
JavaScript初心者のためのNode.jsで学ぶドローン制御プログラミング
mogiken
0
330
チームスマコン・ブロックチェーン勉強会資料3回
mogiken
0
410
チームスマコン・ブロックチェーン勉強会資料2回
mogiken
0
250
チームスマコン・ブロックチェーン勉強会資料1回
mogiken
0
420
Ethereumをさわって実感するブロックチェーンハンズオン
mogiken
1
360
自己紹介
mogiken
0
240
Other Decks in Technology
See All in Technology
単一Kubernetesクラスタで実現する AI/ML 向けクラウドサービス
pfn
PRO
1
340
IaC を使いたくないけどポリシー管理をどうにかしたい
kazzpapa3
1
110
組織の“見えない壁”を越えよ!エンタープライズシフトに必須な3つのPMの「在り方」変革 #pmconf2025
masakazu178
1
650
巨大モノリスのリプレイス──機能整理とハイブリッドアーキテクチャで挑んだ再構築戦略
zozotech
PRO
0
240
Bedrock のコスト監視設計
fohte
2
210
FFMとJVMの実装から学ぶJavaのインテグリティ
kazumura
0
160
PostgreSQL で列データ”ファイル”を利用する ~Arrow/Parquet を統合したデータベースの作成~
kaigai
0
150
[CV勉強会@関東 ICCV2025] WoTE: End-to-End Driving with Online Trajectory Evaluation via BEV World Model
shinkyoto
0
320
グローバルなコンパウンド戦略を支えるモジュラーモノリスとドメイン駆動設計
kawauso
3
6.7k
技術広報のOKRで生み出す 開発組織への価値 〜 カンファレンス協賛を通して育む学びの文化 〜 / Creating Value for Development Organisations Through Technical Communications OKRs — Nurturing a Culture of Learning Through Conference Sponsorship —
pauli
5
500
未回答質問の回答一覧 / 開発をリードする品質保証 QAエンジニアと開発者の未来を考える-Findy Online Conference -
findy_eventslides
0
370
LINEギフト・LINEコマース領域の開発
lycorptech_jp
PRO
0
350
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Scaling GitHub
holman
464
140k
Practical Orchestrator
shlominoach
190
11k
Code Review Best Practice
trishagee
72
19k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Building a Scalable Design System with Sketch
lauravandoore
463
33k
BBQ
matthewcrist
89
9.9k
4 Signs Your Business is Dying
shpigford
186
22k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Faster Mobile Websites
deanohume
310
31k
Transcript
Ethereumをさわって実感するブロックチェーンハンズオン
2 6 みなさんBitcoin知ってますか?
3 6 逮捕されたり。。。仮想だし。。。 なんか怖いですよね
4 6 マウントゴックスの件は、不正会計や かってに送金されただけで、Bitcoin のセキュリティーをがハックされたわ けではないのです。
5 6 上下しながら取引されています。
6 6 Bitcoinで使われているブロック チェーンは通貨だけではなく広くサー ビスとして使われつつあります。管理 サーバー無しで。。 Swarm クラウドファンディングのプラットフォーム Storjcoin X
分散型ストレージサービス Gems 分散型メッセンジャーアプリ LTBcoin 「Let's Talk Bitcoin」というビットコインのPodcastサービスの広告枠の利用等 に使用
7 6 まずはBitcoinを使ってみましたか? 今回は、Ethereumを使って実際にブ ロックチェーンの操作をしながら深く 内容を理解していきます。
8 「Gethのインストール」と「テストネットに接続しましょう」「Contract作成の環 境設定」ページを参考にGethとSolcのインストールをしておいてください。 SlideShareのスライドをDownloadしておくと、テキストのコピペが楽になり ます。 6 事前準備
9 6 この学びの対象者は? →Bitcoinなどに使われているブロック チェーンを操作しながら理解・体験したい 人。簡単なプログラムを理解できる人。 Linuxの基本コマンドが分かる人。 ブロックチェーンアプリを作りたい人。 WindowsのDocker環境で説明をします。
10 講師 Gashfara,Inc.代表 デジタルハリウッド大学院客員講師 茂木健一
[email protected]
[email protected]
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 6 Bitcoinとは ・2009年から運用が始まった仮想通貨。単 位:BTC ・管理サーバーを持たず、ルールに基づいた P2Pネットワーク上に信用のもと構築・運用 ・手数料が安い ・信用はブロックチェーンの仕組み。 ・誰でも情報にアクセスして検証することがで
きる ・取引所で現金化も可能 ・実店舗でも利用可能。 http://jpbitcoin.com/shops ※ここがわかりやすい。 http://gigazine.net/news/ 20131007-what-is-bitcoin/
12 6 Ethereumとは ・ブロックチェーンを使った分散アプリケー ションプラットフォームです。 ・Bitcoinのように仮想通貨の送金のみならず、 仮想通貨を使ったアプリケーションの実行環境 を提供します。→Contract ・通貨単位:ether ・Bitcoinと同じように取引が可能です。
・プライベートネットワークでも実行可能。ト ランザクションDBのかわりに使うことができ る。プライベート上のetherは取引不可能。 参考 https://www.gitbook.com/book/a-mitani/mastering-ethereum/details
13 6 ブロックチェーンとは ・この解説が一番わかり易い。 http://www.slideshare.net/cookle/ 5-58379474 こまかいロジックはBitcoinのソースコードを 読むのが正解らしい。。。 ※ポイントは。。。。 チェーンの改ざんを抑止するためにハッシュ値の計算(マイニング)
する難しさを定期的に調整しているが、調整が間に合わないような高速 演算できる環境を持ち込まれると長いチェーンを作成されてしまい、改 ざんできる余地がある。→完璧ではない。十分難しい状態のまま。
14 6 ・この書籍がわかりやすい。おすすめ https://amzn.to/2uweTiX
15 GethがEthereumのプロセスになります。これらが複数集まってブロック チェーンのP2Pネットワークを構成します。 6 Gethのインストール WindowsとおなじくDockerがおすすめ
16 Windows Macの場合: 下記の手順でDocker環境を作成します。 1.Docker Toolboxのインストール。Docker for mac,winでもOK。 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 でぬけます
17 6 テストネットに接続しましょう 自分だけのテスト用の環境テストネットに接続しましょう。参考 https://goo.gl/zcG2rZ 1.Docker環境の人は下記のコマンドでログインできます。 docker start ethertest
docker attach ethertest 2.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 console : コンソール付きで起動します。&をつければバックグラウンドで動作できます。 nodiscover:ほかのネットワークにつなげないようにする。 ※本番ネットはここを参考に接続できます。 http://book.ethereum-jp.net/first_use/connect_to_livenet.html exitでconsoleを抜けます 4.このコンソールを使ってさまざまな操作ができます。 コマンド一覧:http://qiita.com/toshikase/items/fa7a826db483177d1e80
18 6 Contract作成の環境設定 1.solc(コンパイラ)をインストール。★めちゃ時間がかかります。OSで実行します。 exitでconsoleを抜けます。 Docker環境(Windows,Mac)の場合 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 solc/solc /usr/bin solc --version →メッセージが表示されればOK. コマンドがなくなってます WindowsとおなじくDockerがおすすめ
19 6 アカウントを作成しましょう 1.コンソールを使い下記のコマンドを入力して2名のアカウントを作成しま しょう。gethのconsoleを起動しましょう。 personal.newAccount("hogehoge01") パスワードhogehoge01のアカウントのIDが表示されます。 → “0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268” AさんのID personal.newAccount("hogehoge02") パスワードhogehoge02のアカウントのIDが表示されます。
→ “0x9620dd004b3715210b30690ec95589ec9830f3bc” BさんのID 2.作成した全アカウントを確認します。初期アカウントが1つ作成済みです。 パスワードは”” eth.accounts →["0x52edac494f5ecc6399754df8a615353374bcdf44","0x955f 0634c54ecf1ea1bb219fbafbc11d7aedc268", "0x9620dd004b3715210b30690ec95589ec9830f3bc"]
20 採掘(マイニング)を確認しましょう 1.採掘するアカウントを確認 eth.coinbase → "0x52edac494f5ecc6399754df8a615353374bcdf44“ このノードで採掘するアカウントIDが表示されます。デフォルトは初期アカウント。 miner.setEtherbase(eth.accounts[1])のように別アカウントに変更も可能。 2.採掘(マイニング)は旧バージョンではminer.start(),stop()などが必要でした が、最新バージョンでは常にマイニング中になります。 3.報酬の確認。下記でcoinbaseの報酬のetherを確認できます。単位をweiから
etherに変換しています。プライベートネットワークではトランザクションの要求が なくても報酬が得られます。ライブネット(本番)ではこんなに簡単には採掘できま せん。初期アカウントは報酬が配布済みです。 web3.fromWei(eth.getBalance(eth.coinbase),"ether")
21 6 送金しましょう 1.coinbase、Aさんの現在の報酬を確認しましょう。 web3.fromWei(eth.getBalance(eth.accounts[0]),"ether") →16.5 web3.fromWei(eth.getBalance(eth.accounts[1]),"ether") →0 2.coinbaseからAさんに5ether送金しましょう。データはJSONで表記します。 実行時にパスワードを入力します。この処理のトランザクションIDが表示されます。
personal.unlockAccount(eth.accounts[0],"",60000) <-送金者をunlock eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")}) →"0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09"
22 6 3.Coinbase,Aさんの報酬を確認しましょう。マイニングされたので送金完了して います。 web3.fromWei(eth.getBalance(eth.accounts[0]),"ether") →11.5(送金分と手数料分のマイナス、マイニング分のプラス) --devでgethを起動していると手数料gasは0 web3.fromWei(eth.getBalance(eth.accounts[1]),"ether") →5(coinbaseからの送金分)
23 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 transactionsRoot transactionsRoot
24 6 1.送金時のトランザクションIDからトランザクションの状態を確認しましょう。 eth.sendTransactionを実行したときの結果のアドレスがトランザクションIDです。 eth.getTransaction("0x2f571ed1c11f721db7a5dca8d071352d338448b 0e9264a6fe524fa47b3b0fb09") → { 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 }
25 6 2.主な項目です。 blockHash & blockNumber:このトランザクションを含んだブロックのヘッダ・ ハッシュとブロック高を示しています。まだこのトランザクションを含んだブロック が採掘されていないときには、これらのフィールドは空の状態で表示されます。 hash:トランザクションID gas:トランザクションの処理時のgasの使用量の「最大値」を示しています。(実
際のトランザクション処理時のgasの使用量ではないので、注意してください。 gasPrice:トランザクションの処理時に採掘者に支払う1 gas 当たりの手数料 (wei)を示しています。 from & to & value:それぞれ、トランザクションにより送金する送金元、宛先、 送金額(wei)を示しています。
26 6 3.このトランザクションの詳細レシートを確認しましょう。hash値(トランザク ションID)でレシートが確認できます。マイニングされるまで作成されない。 eth.getTransactionReceipt("0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6f e524fa47b3b0fb09") → { blockHash: "0x1c5f0241b80ca16205b99b2833da4c7a323784fa218290785791430c12f191ea",
blockNumber: 4, contractAddress: null, cumulativeGasUsed: 21000, from: "0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268", gasUsed: 21000, logs: [], logsBloom: "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", root: "0x39f372967a04790d5f9d03be5bf43e17d3e76ced6b13cf6fcb3c21a90b612624", to: "0x9620dd004b3715210b30690ec95589ec9830f3bc", transactionHash: "0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3b0fb09", transactionIndex: 0 } contractAddress...contractのトランザクションの時にアドレスがセット gasUsed...使われたgas
27 6 ※ コントラクトの場合 contractAddress がセットされるが 実行時にエラーがthrowされると下記のように実行コードが作成されないので下 記の結果のlength>3でエラーがないか確認する必要がある eth.getCode("アドレス") →"0x“ さらに
1.6.x以降のgethではgenesis.json でhomesteadBlockの設定がないと常に0x0がかえる みたい。https://goo.gl/j45RYo
28 6 4.このトランザクションのブロックを見てみましょう. 参考:eth.blockNumberの結果 が最終ブロックです。 eth.getBlock(4) -> { difficulty: 131072,
extraData: "0xd783010501846765746887676f312e372e33856c696e7578", gasLimit: 4712388, gasUsed: 21000, hash: "0x1c5f0241b80ca16205b99b2833da4c7a323784fa218290785791430c12f191ea", logsBloom: "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 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: [] }
29 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 6
30 6 Contractとは Contract: オブジェクト指向言語での「クラス」に似たものです。Contractは、各自にクラス 変数に相当するような、内部状態を保持するストレージ部分と、メソッドに相当する ような、実行コードである「コントラクト・コード」を持っています。 取引情報の代わりにこのContractをブロックチェーン内に保持します。 Solidity: Solidityは
Java Script に似た言語です。Contractを表現するために使われます。 文法解説: http://qiita.com/hshimo/items/0feca242ab97fa36fc33
31 6 Contractの作成手順 1.Contractの作成 Solidity言語でコントラクト・コードをプログラミングします。solcを使って コードをコンパイルします。 2.Contractをブロックチェーンへ登録 コンパイル結果を用いて、Contract を生成するトランザクションを Ethereumネットワークに送信する。そのトランザクションを受信した採掘者
は、トランザクションをブロックチェーンに登録する(=Contractをブロッ クチェーンに登録する)。この時Contractのアドレスが発行される。 3.Contractへアクセス Contractを利用するユーザーは、Contract作成者からContractへのアクセ ス情報の取得します。その情報をもとにContractへアクセスし、コントラク ト・コードの実行等を行う。値が変更になるメソッドを実行する時は、ブロッ クチェーンへの登録が必要になります。値を参照するだけでは登録の必要はあ りません。
32 1.Solidyで下記のプログラムを作成します。値のsetとgetを行います。 参考: https://book.ethereum-jp.net/first_use/contract.html 6 Contractの作成 pragma solidity ^0.4.6;
contract SingleNumRegister { uint storedData; function set(uint x) { storedData = x; } function get() view returns (uint retVal) { return storedData; } }
33 1.Solcコマンドを使ってContractをコンパイルします。 echo "pragma solidity ^0.4.6; contract SingleNumRegister { uint
storedData; function set(uint x) { storedData = x; } function get() view returns (uint retVal) { return storedData; }}" | solc - --abi --bin →ソースをコンパイル (前記プログラムを改行なしで指定します) 下記のような結果が表示されます。 Binaryが実行コード、ABIがABI情報というContractのインターフェース情報 です。 この2つを使ってContractをブロックチェーンに登録します 6 Contractのコンパイル Binary: 608060405234801561001057600080fd5b5060ec8061001f6000396000f3006080604052600436106049576000357c0100000 000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c14608 5575b600080fd5b348015605957600080fd5b50608360048036036020811015606e57600080fd5b8101908080359060200190 92919050505060ad565b005b348015609057600080fd5b50609760b7565b6040518082815260200191505060405180910390 f35b8060008190555050565b600080549050905600a165627a7a72305820eabfb8cc9a0c39d32f29a2fad207aa7f1538a27db22 39235b3f267c63b67c9db0029 Contract JSON ABI [{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs": [],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs": [{"name":"retVal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
34 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","outputs": [],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs": [],"name":"get","outputs": [{"name":"retVal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"} ] 3.コントラクトを作成。メモリー上のみ。 var sourceCompiledContract = eth.contract(contractAbiDefinition) 4.実行コードを変数に登録。 var sourceCompiledCode = "608060405234801561001057600080fd5b5060ec8061001f6000396000f3006080604 052600436106049576000357c0100000000000000000000000000000000000000000 000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146085575 b600080fd5b348015605957600080fd5b50608360048036036020811015606e5760008 0fd5b810190808035906020019092919050505060ad565b005b348015609057600080 fd5b50609760b7565b6040518082815260200191505060405180910390f35b8060008 190555050565b600080549050905600a165627a7a72305820eabfb8cc9a0c39d32f29a 2fad207aa7f1538a27db2239235b3f267c63b67c9db0029"
35 6 Contractをブロックチェーンへ登録 5.登録者をunlock。Etherが0では登録できない。 personal.unlockAccount(eth.accounts[0],"",60000) 6.コントラクトを作成するトランザクションを投げる。コードは0xをつけない とエラー。 var contract =
sourceCompiledContract.new({from:eth.accounts[0], data: "0x"+sourceCompiledCode , gas: 1000000}) → fullhash=0x240934ec11de43b074aaa607bbe498cf117ec17ede56 5f9ba11157e1cb20d9e4 FullhashがトランザクションID。coinbaseのアカウントでブロックチェーンに登 録。Unlockが必要。 contractでマイニングの状態がわかる。
36 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() }
37 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" }]
38 2.下記のようにcontractにアクセスするための変数cntを作成しましょう。 address部分は自分のcontractの値で。 var cnt = eth.contract(contractAbiDefinition).at("0x25bfc344ad63686c2eb 8bc25335d908f7c3d46ad") 3.coinbaseがcontractのset関数を実行するには下記のように実行します。 6をセットしています。値が変化するのでブロックチェーンへの登録が必要で
す。つまり採掘が必要です。 personal.unlockAccount(eth.accounts[0],"",60000) cnt.set.sendTransaction(6,{from:eth.accounts[0]}) →fullhash=0x0d892e531b767acd18b4dc551c0dc023d0e6f8feb 5faf58bd5e7689707cdd51b 4.採掘されると下記の実行で値6が表示されます cnt.get() →6
39 6 Contractの楽な作りかた Gethを使った方法では開発効率がよくありません。 下記の参考URLのようにブラウザを使ったIDE(remix)が用意されているので これを使いましょう。 http://ethereum.github.io/browser-solidity/ remix DockerのgethにDeployするときの注意としてGethの起動オプションに下記 を追加しましょう。
--rpc --rpccorsdomain="*”
40 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 ※PHPを使ったサンプルはQiitaに投稿しています。https://goo.gl/nZzHpY
41 6 プライベートネットワークの作り方 下記を参考にすれば複数ノードに分散されたプライベートネットワークを作成 することが出来ます。 参考:http://qiita.com/hshimo/items/8b69975d40466022f278
42 6 ・勉強会しました https://goo.gl/MUsRy2 https://goo.gl/CieZXd https://goo.gl/qKpnYy Solidityコード
43 6 ・ここの解説が分かりやすいです https://goo.gl/CFGGka ICOトークンのSolidityコード
44 6 ・このスライドにまとまってます https://goo.gl/VFepav ・Ethereumの動きの詳細 http://coffeetimes.hatenadiary.jp/ entry/2017/11/07/082426 Ethereumの情報の集め方
45 6 ・https://cryptozombies.io/jp/ 初心者は全員こちらから
46 6 ・http://amzn.to/2xMmJZ9 Ethereum開発の参考書籍
47 6 ・http://amzn.to/2fAhDCv Bitcoinアルゴリズム・データ構造の参 考書籍
48 6 ・ブロックチェーンを使ったシステム設計の 基礎 適用事例(経営者・営業担当の方に)