今、急にEthereumハッカソンで人に見せる必要がでたので、途中だけど公開。
以下の説明をざっくりまとめています。
やってみた感想
2015年6月1日時点
- AlethZero の最新版が、僕のMac + brew環境でコンパイルできなかった
- バイナリのダウンロード cpp-ethereum のバイナリ .app .dmg のダウンロード先 – Qiita
- .dmg (latest)は、現状かなりクラッシュする。stable版は大丈夫そう。
- とある人はわかりくいとのことで、AlethZeroを使わず、geth + ブラウザ(web3.js)
サンプル・コード
contract metaCoin {
mapping (address => uint) balances;
function metaCoin() {
balances[msg.sender] = 10000;
}
function sendCoin(address receiver, uint amount) returns(bool sufficient) {
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[receiver] += amount;
return true;
}
}
コードの説明
- function metaCoin() は、コンストラクタ
- 一度しか実行されないので、初期化に使われる
mapping
mapping (address => uint) balances;
- ストレージの中にマッピングを作る
- コードは、コントラクトのストレージに厳密に情報を書くことができる
- マッピングを定義している
- balancesという名前
- アドレスとuint型のキー、バリュー型
- 2つのデータ型を定義した
- Serpentと違って、Solidityは、静的型付けで、コンパイル時に型チェックを行う
- コンパイル前に型を指定するのは、トランザクションによって渡されたデータ配列の量を減らし、コンパイラがより最適化したEVMコードを作り出すことができる
metaCoin() 関数
function metaCoin() {
balances[msg.sender] = 10000;
}
- コントラクトの初期化をする
- 一度しか動かない (metaCoinというコンストラクタだから)
- 以下の2つのことをしている
- msg.sender: トランザクションの送り主の公開アドレスを探す
- balancesというマッピングを使って、コントラクト・ストレージにアクセスしている
- コントラクトは、キー・バリューのペア(両方32バイト)としてデータを保存している。
-
msg.senderは、公開鍵を意味する160bitの数字
- 偽造できないネットワーク上の唯一のID
SendCoin() 関数
- ここまでで、初期の残高を設定した
- このコントラクトを呼ぶたびにこのsendCoin()関数は呼ばれる
- これが、ユーザが呼べるついいつの実行できる関数
function sendCoin(address receiver, uint amount) returns(bool sufficient) {
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[receiver] += amount;
return true;
}
- トランザクションによって2つの引数がが渡される
- receiver: 受信者の160bitの公開アドレス
- amount: あなたが受信者に送りたいトークンの数
(コード内容の説明は、そのままなので省略)
gas(ガソリン)をきらすな
(コンセンサスとマイニングの話なので省略)
- 投票は、平均12.7秒で行われる
- コントラクトが、トリガーがあって実行されるのは、ユーザか、他のコントラクトがコントラクトを呼んだ時
-
Ethereumネットワーク合計処理能力は、ノードの数に関わらず、1999年からの一台のスマートフォンと同一
- つまり、メガバイトのデータを保存したり、3Dグラフィックをレンダーしたりしないでしょう
- 上記へのワークアラウンドはあります
- Swarmと呼ばれるストレージのソリューション
- セキュアなメッセージング・プロトコル Whisper
- 計算能力も限られている
- 動かすのにgasが必要
- コントラクトに多すぎのgasを送って全部使わなかった場合、返金される
- 少しのgasしか送らなかった場合、コントラクトが停止し、ロールバックする
- gasの値段は、コミュニティのグローバルなコンセンサスによる
コントラクトをアップロードする
2015年6月1日現在、AlethZeroのlatestとcutting edgeバージョンでUIが違うので、バージョンによってやり方が異なると思います。
まずEtherをゲットするためにマイニングする
- 上部タブの Special -> Use Private chain
- トランザクションを送るのにEtherが必要なので、まずマイニングする
- ツールバーの‘Mine’をクリック
- “Debug”に行って‘Force Mining’を選ぶ
- ある程度のEther(15000 Finneyなど)が手に入ったら、マイニングをやめる
トランザクションの作成
- “New Transaction”
- ダイアログが開く
- コントラクトのコードを入力
- gas, gasPriceは、デフォルトのまま
- エラーがでなければ、コンパイルできているので、Executeで送信
- マイニングしてない場合、Pendingのペインに表示される
トランザクションをコミット
- マイニングして、pendingのコントラクトをブロックチェインにコミットする
- Pendingのペインから消え、Contractのペインに表示される
- ちなみに、僕のところではMineを再度押し直したりしないとそうはならなかった
これで、コントラクトの作成は完了!