月別アーカイブ: 2016年5月

EthereumのContractと通信する(2) ABI Definition

前回、Contractのデプロイまで行きました。今回は、実際にContractに実装したコードを実行させてみます。

デプロイのときと同じように、eth_sendTransactionメソッドでトランザクションを実行します。パラメータのfromとtoはもちろん、トランザクションの送信元のアカウントと受信先であるContractのアドレスです。

公式にも書いてありますけど、dataパラメータは少し面倒なものです。このパラメータは、呼び出すメソッドとパラメータを定義するバイトコードを持ちます。ここに、今回調べるといったABIというのが関わっているらしいです。ちょっとドキュメントを参照してみます。

Ethereum Contract ABI

冒頭の”Basic design”によると、Contractの外部とのインターフェース定義はコンパイル時に決まってしまい、静的であると。Introspectionメカニズムは存在しませんとも書いてある。Introspectionとは何ぞや?調べると、内省とか内観と出てきますね。東洋かぶれのあちらの人が作った単語か?と思ってしまいますが。

つまりは、Contractの内部仕様を外から調べるすべは用意されていないということのようです。仕様を知っているアカウントしか、Contractを実行できないということです。ABIとは、Application Binary Interfaceのことで、Contractを使用する側は、呼び出し時にこの定義をバイトコードとして渡してやる必要があるということのようですね。コンパイル時に返ってきたのは、ABIの文字列表現のようです。

ABIは、以下二つをエンコードした値を含みます。

  1. 呼び出そうとするメソッドの名前と、引数の型
  2. メソッドに渡す実引数

1.については、Keccak hash(SHA-3)をかけた結果の最初の4バイトをエンコード結果とします。gethをインストールしてあるなら、この値は次のように得ることができます。

2.については、Argument encodingに各データ型のエンコード方法が書いてあります。たくさんあります。とりあえず、今回のようにuintのパラメータひとつだけで、6を与えるとすると32バイトの6ですので以下のようになります。

dataパラメータに渡す値は、2つを結合した次の値になります。

よって、Contract Multiply7のmultiplyメソッドを呼び出すトランザクションは、再掲しますが以下のようになります。

しばらく待ち、マイニングが成功してトランザクションがブロックに登録されたら、結果をeth_getTransactionReceiptで取得できます。

resultのlogsの中にあるdataが結果のようですね。

これは10進数では42ですので、6*7=42 ですから正しい結果が返ってきています。

ちはやぶる 神代も聞かず 人工知能 シンギュラリティ 人智超えるとは(1)

他とは違う視点で人工知能について考えてみる、このコーナー。今回は、富士山近辺の村にある中国人経営の中華料理屋で、食事をしながらテレビを見ていて考えたことです。

ちはやぶ・る・う♪

テレビでやっていたのは、Perfumeが主題歌を担当しました「ちはやふる」という映画について。百人一首の競技カルタの映画です。私は映画を見てないですが、まあ、それは重要でないので。

番組で競技カルタの説明をするときに、「カルタのイントロクイズみたいなもんですね」という、うまい例えをしてました。私は、中学生のときに学校で百人一首大会が行われたことを覚えています。いちおう、100首全部暗記したような気がしますね。でまあ、本番では暗記の成果を披露するなどできず、普通のカルタ状取り態になったわけですが。

トップクラスの選手だと、「決まり字」が読まれた瞬間に手が出ると聞いて、中学生ながらに疑問を持ったんですよね。最初の数文字でどの札がターゲットか決まってしまう。「それって、百人一首の和歌の意味はどうなるんだろうか?」

 

百万人一首

映画をきっかけに百人一首なり競技カルタに興味を持つ人が増えていると、番組の中でいってました。始めた人によれば、「心が豊かになった」という「決まり字」が読まれるのですが。さて、ここで思考実験をしてみます。

  1. 1,000,000種類の記号の中からランダムに31の記号を選択する(重複を許す)
  2. 選んだ31の記号を、これまたランダムに並べる
  3. 1と2を1,000,000回繰り返す

以上を行いますと、100万枚のハナモゲラ語のカルタがが出来上がります。

karuta

まあ適当に作りましたが、こんなのが100万枚あるわけです。このカルタは例えば、決まり字が「◇」だったり「A」だったりするわけです。このカルタを使って百万人一首大会を行ったとします。選手は全員コンピュータ(AI)とします。

勘のいい方は、「中国語の部屋」を思い出したことと思います。

中国語の部屋

百人一首を題材に中国語の部屋問題を扱う意図については、次回で。

EthereumのContractと通信する

前回、Truffleのサンプルを動かしてみました。Truffleのインストールから進めながら途中で出るエラーの対処をしていて、結局Ethereumの理解が半端なままでは効率が悪いとなりました。TruffleではEthereumのContractと通信をするアプリを作りますので、Contractについて公式を見ながら勉強してみることにしました。

Contractのコードは高級言語で書いてEVMバイトコードにコンパイルします。言語は複数あるようですが、初心者はSolidityを選ぶのが自然のようです。

 

JSON-RPC

Contractとは(正確にはEthereumノードとは)、JSON-RPCで通信することになります。

