Geth で Solidity を動かす

今回は Ethereum のブロックチェーン上にスマートコントラクトを記述して動かしてみたいと思います。主にこちらを参考にしておりますが、記述内容が古くそのままだと動かない箇所がいくつかありましたので注意してください。

Geth と Solidity

ご存知の通り Ethereum のブロックチェーンはパブリックで誰でもアクセスすることができますが、直接アクセスしようとすると低レベルな処理が必要で面倒です。なので一般的にはこれらの処理を肩代わりしてくれるプログラムを使ってブロックチェーンにアクセスします。それが Geth (go-ethereum)です。またスマートコントラクトを記述するためのプログラミング言語が Solidity です。文法的には JavaScript に似ていますが、こちらは静的型付けのコンパイル言語になります。

ゴールのイメージ

まずは Geth 単体でブロックチェーンにアクセスしてみます。そのあと Solidity で書かれたコードをコンパイルしてブロックチェーン上で動かしてみます。

インストール方法

Geth と Solidity のインストールは OSX であれば Homebrew を使って簡単にできるのでググれカス的な感じで(汗

Geth 単体で使ってみる

手始めに Geth を使ってブロックチェーンにアクセスしてみようと思います。

パブリックなブロックチェーンを使うとトランザクションコストが発生してしまいますので、自分のPC 内にプライベートなブロックチェーンを用意します。プライベートなチェーンを使うとテスト用のアカウントに自由に ether を付与できるのでコストゼロでテストできます。

プライベートチェーンを作る

適当なディレクトリで

$ mkdir eth_net
$ vi genesis.json

genesis.json

{
  "config": {
    "chainId": 10,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "alloc": {},
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "difficulty": "0x00",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "gasLimit": "0xffffffff"
}

最後に以下のようにしてブロックチェーンを初期化しておきます。

$ geth --datadir ./eth_net init ./genesis.json

ここまででプライベートチェーンができました。

Geth コンソールの起動

Geth コンソールを立ち上げて先ほど作ったプライベートなブロックチェーンにアクセスしてみます。

$ geth --datadir ./eth_net console
(省略..)
>

(> は Geth コンソール上での作業を、$ は linux シェル上での作業の意図で使い分けていきます)

テスト用アカウントの作成

このまっさらなブロックチェーンにはまだユーザーがいませんのでテスト用のアカウントを作っておきます。

> personal.newAccount('パスフレーズ')

パスフレーズは省略可能です。

マイニング

このアカウントを使ってマイニングをしてみます。成功すれば報酬として ether が取得できるはずです。

> miner.start()
(しばらく待つ)
> miner.stop()

miner.stop() を入力する際に、ログが標準出力に出てきますが気にせずに入力してエンター押せば OK です。

アカウントの ether 残高を確認します。

> eth.getBalance(eth.accounts[0])
5000000000000000000

数字が表示されればマイニングが成功しています。単位は wei で表示されているので桁が大きいですが気にしない、気にしない。

送金してみる

このマイニングで得た either を別のアカウントに送金してみます。上の「テスト用アカウントの作成」と同じ手順で送金先のアカウントを作っておきます。

送金元のアカウントのロックを解除します。

> personal.unlockAccount(eth.accounts[0], 'パスフレーズ')

以下のようにして送金トランザクションを作成します。

> eth.sendTransaction({ from: eth.accounts[0], to: eth.accounts[1], value: 10 })

この場合 eth.accounts[0] が eth.accounts[1] に 10 wei を送金することになります。

作成したトランザクションを承認させるためにマイニングを行います。

> miner.start()
(省略...)
> miner.stop()

2つのアカウントの残高を確認します。

> eth.getBalance(eth.accounts[0])
4999999999999999990
> eth.getBalance(eth.accounts[1])
10

無事に ether が送金されました。

プログラムを書いてみる、動かしてみる

1)プログラムを書き 2)コンパイルして 3)ブロックチェーンにデプロイして 4) 実行してみます。

プログラムを書く

Solidity でサンプルプログラムを作ります。

$ vi single_num_register.sol

single_num_register.sol

pragma solidity ^0.4.11;

