ぷろぐら×でざいん

スマートコントラクトをプライベートネットワークで動かす

スマートコントラクトをプライベートネットワークで動かす

スマートコントラクトをプライベートネットワークで動かす

前述

Ethereumのスマートコントラクトを勉強しており、下記のサイトが非常に良かったので、このサイトを元にハンズオンでプライベートネットワーク上にスマートコントラクトを作成してみようと思いました。ここでは特段スマートコントラクト(Smart Contract)が何かの説明は致しません。
Beginner’s guide to blockchain/Ethereum (1) — Build a smart contract on a private network


構築していく

1. ソースコードダウンロード

Download Source code (tar.gz)
上記でダウンロードしたソースコードはローカスのデスクトップにある workspaceというフォルダーに解凍した状態で格納した前提で話を進めます。

cd Desktop/workspace

make geth

build/env.sh go run build/ci.go install ./cmd/geth
/usr/local/Cellar/go/1.9.2/libexec/bin/go install -v ./cmd/geth

....中略....

Done building.
Run "build/bin/geth" to launch geth.
2. PATHを通す

現在のディレクトリーが分からなければ、 pwd で確認しましょうー

echo "alias geth159='Users/shotanuki/Desktop/workspace/go-ethereum-1.5.9/build/bin/geth'" >> ~/.bashrc

source ~/.bashrc

echo "source ~/.bashrc" >> ~/.profile
3. Solidity compilerをインストールする
brew install solidity
4. プライベートネットワーク起動

まず新しいフォルダーを作成します。

mkdir privatenet

gethを使って、起動します

geth159 --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --dev --datadir privatenet

I1107 15:44:33.019797 cmd/utils/flags.go:613] WARNING: No etherbase set and no accounts found as default

....中略....

I1107 15:44:35.194992 node/node.go:411] HTTP endpoint opened: http://127.0.0.1:8545

ここまでできたら先程作成した privatenetのフォルダーを開いてみて下さい。gethkeystoreという二つのフォルダーが作成されているはずです。下記のような感じです。

├── go-ethereum-1.5.9
└── privatenet
    ├── geth
    │   ├── chaindata
    │   └── nodes
    └── keystore
5. “geth attach”を使って、”geth console”を起動する

起動したプライベートネットはそのまま起動しておき、別のターミナルを立ち上げて下さい。そして下記のコマンドを実行して下さい。

geth159 attach ipc:///Users/shotanuki/Desktop/workspace/privatenet/geth.ipc 

上記を起動すると下記のような結果になるはずです。ここでAPIコマンド叩くことができます。

geth159 attach ipc:///Users/shotanuki/Desktop/workspace/privatenet/geth.ipc 

Welcome to the Geth JavaScript console!

instance: Geth/v1.5.9-stable/darwin/go1.9.2
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0

> 

6. API コマンドを叩く

API一覧はここにあります。
https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console#personallistaccounts

アカウントの有無を確かめる

> personal.listAccounts
null

立ち上げたばかりだとアカウントはないですね。

アカウントを作成する。

> personal.newAccount('shotanuki_pass') # 適当なパスワード入れましょう
'0x59..............................'

ウォレットアドレスが表示されましたね。

作成されてますね。やったー。

> personal.listAccounts
['0x59..............................']
7. Ethereum js api を使っていきましょう

詳細は下記をご参照頂ければ幸いです。
https://ethereumbuilders.gitbooks.io/guide/content/en/ethereum_javascript_api.html

> web3.eth.coinbase # コインのRewardを受け取るアドレスが表示されます。
'0x59..............................'
8. スマートコントラクトを書く

引数に100を加算する単純なロジックになっています。

> source = 'contract sample { function addNumber(uint money) returns(uint res){ return money + 100;}}'
9. Solidity compilerがインストールされているか確認する

下記のような結果でなければ、インストールして下さい。

