–目的–
Gethを使って、コントラクトのコードを実行しトランザクションを発行。
コードは「ある文字列をブロックチェーンに記録し、読み出す」もの。
マイニングによってブロックに記録されることを確認。
ブロックチェーンに記録されたコードは任意に実行できることを確認。
前回と同様testnetでやってみます。
コントラクトを記述できる言語はいくつかありますが、今回はSolidityを使います。
●Solidity のコンパイラである solc をインストール
$ sudo apt-get install solc
●Solidity コードの記述
$cd ~/my_eth
【HelloWorld.sol】ファイルを作成
注:
外部ファイル読込になっています。
現バージョンのGethでは内部でSolidityによるコンパイルはできないもよう。
Browser- Solidity(Remix)を使ったコンパイルー>デプロイは次回です。
$ gedit HelloWorld.sol
solidityの現バージョンは0.4.20ですが指定バージョンはこれ以下にする必要があるそうなので0.4.13です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
pragma solidity ^0.4.13; contract HelloWorld { string message; function setMessage(string _message) { message = _message; } function sayHello() returns (string) { return message; } } |
●Solidity コードのコンパイル
1 |
$ solc --bin --abi HelloWorld.sol |
Binary が EVM のバイトコード
Contract JSON ABI (Application Binary Interface) は、コントラクトのインタフェース情報
●上記の値をコピーしてエディターで以下のようなコマンドを作っておく
(Binaryは先頭に0xを付加)
bin =”0x606060405234156………a58823630029″
abi = [{“constant”:false……..,”type”:”function”}]
Geth起動
前回の環境だと……
1 |
$ geth --testnet --datadir "/home/<ユーザー名>/my_eth" --networkid 205 console |
●上記のコマンドをコピペして実行
●ABI インタフェースから HelloWorld のコントラクトオブジェクトを作成
> contract = eth.contract(abi)
●コントラクトをチェーン上に登録するトランザクションを送信
必要ならアンロック実行
> personal.unlockAccount(eth.accounts[0])
コンソール上に HelloWorld オブジェクトを作成。
他のアタッチしたコンソールからは実行できません。
作成したコンソールでのみ実行できます。
>HelloWorld = contract.new({ from: eth.accounts[0], data: bin, gas: 1000000 })
●マイニングしてブロックチェーンにコントラクトを記録させる
> eth.blockNumber
> miner.start()
> HelloWorld
HelloWorld オブジェクトの address 部分にアドレスが入っていれば、
このスマートコントラクトはブロックチェーン上に正しく書き込まれているようです。
●スマートコントラクトの呼び出し
コンソール上の HelloWorld オブジェクトを使って、コントラクトのメソッドを呼び出してみる
sayHelloファンクションメソッド
まだ message の値はセットされていないので空白文字が返ります
>HelloWorld.sayHello.call()
“MyHelloWorld!” という文字列を message に代入するために、以下の sendTransaction を実行
必要ならアンロックを実行しておく
> personal.unlockAccount(eth.accounts[0])
> HelloWorld.setMessage.sendTransaction(“MyHelloWorld!”, { from: eth.accounts[0] })
トランザクションIDが表示されます。
例
“0x39bba106455d6cf42b833513fea1f40f55dd7d85fa1ec5aeaf2e89f4a268a385”
マイニングしていればすぐにブロックチェーンに反映されます。
まだならマイニング実行
> miner.start()
再度 HelloWorld.sayHello.call() を実行
>HelloWorld.sayHello.call()
solidityで実装された関数が実行されています。
eth.getTransaction(“トランザクションID”)でトランザクションを確認してみてください。
送金と違って、from・to・valueには何も入っていませんが、inputsには何やらデータが格納されているはずです。
Leave a Reply