contract SingleNumRegister {
  uint storedData;
  function set(uint x) {
    storedData = x;
  }
  function get() constant returns (uint retVal) {
    return storedData;
  }
}

コンパイルする

Solidity のコンパイラ solc でコンパイルします。

$ echo "var out = `solc --combined-json abi,bin single_num_register.sol`" > out.js

ここでコンパイル結果を out に代入していますが、後で Geth コンソールから loadScript するために必要ですので一旦このようにしておきます。

ブロックチェーンへのデプロイ

このコードからコントラクトを作成してブロックチェーンに登録していきます。

以下のようにしてコントラクトを作成します。

> loadScript("out.js");
> var contract = web3.eth.contract(JSON.parse(out.contracts["single_num_register.sol:SingleNumRegister"].abi));
> var singleNumRegister = contract.new({ from: eth.accounts[0], data: "0x" + out.contracts["single_num_register.sol:SingleNumRegister"].bin, gas: 4700000});

マイニングを開始してこのコントラクトをブロックチェーンに登録します。

> miner.start()
(しばらく待つ)
> miner.stop()

コントラクトインスタンスの address に値が入っていればブロックチェーンへの登録が完了しています。

> singleNumRegister
{
(省略...)
address: "0x314b339a74dfc860b48e4eb5ad0dae149f51617e",
(省略...)
}

コントラクトの実行

このコントラクトを動かしてみます。

プログラムした get 関数を呼び出してみます。

> singleNumRegister.get.call()
0

0 が登録されています。

set 関数を呼び出して 7 を登録してみます。これはブロックチェーン上の値を変更することになるので ether を消費してトランザクションを生成する必要があります。

> singleNumRegister.set.sendTransaction(7, {from: eth.accounts[0], gas:1000000})

マイニングします。

> miner.start()
(しばらく待つ)
> miner.stop()

get 関数で登録された数字を取得します。

> singleNumRegister.get.call()
7

7 が表示されました。

最後に

今回は Geth を使ってプライベートなブロックチェーンを作りマイニングと送金を試しました。また Solidity で簡単なコードを書いてコンパイル、デプロイ、実行までやってみました。

Geth に関してはネットの情報が古くなっているケースが散見されたので少し注意が必要そうです。またコードを書いてからデプロイまでのプロセスが面倒くさいと感じました。コントラクト開発をするためのブラウザベースの IDE がいくつかあるようで、それを使えばこの辺りの面倒なプロセスをフォローしてくれるんじゃないかなと期待しています。

クレジットカードを使って JPY から BTC を買う

クレジットカードで JPY から BTC を購入できる取引所は 2017/5/31 現在 bitFlyer, coincheck, Zaif, bitbank の4つありまして、それぞれ手数料や購入額の上限が異なります。

なぜかクレジットカードで購入する際の手数料は非公開で変動するとのことで、現在の手数料を調査してみました。

取引所 手数料 上限額
bitFlyer 8% 100万円/日
coincheck 8% 100万円/回
Zaif 5.4% 10万円/回
bitbank 調査中 調査中

bitbank もクレジットカードに対応しているということだったんですが入金方法が見つけられませんでした。bitbank の場合は住所確認が終わらないと入金もできないようなので、確認されしだい調査したいと思います。

アルトコインの価値について

ビットコインの価値

すでに仮想通貨のデファクトとなっているビットコインが世間一般に認知され、いくつかのネットサービスや実店舗においては BTC による決済も可能になっています。世間一般から見れば「普通に使える通貨」になりつつある BTC に多くの人々が価値を見いだす理由はわかりやすいです。

アルトコインの価値

しかし、そこで疑問になることがあります。ビットコインほど浸透していないアルトコインの価値とは何なのでしょうか?投機的な価値を排除した場合、どのような物差しでその価値を測ればいいのでしょうか?

今回はわたくしの考えをまとめてみたいと思います。

普通に使える通貨であるか

1つ目は「普通に使える通貨」であるかどうかが挙げられます。現状そのようなアルトコインはありません。もし今後ネットサービスや実店舗においての支払いが可能になるものが出てきた場合、その通貨は価値を持つことになります。

ビットコインにはない付加機能

