Ethereumをさわって実感するブロックチェーンハンズオン(新版はここ https://www.slideshare.net/mogiken1/ethereum-81133776)
- 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をさわって実感するブロックチェーンハンズオン
- 6. 6
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Bitcoinで使われているブロックチェー
ンは通貨だけではなく広くサービスと
して使われつつあります。管理サー
バー無しで。。
Swarm
クラウドファンディングのプラットフォーム
Storjcoin X
分散型ストレージサービス
Gems
分散型メッセンジャーアプリ
LTBcoin
「Let's Talk Bitcoin」というビットコインのPodcastサービスの広告枠の利用等
に使用
- 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の極意[共著](秀和
システム)
- 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
- 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
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: []
}
- 31. 31
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
- 32. 32
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractとは
Contract:
オブジェクト指向言語での「クラス」に似たものです。Contractは、各自にクラス変
数に相当するような、内部状態を保持するストレージ部分と、メソッドに相当するよ
うな、実行コードである「コントラクト・コード」を持っています。
取引情報の代わりにこのContractをブロックチェーン内に保持します。
Solidity:
Solidityは Java Script に似た言語です。Contractを表現するために使われます。
文法解説:
http://qiita.com/hshimo/items/0feca242ab97fa36fc33
- 33. 33
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.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"}]
- 36. 36
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"
- 37. 37
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()
- 38. 38
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()
}
- 39. 39
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"
}]
- 40. 40
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
- 41. 41
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
Contractの楽な作りかた
Gethを使った方法では開発効率がよくありません。
下記の参考URLのようにブラウザを使ったIDEが用意されているのでこれを使い
ましょう。 http://ethereum.github.io/browser-solidity/
注意としてGethの起動オプションに下記を追加しましょう。
--rpc --rpccorsdomain="*" --unlock
0x955f0634c54ecf1ea1bb219fbafbc11d7aedc268
(コントラクトを登録するアカウントのアドレスです。Gethの起動時にパスワー
ドが聞かれます。)
- 42. 42
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
- 43. 43
COPYRIGHT(C) TECHNOMOBILE ALL RIGHTS RESERVED.
6
プライベートネットワークの作り方
下記を参考にすれば複数ノードに分散されたプライベートネットワークを作成
することが出来ます。
参考:http://qiita.com/hshimo/items/8b69975d40466022f278
Hinweis der Redaktion
- 弊社がご提供しているソリューション内容です。
企画から運営・保守にいたるまでを一気通貫で、
軸となるコンシューマ向けの大規模Webシステムをはじめ、スマホアプリ、ゲーム開発などをご提供しております。
特に大きな実績として、大規模ECシステム、求人検索サイトの開発となっております。
他にも音楽DLサイトや、業務を効率する管理系のシステムの実績も多数あります。
(30秒)