Ethereumのスマートコントラクトとやらをかじってみる


–目的–

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です。

●Solidity コードのコンパイル

 

Binary が EVM のバイトコード
Contract JSON ABI (Application Binary Interface) は、コントラクトのインタフェース情報

●上記の値をコピーしてエディターで以下のようなコマンドを作っておく
(Binaryは先頭に0xを付加)

bin =”0x606060405234156………a58823630029″

abi = [{“constant”:false……..,”type”:”function”}]

Geth起動

前回の環境だと……

●上記のコマンドをコピペして実行

 

●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には何やらデータが格納されているはずです。

 


 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*