EthereumとBitcoin、それぞれのトランザクション

EthereumとBitcoinそれぞれについて、トランザクションがどういう構造をしているか調べてみたいと思います。

Ethereum

  • nonce
  • メッセージの受領人
  • 送信者を特定する署名
  • 送受信されるEtherの量
  • オプショナルなデータフィールド。Contractに送られるmessageを格納できる。
  • STARTGAS値
  • GASPRICE値

Ethereumのトランザクションは、「誰から誰にどれだけのEtherを送る」という情報を単純に持っているようです。nonceは、マイニングのときに求めるあれなのかどうかは、まだ不明です。

Bitcoin

  • バージョン
  • トランザクションインプット数
  • トランザクションインプット
  • トランザクションアウトプット数
  • トランザクションアウトプット
  • Locktime

一方Bitcoinは、トランザクションインプットとトランザクションアウトプットの集合体です。これは「Bitocin+トランザクションアウトプット」のキーワードで検索してくるとたくさん出てきますが、誰かにビットコインを送金したいアカウントは、

  1. 自分が使える未使用トランザクションアウトプットをかき集める(トランザクションインプット)
  2. それを送り先アカウントの使える未使用トランザクションアウトプットとして生成する(トランザクションアウトプット)

という手順で送金を行います(間違っていたら指摘してください)。Locktimeはトランザクションの処理にまつわるUNIXタイムスタンプか、またはブロック高です。

手数料

トランザクションをブロックチェーンに取り込むには、マイナーに対して支払う手数料が必要です。

Ethereumは、STARTGAS値とGASPRICE値から手数料が求められます。Bitcoinは、トランザクションアウトプットとインプットの差額が手数料になっています。それぞれどういう計算で手数料が求められるのかは、詳しく調べていません。Ethereumについては、

Estimating transaction costs

ここを見るとよいかと思います。

Contract間通信のためのトランザクション

Ethereumの場合は、送金だけではなくContractでいろいろな処理を行うことができます。Contractのメソッドを呼び出すためにはMessageを投げますが、EthereumのトランザクションはMessageをそのデータフィールドに格納できます。

日本のAI界隈は新興宗教と同じ

百人一首の話の続きで2ちゃんねるのことを書こうと思ったんですが、ちょっと別の話を書きます。

西垣通先生と西川アサキさん

3年前くらいまではビッグデータ、その次に来てる自意識過剰さん御用達ワードが人工知能なわけですが。どうも、シンギュラリティが来るとか職を奪うという方向の盛り上がりばかりに見えるのはなんでかなと、考えたわけです。シンギュラリティは来ると前提して、喜んだり受け入れるか、怖がるかどちらかしかないように見える。

西垣通さんという情報学の先生がいます。西垣さんは一貫してAIというかITの限界を説かれてまして、私の問題意識と合うのです。そこで、去年西垣さんのセミナーに参加したことがあるのですが。そのセミナーには、西垣さんのほかに西川アサキという若手哲学者も登壇してましてね。AIは大したことない派の西垣さんVS.AIが人間の知能を持てない理由がわからないよ派の西川さんという図式でした。

海外のAI事情はそれほどしっかり調べてないですけど、例えばこんな記事もありますね。

The End Is A.I.: The Singularity Is Sci-Fi’s Faith-Based Initiative

シンギュラリティの本場アメリカより、日本のほうがいわばAI信者が多いのではないかな。

AI信者という新興宗教信者

AIにすべて滅ぼしてしまって欲しいAI信者が、日本にはたくさんいる。教祖はレイ・カーツワイル。なぜか?

人間より優れたAIがすべてを変えてくれる(壊してくれる)と考えれば、いけてない人間(生物)である私も自意識を保てる

と考える人が多くいるからですよ。人間としていけておらず、生物としてもいけていない。だからAIでみんな滅びちゃえ。そういう表現を、「俺は頭がいいし哲学までしちゃってる」という高い自意識も込めてできてしまうことが、人工知能凄い系の流行現象の本質ですね。一昔前の「希望は戦争」のようなものです。

名古屋でとてもユニークな人工知能の講義を聞かせてくれた女性研究者もね、やたら忙しいせいかAIに人間を越えてほしいと思ってるみたいだったし・・・。社会システムもますます行き詰ったとき、ええじゃないかを踊りだすのではなくAIに何とかしてほしいと願う。

西垣さんは、もう70近い方で家族もおり好々爺のような方です。いっぽう西川アサキさん。アラフォー独身です。セミナーでのファッションがSFみたいなコスプレのようなファッションで、これまたこじらせ感が。黒のレザーが多く使われていたような記憶です。サイバーパンクではないんですが・・・。

こういう対照的なおふたりの、AIに対する賛否とパーソナリティと人生。いろいろ示唆的だと思いませんか。私も40オーバー独身です。そんな私が思うに、人工知能は奥深いですが、アルゴリズムは全部人工知能にされてしまう勢いの最近の風潮は、少子化や草食化や独身の交際相手なし70%と根が同じと思いますよ。

私は生物として強力でい続けたいと思います!フォースのともにあらんことを!

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

(2)から3か月も経ってしまった。この問題こそ私のモチベーションなので、何年かけても続けますけどね。

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

この100万人1首を超高速処理するAIカルタというのを仮定して、いまのエンターテイメントが100万人1首になっていっているという私の憤りを書きました。

感じませんかね・・・。インターネットにしても、「面白い記事」という「型」があってそこへ当てはめたものばかりになってません?Facebookに流れてくる「面白いネタ」ってみんなこれだし、そういうのを馬鹿にする人種(例えばはてなー)だって、別の「型」に則ってるだけなんですよ。そして、だんだん型ですらなくなって高速記号処理に近づいて行ってるわけです。

