Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

mogiken
November 05, 2017

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

Ethereumでスマートコントラクトを理解するためのハンズオンです。

mogiken

November 05, 2017
Tweet

More Decks by mogiken

Other Decks in Technology

Transcript

  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. 6 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Bitcoinで使われているブロックチェーン は通貨だけではなく広くサービスとして使 われつつあります。管理サーバー無し

    で。。 Swarm クラウドファンディングのプラットフォーム Storjcoin X 分散型ストレージサービス Gems 分散型メッセンジャーアプリ LTBcoin 「Let's Talk Bitcoin」というビットコインのPodcastサービスの広告枠の利用等 に使用
  3. 9 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 この学びの対象者は? →Bitcoinなどに使われているブロックチェーン を操作しながら理解・体験したい人。簡単なプ

    ログラムを理解できる人。Linuxの基本コマンド が分かる人。 ブロックチェーンアプリを作りたい人。 WindowsのDocker環境で説明をします。 教えないことは? →ブロックチェーンの専門家ではないので。。。
  4. 10 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 講師 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の極意[共著](秀和システム)
  5. 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
  6. 12 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Bitcoinとは ・2009年から運用が始まった仮想通貨。単位:BTC ・管理サーバーを持たず、ルールに基づいたP2P

    ネットワーク上に信用のもと構築・運用 ・手数料が安い ・信用はブロックチェーンの仕組み。 ・誰でも情報にアクセスして検証することができる ・取引所で現金化も可能 ・実店舗でも利用可能。 http://jpbitcoin.com/shops ※ここがわかりやすい。 http://gigazine.net/news/20131007 -what-is-bitcoin/
  7. 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
  8. 14 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ブロックチェーンとは ・この解説が一番わかり易い。 http://www.slideshare.net/cookle/5-58379474

    こまかいロジックはBitcoinのソースコードを読むの が正解らしい。。。 ※ポイントは。。。。 チェーンの改ざんを抑止するためにハッシュ値の計算(マイニング) する難しさを定期的に調整しているが、調整が間に合わないような高速 演算できる環境を持ち込まれると長いチェーンを作成されてしまい、改 ざんできる余地がある。→完璧ではない。十分難しい状態のまま。
  9. 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
  10. 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を抜けます 4.このコンソールを使ってさまざまな操作ができます。 コマンド一覧:http://qiita.com/toshikase/items/fa7a826db483177d1e80
  11. 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がおすすめ
  12. 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 コマンドがなくなってます
  13. 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"]
  14. 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")
  15. 23 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 4.採掘の停止。報酬が得られたら適当なタイミングで停止しましょう。最初は時間がかかる ので、しばらくはstopしないほうがよい。ログに「Generating DAG:

    54%」などと出ている時は DAGデータの作成中で、このあと採掘される。--dev以外のオプションではかなり時間がか かる。 miner.stop() eth.hashrate を実行して0以上の数値が表示されると採掘中です。 採掘していなくても0以上の数値になります。仕様が変わった?
  16. 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と同じです。→報酬が変わっていない?で す。だれもマイニングしていないためです。
  17. 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()
  18. 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 transactionsRoot transactionsRoot
  19. 27 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 1.送金時のトランザクションIDからトランザクションの状態を確認しましょう。 eth.sendTransactionを実行したときの結果のアドレスがトランザクションIDです。 eth.getTransaction("0x2f571ed1c11f721db7a5dca8d071352d338448b0e9264a6fe524fa47b3

    b0fb09") → { 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 }
  20. 28 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 2.主な項目です。 blockHash &

    blockNumber:このトランザクションを含んだブロックのヘッダ・ハッシュとブロッ ク高を示しています。まだこのトランザクションを含んだブロックが採掘されていないときには、 これらのフィールドは空の状態で表示されます。 hash:トランザクションID gas:トランザクションの処理時のgasの使用量の「最大値」を示しています。(実際のトランザ クション処理時のgasの使用量ではないので、注意してください。 gasPrice:トランザクションの処理時に採掘者に支払う1 gas 当たりの手数料(wei)を示して います。 from & to & value:それぞれ、トランザクションにより送金する送金元、宛先、送金額(wei)を 示しています。
  21. 29 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 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
  22. 30 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 ※ コントラクトの場合 contractAddress

    がセットされるが 実行時にエラーがthrowされると下記のように実行コードが作成されないので下 記の結果のlength>3でエラーがないか確認する必要がある eth.getCode(’アドレス’) →"0x“ さらに 1.6.x以降のgethではgenesis.json でhomesteadBlockの設定がないと常に0x0がかえる みたい。https://goo.gl/j45RYo
  23. 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: "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: [] }
  24. 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
  25. 33 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractとは Contract: オブジェクト指向言語での「クラス」に似たものです。Contractは、各自にクラス変数に相当

    するような、内部状態を保持するストレージ部分と、メソッドに相当するような、実行コードで ある「コントラクト・コード」を持っています。 取引情報の代わりにこのContractをブロックチェーン内に保持します。 Solidity: Solidityは Java Script に似た言語です。Contractを表現するために使われます。 文法解説: http://qiita.com/hshimo/items/0feca242ab97fa36fc33
  26. 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へアクセスし、コントラクト・コードの実行等を行う。 値が変更になるメソッドを実行する時は、ブロックチェーンへの登録が必要になります。 値を参照するだけでは登録の必要はありません。
  27. 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; } }
  28. 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"}]
  29. 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","outputs":[], "payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inpu ts":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"sta teMutability":"view","type":"function"}] 3.コントラクトを作成。メモリー上のみ。 var sourceCompiledContract = eth.contract(contractAbiDefinition) 4.実行コードを変数に登録。 var sourceCompiledCode = "6060604052341561000f57600080fd5b60cb8061001d6000396000f300606060405260003 57c0100000000000000000000000000000000000000000000000000000000900463ffffffff1 6806360fe47b11460465780636d4ce63c14606657600080fd5b3415605057600080fd5b606 46004808035906020019091905050608c565b005b3415607057600080fd5b60766096565b6 040518082815260200191505060405180910390f35b8060008190555050565b60008054905 0905600a165627a7a72305820a929288fcb2c4830b5557eae8bc26023756ef2aae165b82f6b 9a93a644f364090029"
  30. 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=0x240934ec11de43b074aaa607bbe498cf117ec17ede565f9ba11157e1cb20d9e4 FullhashがトランザクションID。Aさんのアカウントでブロックチェーンに登録。Unlockが必要。 contractでマイニングの状態がわかる。 採掘していない時はminer.start()で採掘してください。 完了したらminer.stop()
  31. 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() }
  32. 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" }]
  33. 41 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 2.下記のようにcontractにアクセスするための変数cntを作成しましょう。address部分 は自分のcontractの値で。 var

    cnt = eth.contract(contractAbiDefinition).at("0x25bfc344ad63686c2eb8bc25335d908f7c3d4 6ad") 3.Aさんがcontractのset関数を実行するには下記のように実行します。6をセットして います。値が変化するのでブロックチェーンへの登録が必要です。つまり採掘が必要 です。 personal.unlockAccount(eth.accounts[0],"hogehoge01",60000) cnt.set.sendTransaction(6,{from:eth.accounts[0]}) →fullhash=0x0d892e531b767acd18b4dc551c0dc023d0e6f8feb5faf58bd5e7689707cdd5 1b 4.採掘されると下記の実行で値6が表示されます。 miner.start() miner.stop()など実 行 cnt.get() →6
  34. 42 COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED. 6 Contractの楽な作りかた Gethを使った方法では開発効率がよくありません。 下記の参考URLのようにブラウザを使ったIDEが用意されているのでこれを使いましょ

    う。 http://ethereum.github.io/browser-solidity/ 注意としてGethの起動オプションに下記を追加しましょう。 --rpc --rpccorsdomain="*" --unlock 0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268 (コントラクトを登録するアカウントのアドレスです。Gethの起動時にパスワードが聞か れます。)
  35. 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 ※PHPを使ったサンプルはQiitaに投稿しています。https://goo.gl/nZzHpY