2つ目はビットコインが持ち得ない機能を付加したことによる差別化が挙げられます。

例えば Ethereum のスマートコントラクト。ブロックチェーン上に何らかの手続きを記述したい場合はビットコインでは対応できません。もし今後スマートコントラクトが使われるようになれば、スマートコントラクトをサポートしているアルトコインは価値を持つことになります。

このようにビットコインが持たない機能を付加することで、アルトコインの価値が高まるということは十分にあり得ます。

スケーラビリティ

3つ目はパフォーマンス問題に対するソリューションです。一般的には「スケーラビリティ問題」と言われていますが、どれだけトランザクションが増えたとしても瞬時に決済がされなければ利便性の低下は避けられず価値は低下します。

ビットコインは決済に時間がかかるという問題が指摘されており、SegWit やブロックサイズの拡張などの案が提案されていますが(政治的な問題も孕み)議論は難航しているようです。

ただしこれはビットコインに限った話ではありません。逆にスケーラビリティ問題に対する技術的なソリューションが提示されている場合その通貨は価値を持つことになります。

コンセンサスアルゴリズム

4つ目は安全性の担保です。ブロックチェーン上での取引がなかったことになったり改ざんされてしまっては困ります。これは各通貨のブロックチェーンがどのようなコンセンサスアルゴリズムを採用しているかが重要なポイントです。

ビットコインでは PoW が採用されておりますが、それ以外にもいくつかのアルゴリズムが存在しており、各アルトコインのブロックチェーンによってコンセンサスアルゴリズムは異なっています。

ほぼあり得ないとは思うのですが、何かの拍子にコンセンサスアルゴリムがうまく機能しなくなったり、ハックされたりすればその通貨の価値は地に落ちますので、価値を測る上でコンセンサスアルゴリズムとそれにまつわるリスクは把握しておく必要があります。

まとめ

と、それらしい理由をいくつか挙げてみましたが現状の売買価格を見ると、バブル真っ只中のアルトコイン界隈においては真の価値とは乖離したところでマネーゲームが繰り広げられているような状況ではあります。

わたしく自身ここで考えをまとめてみましたが、まだアルトコインの価値の算定はできていません。何か考えに進展があればその旨エントリーを挙げたいと思っています。

2017/05/26 からの BTC 暴落について

先週金曜日(26日)の明け方くらいから BTC の価格が突如下がり始めました。

前日の木曜日は高値を更新し 33万円/BTC を付けていたものの明けて金曜日の朝には 26万円/BTC まで売られていました。ただ金曜の日中には持ち直して 30万円/BTC 前後まで回復していましたので、わたくしアルタは静観しておりました。

しかし金曜の夜21時頃にまた売られて 26万円/BTC に転落。そこから土曜日の夜まで丸24時間ずるずると下がり続けました。一番安い時で 21 万円/BTC になっていたと記憶しています。今現在29日の月曜ですが 26万円/BTC あたりをうろついています。

この週末の件で冷や汗をかいた方も沢山いたのではないかと思いますが、わたくしは 26 万円/BTC で一旦損切りしていました。その後下がったところで買い戻そうと思っていたのですが最安値では掴めず 24万円/BTC あたりで買い戻しました。結果的に保有 BTC は増えたので個人的には良しとします。

ただ気になったのはその他のアルトコインが BTC に引きづられて売られていたこと。この辺りの相関関係についてはまだ良くわかっておりませんが、現状のパワーバランスだと諸々のアルトコインは BTC の影響を受けるということが分かりました。

クレカで購入したコインは1週間動かせない?

1行でいうと

もうタイトルでネタバレですが、購入した BTC  が送金できなくて困ったという話です。

秘密鍵を他人に預けるリスク

先日 coincheck にてクレカで30万円分の BTC を購入しました。その後色々調べていると「取引所にはコインを置いておくべきではない」という記述をよく見かけます。

というのも、取引所のウォレット(=秘密鍵)は当然ですが取引所が管理しています。仮にハッキングや内部の悪人による盗難は十分あり得ます。大量のコインを保有している方などは、そのあたりのリスクを考慮してハードウエアウォレットという特殊なデバイスを使って秘密鍵を管理しているようです。

