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
200
Ethereumをさわって実感するブロックチェーンハンズオン
Gethの基本から学びます. geth 1.8.x対応
mogiken
July 14, 2018
Tweet
Share
More Decks by mogiken
See All by mogiken
自己紹介LT
mogiken
0
400
JavaScript初心者のためのNode.jsで学ぶドローン制御プログラミング
mogiken
0
290
チームスマコン・ブロックチェーン勉強会資料3回
mogiken
0
320
チームスマコン・ブロックチェーン勉強会資料2回
mogiken
0
230
チームスマコン・ブロックチェーン勉強会資料1回
mogiken
0
400
Ethereumをさわって実感するブロックチェーンハンズオン
mogiken
1
330
自己紹介
mogiken
0
210
Other Decks in Technology
See All in Technology
Grafana x PagerDuty Better Together
jacopen
1
260
Além do else! Categorizando Pokemóns com Pattern Matching no JavaScript
wmsbill
0
710
Babylon.js JAPAN活動紹介 (2024/4)
limes2018
1
120
LayerXにおけるLLMプロダクト開発の今までとこれから
layerx
PRO
4
700
TechFeed Experts Night#27 〜 フロントエンドフレームワーク最前線 (Svelte)
baseballyama
2
590
開発パフォーマンスを最大化するための開発体制
ham0215
7
1.1k
2024春 注目のWeb系 OSS & SaaS 3選
makies
0
180
BPStudyの200回を中心にIT業界を振り返る。そしてこれから
haru860
3
410
社内アプリで Cloudflare D1を プロダクト運用してみた体験談(Tokyo)
haochenx
0
120
今年のRubyKaigiはProfiler Year🤘
osyoyu
0
360
MLOpsの「壁」を乗り越える、LINEヤフーの Data Quality as Code
lycorptech_jp
PRO
8
620
AWS学習者向けにAzureの解説スライドを作成した話
handy
3
190
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
504
110k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
117
18k
GitHub's CSS Performance
jonrohan
1025
450k
Designing for humans not robots
tammielis
247
25k
Fantastic passwords and where to find them - at NoRuKo
philnash
39
2.5k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
StorybookのUI Testing Handbookを読んだ
zakiyama
13
4.6k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
104
6.6k
GraphQLとの向き合い方2022年版
quramy
33
12k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
51k
Building Adaptive Systems
keathley
32
1.9k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
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 ・ブロックチェーンを使ったシステム設計の 基礎 適用事例(経営者・営業担当の方に)