Perfumeが主題歌を担当した映画「ちはやふる」を見て競技カルタを始めて、「心が豊かになった」という人がいる。最初の数文字で決まり手を判別して高速で札を取りに行く。この点で、競技カルタは高速記号処理に見えるわけです。AI100万人1首では心は豊かになりそうもない。じゃあ、百人一首はどうして心を豊かにできるのか?私の考えでは、時間の積み重ねである「歴史」と「身体」が存在するからだと思います。それは「意味」と言い換えてもいいと考えてます。飛躍があるように見えるでしょうけど、まあそれはおいおい説明するとして。

どうも人工知能の分野では、意味についてあまり扱いたくないのでしょうかね。深層学習流行りの最近では、ますます意味は知能の対象外になっているように見えますね。時間と身体を無視して、一次元的な記号列による表象ですべての知能活動を賄えるとしてしまう・・・。彼らは感情は知能の部分要素と思っているか、理性より劣ったものとして切り捨てているようです。

「人工知能」脳に近づくと、左が右と大差なく見えるようになっていきます。ゲシュタルト崩壊ともいいます。ところで、ゲシュタルト崩壊という現象も知能について考えるにあたって興味深いですね。

理系の研究所にいて人工知能を研究しているような人は、「面白くない自分」を気にして劣等感を抱いていたりします(笑) そこで、

「感情は知能に劣る。感情があるせいで冷静な判断を人間は下せないので、人間を超えた人工知能に様々な課題を解決してもらおう」

このようなことを考えているわけです。このことが正しいかどうかは置いておきます。最近のように社会全体が人工知能人工知能ということで、全分野で働く人の脳みそがAIっぽくなっていっている、とりわけエンタメ分野が面白くなさすぎるがウンコすぎると私は怒っているわけです。

次回 2ちゃんねるのコピペ文化へ続く

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

検索エンジン自作入門/ wiserのPython移植(5)で作ったmerge_postings を呼び出す側の、二つの関数 merge_inverted_index と update_postingsを実装します。

最初に update_postings から。これはストレージ上のポスティングリストとメモリ上のポスティングリストをマージして、その結果をストレージに保存します。引数はメモリ上の転置インデックスのエントリです。書籍は77ページ。

fetch_postings は、トークンIDでトークンに紐づくポスティングリストをストレージから検索します(2行目)。ストレージに該当するトークンがなければエラーを返します(13、16行目)。あれば、メモリ上のポスティングリストとマージした結果でdb_update_postings でストレージを更新します(8行目)。

次にmerge_inverted_indexです。ふたつのメモリ上の転置インデックスをマージします。引数はマージするふたつの転置インデックスです。書籍は79ページ。

書籍ではマクロ HASH_FIND_INT  で行っているマージ先からのトークンの検索は、関数 find_token_from_index で行っています(3行目)。merge_postings でポスティングリストをマージしているのは、update_postings と同じです(7行目)。

これで、転置インデックスの構築する部分で残るは、検索対象の文書(書籍と同じようにWikipediaにしようと思ってます)をインポートする処理だけとなりました。だいぶかかってしまった・・・。次回はWikipediaで提供するXMLをlxmlを利用してインポートする処理を作ります。

正直、設計にしろPythonの使い方にしろこれでいいのかなと思いながら作ってますが、Wikipediaから転置インデックスが作れればまずはOKということにします。

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

前回の(1)で、百万人一首というものを仮定してみました。

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

これをやって出来上がった100万枚のカルタで、AI選手がカルタ取り競技をするというものでした。

AIは読み上げ(というかコンピュータ同士の競技なので何かしらのINPUT)を聞いて、100万種類の記号の中の決まり字「☆」とか「!」で、AIならではの敏速な判断を下して、カルタをGETし合います。人間様が観客でいるなら、わかりやすくカルタをAI選手の一人が取るごとに、LEDでもなんでも点灯させてやることとします。

100万枚のカルタだろうが100万種類の記号の羅列だろうが、プログラムなのでわけもなく取っていきます。各AI選手は、いまの将棋プログラムのように人がプログラムしたものでも、自律して自己を書き換えてしまう未来のAIプログラムでもいいです。

観客には、激しいLEDのフラッシュが見られてエキサイティングかもしれませんね。LEDではつまらないか。今思い出しましたが、80年代の映画「WAR GAME」でコンピュータが3目並べをするシーンがありました。こんな感じで人間向けにショーアップしたら、少し楽しそうですね。ちなみに、映画のAIは三目並べの次に核戦争のシミュレーションを始めます(核戦争の映画です)。

では、凄まじい勢いでカルタを取り合っているAI選手にとっての、カルタとは何でしょう?このエントリーを書くきっかけになった中華料理屋で見ていた百人一首の番組で、「ちはやふる」を見て競技カルタを始める人が増えていると話してました。そういう人の中には、「心が豊かになった」とかいう人がいるわけですよ、お約束ですが。

百人一首は決まり字があり、それが上の句の最初の2文字とか3文字にくる場合もあるんです。それをイントロクイズばりに超反応で取りに行く。それが競技カルタです。そういう競技をたしなむうちに心が豊かになるとは、どういうことなのでしょう。この超発展版として、このエントリーで仮定した百万人一首というものが、考えれれるでしょうか。どうでしょうか。

現代社会のITの使い方は、様々なエンターテイメントを百万人一首にしようとしているということに、私はもの凄い憤りを感じているわけなんです。だって、クソつまらないから。

続く

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について公式を見ながら勉強してみることにしました。

Ethereum Homestead Documentation

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公式

http://truffle.readthedocs.io/en/docs/

Ethereum公式

https://ethereum.org/

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の勉強を兼ねてやっているんですが、検索エンジンは言語の勉強にとてもいいです。いろんな要素を動員しますから。