余談ですが、秘密鍵と公開鍵を使ったユーザー認証はインターネットではよく使われる技術でして、私たちのようなインターネットの技術屋には馴染み深いものです。秘密鍵は当然のようにローカルのコンピューターで保管しており、間違っても他人に渡すということはあり得ません。そんな仕事柄もありまして、秘密鍵をネットサービスに預けるというのは気持ちが悪いものなのです。

送金してみたい

わたくしの場合は高々 30 万円程度なのでそこまでしなくてもいいかなとは思いましたが、秘密鍵を他人に預けるのはどうにも気持ちが悪いのと送金を体験してみたく、スマホウォレットを選択しました。まずは半分だけ送金します。

スマホウォレット

スマホウォレットというのは自分のスマホの中で秘密鍵を管理するためのアプリで、その秘密鍵を使ってブロックチェーンにトランザクションを流したり受け取ったりできるようになっています(多分)。この手のアプリはいくつかあるのですが、今回は評判が良さそうな bread wallet というアプリを使ってみました。

アプリをダウンロードして「復元フレーズ」と呼ばれる秘密鍵を復元するための単語をメモっておきます。これはドラクエの復活の呪文みたいなもので、スマホを無くしたり機種変更した場合でも、この復元フレーズがあれば全く同じ秘密鍵を復活させることができます。なからず紙にメモって保管しておく必要があります。

1、2、いやほい

さて、そのあたりの手順を踏んで、いざ coincheck からスマホウォレットに送金です。きゃりーぱみゅぱみゅの「原宿いやほい」を口ずさみながら。「えい、そうきーん」

 

 

あれ?こんな表示がでます…。

 

 

 

 

気を取り直して「そうきーん!」当然ですが結果は変わりませんね….

 

なんでしょう。このがっかり感は。復唱します。なんでしょう。このがっかり感は。

送金できないってことは BTC が使えないってことです。購入したコインが1週間凍結される意味がわかりません。coincheck さんどうにかならないでしょうか。

「どうしてもって言うなら問い合わせろ」って書いてあります。ただ、coincheck さんには別件でも問い合わせのメールをお送りしているのですが、なしのつぶてです。何の音沙汰もありません。これは「クソ」と言わざるを得ない。復唱します。これは「クソ」と言わざるを得ない。

 

以上、事件現場からお伝えいたしました。

Bitcoin を 30万円分買ってみた

仮想通貨の世界を体感するためには何かしらの通貨を持っていないとダメだと思い 4月末に coincheck のアカウントを作っていました。

その時は Ethereum を購入しようと思っておりましたが、1週間で2000円も上がっており 7500円弱の価格がついておりました。

なんだか悔しくて、もう少し様子を見ようと思いウォッチしておりました。さらに GW 前後は本業がかなり忙しかったこともあり、しばらく放置状態でした。ところがどっこい。そのあとこんなことになります。

GW 前に見ていた 7500 円から1ヶ月弱で 10000円も上がってしまったんですね。これはもう見てるだけだとダメだと思い。昨日 coincheck に クレカで30万円分入金して、まず 0.97 BTC をゲットいたしました。そういえば BTC を得たことで安心してしまい本来狙っていた Ethereum はまだ買えていません…

あと Bitcoin を購入する際にちょっとわからないことがありました。購入時のレートが 280000 JPY/BTC 程度だったので、30万円分買うということは 1 BTCは買えるものと思っていました。しかし実際は 0.97 BTC しか買えません。この辺りはもう少し仕組みを調べてみないといけません。 何かわかったら追記していきたいと思います。

追記: 入金額と実際に購入できた BTC の差額について coincheck に問い合わせているのですが音沙汰がありません。なのではっきりしたことはわかりませんが、問い合わせページに以下の記述を見つけました。カード決済手数料 20000 円だとすると高いですね。