> web3.eth.getCompilers()
['Solidity']
10. コードをコンパイルする
> code = web3.eth.compile.solidity(source)  # コンパイル
{
  <stdin>:sample: {
    code: '0x60606040523415600e57600080fd5b609a8061001c6000396000f300606060405260043610603e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663fce6802381146043575b600080fd5b3415604d57600080fd5b60566004356068565b60405190815260200160405180910390f35b606401905600a165627a7a72305820130d515ed716620f42169a84f2fabd1a9dbfa9a8a683ee2d19f6024b1516770a0029',
    info: {
      abiDefinition: [{...}],
      compilerOptions: '--combined-json bin,abi,userdoc,devdoc --add-std --optimize',
      compilerVersion: '0.4.18',
      developerDoc: {
        methods: {}
      },
      language: 'Solidity',
      languageVersion: '0.4.18',
      source: 'contract sample { function addNumber(uint money) returns(uint res){ return money + 100;}}',
      userDoc: {
        methods: {}
      }
    }
  }
}
11. ABIを元にコントラクト Objectを作成する

詳しいコントラクトの作成方法は正式ドキュメントを参照して下さい。
https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcontract

ShotanukiContract = web3.eth.contract(code["<stdin>:sample"].info.abiDefinition)
12. デフォルトのcoinbaseアカウントにEtherがあるか確認する

Etherが0の場合はMiningして、Etherを手に入れましょう。すぐに貯まるので、タイミングを見てMiningを止めましょう。

> defaultAccount = web3.eth.coinbase
'ウォレットアドレス'
> web3.eth.getBalance(defaultAccount)
0
> miner.start()
true
> miner.stop()
true
> web3.eth.getBalance(defaultAccount)
236093750000000000000
13. トランザクションを送信できるようにアカウントをアンロックしましょう

trueと表示されれば、アンロックは成功です。失敗すると ”Error: could not decrypt key with given passphrase”と表示されます。

> personal.unlockAccount(defaultAccount, 'shotanuki_pass') 
true
14. コンパイルしたコードでコントラクトをイニシャライズしましょう
> bytecode = code[&quot;&lt;stdin&gt;:sample&quot;].code
'コード中身が表示されます。'

必要なガスを調べましょう

> web3.eth.estimateGas({data: bytecode})
31021
15. コントラクトをデプロイし、分かりやすいように callback functionをsetしましょう。

アカウントがアンロックしていることと、Gasを上記で表示された数字以上に設定することを忘れず。

> contractInstance = ShotanukiContract.new({data: bytecode gas: 1000000, from: defaultAccount}, function(e, contract){if(!e){if(!contract.address){console.log(&quot;Contract transaction send: Transaction Hash: &quot;+contract.transactionHash+&quot; waiting to be mined...&quot;);}else{console.log(&quot;Contract mined! Address: &quot;+contract.address);console.log(contract);}}else{console.log(e)}})

Contract transaction send: Transaction Hash: 'ハッシュ' waiting to be mined...

上記のように Transaction Hashがマインされるのを待ちましょうと表示されるのでマイニングを開始しましょう。

16. マイニングを開始し、コントラクトをマインしましょう
> miner.start()
true
> Contract mined! Address: 0x..................
[object Object]
# Ctrl + C で動作を止めます。
> miner.stop()
true
17. コントラクト作成が成功したかを確認します
> eth.getCode(contractInstance.address) 
'bytecodeと同じものが表示されます'
18. コントラクトの機能を呼び出す
> contractInstance.addNumber.call(100)
200

あとがき

かなり初心者向けのチュートリアルがあって助かりました。まだまだ分からないことだらけですが、少しずつ理解できるようになりたいと思います。
本当に下記のサイトは丁寧に書かれており、殆ど問題なく進めることができました。
ただ、何かしらのエラーがあったら、とりあえず、 brew install go Golangをインストールすると解決すると思います。

参照

Beginner’s guide to blockchain/Ethereum (1) — Build a smart contract on a private network

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です