通信をするため、EthereumのGo言語製のクライアントgethを使います。コマンドラインインターフェースが提供されます。

これで、EthereumとRPC通信が行えるようになります。gethのコマンドラインオプションの説明はここにあります。

以下では、curlコマンドにJSONパラメータを渡してEthereumと通信をします。パラメータのmethodの項目にEthereumのメソッドを記述します。

 

コンパイルからデプロイまで

コンパイル

Solidityで記述したContractのコンパイルにも、複数の手段が用意されているようです。

Compiling a contract

コンパイラの存在確認をします。

resultとしてSolidityが返ってくれば、次に進めます。

Accessing Contracts and Transactionsのページを見て、順に進めてみます。ここにある簡単なContractを、コンパイルしてEthereumネットワークにデプロイしてみます。整数を7倍するだけです。

 コンパイル

コンパイルを実行して、Contractのバイトコードを得ます。paramsにContractのコードを渡します。長いコードの場合は?IDEを使えば、何か良い手段が提供されるのかもしれません。戻り値のcodeのところにEVMバイトコードが返ってくるようです。

戻り値のinfoにあるabi定義というのが、PHPerにはなじみがない単語ですね。コンパイル言語に付き物のような雰囲気です。abiについては、次回Contractとの通信をしてみるときに詳しく調べます。

Gas消費量の計算

Contractの処理を実行するには、Gasという”燃料”を消費します。その消費量を計算します。paramsのfromにトランザクションの送信元アドレス、gasに上で計算したgas消費量、dataにバイトコードを渡します。

デプロイ

Ethereumネットワークにデプロイします。paramsはgas消費量の計算と同じです。トランザクションハッシュが返されます。

Contractの情報を取得

トランザクションは、実行されるとReceiptを発行するので、それを取得します。paramsは上で取得したトランザクションハッシュです。Receiptの中にはContractのアドレスやそのトランザクションが格納されたブロックのハッシュ、gas消費量などが含まれます。Nullが返されたときは、まだトランザクションがマイニングによってブロックに登録されていません。

以上のような手順でデプロイが完了すれば、Contractと通信をすることができます。次回は実際にContractに処理をさせてみます。

Ethereum開発環境 Truffle を試す

今月はFintech 系の開発があるため、Ethereum のための開発環境 Truffle をインストールして使ってみます。

Truffle公式

Ethereum公式

Etherumでは、スマートコントラクト(よい日本語訳はないだろうか?気持ちいい契約?)を実装し、ネットワークにdeployすることができます。おなじみのマイニングをして、通貨Etherを獲得したりスマートコントラクト上の契約を実行したりすることができます。トランザクションは、ビットコイン同様ネットワーク上のブロックチェーンに記録されていきます。

Truffleは、EthereumのコントラクトとインタラクトするプログラムをJavaScriptでテンポよく実装・テストすることができる、開発環境です。前提としてNode.js(5.0以上推奨)が必要です。

サンプルとして、Etherの送金をするアプリ”MetaCoin”が付いてくるので、インストールからテストまで実行してみました。手順は次の通りです。

  1. コントラクトのコンパイル
  2. アプリのビルド
  3. Ethereumクライアントの実行
  4. コントラクトのEthereumへのデプロイ

ここで、アプリというのはコントラクトとやり取りするJavaScript製のプログラムです。それぞれのやり方は公式ページに書いてあります。いずれも、簡単なコマンド一発で行えます。

3のEthereumクライアントは、開発時と本番時では別のものを使うことになります。開発時にはノードがひとつしか存在しない(したがってすぐに反応が返ってくる)クライアントを使わないと、効率が悪いからですね。ethereumjs testrpcを使います。本番時には、GETHなどのマルチノードのクライアントを使います。

ethereumjs testrpc(GitHub)

以上を行ったうえで、ブラウザを開くと・・・

MetaCoin

このように、MetaCoinアプリがブラウザで表示されます。Amountに金額、To Addressに送金先アドレスを入力してボタンを押せば、送金されて、持ちMETA(実際はEther)が減額されます。

とまあ、もっとも原始的なアプリではありますけど、コードを見ると

 

  • refreshBalance() が持ちMETAのリフレッシュ表示
  • sendCoin()が送金
  • window.onloadでアカウント情報を取得してrefreshBalance()呼び出し

と、読めばすぐわかるコードとなってます。

40行目のweb3というオブジェクトが、Etehereumクライアントとやり取りする胆のオブジェクトらしいです。この辺は順に深堀していこうと思います。

私は誇り高きPHPerですので、JavaScriptの長く連なるコードにいろいろと興奮しつつ、TruffleとEthereumの勉強をしていきます。

検索エンジン自作入門/ wiserのPython移植(6) 修正

前回、ポスティングリストのエンコードとデコードの処理を、pickleモジュールを使って作りました。

ところが、MySQLに保存するときポスティングリストはTEXTのカラムに格納することを忘れてました。そこで、pickle化したものをさらにbase64エンコードして返すように修正しました。

エンコード処理です。

デコード処理はbase64デコードします。

このシリーズはPythonの勉強を兼ねてやっているんですが、検索エンジンは言語の勉強にとてもいいです。いろんな要素を動員しますから。