さらに BTC の爆上げを願うばかりです(完全に投機的な目的になってる…

Bitcoin とブロックチェーンへの固定概念が崩れた話

わたくし、アルタが Bitcoin/Altcoin/ブロックチェーンになぜ興味をそそられたのかを書いてみます。ブロックチェーン=単なる決済手段だと思っている人は認識が変わると思いますので是非読んでみてください。

Bitcoin との出会い

初めて Bitcoin を認識したのは 2013 年の末だったと思います。その頃はなんだか面白そうなものが出てきたなあ。少し持っておきたいなぁ程度の興味でした。投機的な下心もありましたが手を出しませんでした。後に買っておけば良かったなと後悔することになりますが…そのあと Bitcoin 周辺でネガティブな話題が続きまして、すっか興味が失せていました。

ところが 2015 年末ごろにブロックチェーンの仕組みを少し理解してからは、技術的に多少の興味が出てきます。ただ、決済用途で使う技術の1つであり WEB 界隈で頻繁に使われうるものではないという認識でした。

余談ですが、わたくしは WEB 系のエンジニアをしておりますので、ブロックチェーンの技術とは近しい領域で仕事をしております。また IT 界隈は新しく画期的な技術に溢れており、仕事柄それらをある程度キャッチアップしておく必要があります。しかしこれらの新しい技術というのは、もてはやされるだけでメインストリームに上がってこないモノもごまんとあります。

ところが先日(GW 前だったと思う)知り合いからブロックチェーン近辺の最新情報を聞く機会があり認識が 180° 変わりました。主に次の3点です。

スマートコントラクト

まず驚いたのがスマートコントラクトです。これはある一定の手続き(プログラム)をブロックチェーン上で実行できるという仕組みです。これでブロックチェーン = 決済手段という認識が崩れ去りました。この仕組みを使うとブロックチェーンへのトランザクションをトリガーにして、プログラムされた一定のアクションを引き起こすことができます。つまりブロックチェーンを使ってアプリケーションを作ることができるようになります。

スマートコントラクトについては、実装レベルでどのような仕組みになっているのか全くイメージがついていませんが今後簡単なプログラムを動かして実験していきたいと思います。

デジタルコンテンツの所有記録

次に驚いたのが、Blockai などのようにデジタルコンテンツの所有記録をブロックチェーンを使って行う動きがあることです。現状、複製し放題なインターネット空間においてデジタルコンテンツの所有を主張することが可能になるかもしれないという点において画期的だと思いました。ただ、こちらはまだまだ問題もありそうです。

ICO という資金調達方法

最後に ICO と呼ばれる仮想通貨を用いた新しい資金調達の方法です。従来ベンチャー企業はサービスを開発してリリースします。サービスの人気が得られれば、同時に企業価値も高まりますので、株式公開を行って株式市場から資金を調達します。これは IPO と呼ばれています。

これに対して ICO はサービスで使える仮想通貨を売り出します。このサービスが今後伸びると予想する人は、この仮想通貨がまだ安く買えるうちに欲しくなり、この仮想通貨を購入します。その結果サービス運営者は資金を調達することができます。これは直感的で画期的な方法です。これからは新しいサービスと仮想通貨がセットで立ち上げられることになるかもしれないと強く思いました。

 

以上3点が、アルタの中に深く刻まれました。そして勢いでこのようなブログを立ち上げてしまいました。私のBitcoin/Altcoin熱と世間の過熱感が一過性のものでないことを願うばかりです。

Altcoin Power

このブログは、わたくしアルタ・ノービスが Bitcoin/Altcoin についての情報収集をしながら、独自通貨を流通せさることを目論む過程を皆様に赤裸々にお伝えすると共に、一緒に成長していくことを目的としたドキュメンタリーブログです。

ところで、このブログのドメインは altcoin.pw です。bitco.in、bitcoin.com、altco.in、altcoin.com などキャッチーなドメインを取得しようと目論見ましたが取れるはずもなく、がっくりと肩を落としていた時 altcoin.pw という不思議なドメインが目に入りました。

実は .pw が何の略かもわかりませんが .pw = power と勝手に解釈いたしました。そして何より .pw ドメインは年間299円で取得できることも相まって、altcoin.pw を取得し、ブログ名を Altcoin Power とした次第です。

それではよろしくお願いいたします。どうぞ温かい目で見守ってください。コメント大歓迎です。