Tech

Ethereum Solidity で 初めてのDappを作る

  • このエントリーをはてなブックマークに追加

今、急に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つのことをしている
    1. msg.sender: トランザクションの送り主の公開アドレスを探す
    2. 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を再度押し直したりしないとそうはならなかった

これで、コントラクトの作成は完了!

  • このエントリーをはてなブックマークに追加