Ethereum Solidity で 初めてのDappを作る

NO IMAGE

今、急に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を再度押し直したりしないとそうはならなかった

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

     

免責事項

本記事に掲載されている記事の内容につきましては、正しい情報を提供することに務めてはおりますが、提供している記事の内容及び参考資料からいかなる損失や損害などの被害が発生したとしても、弊社では責任を負いかねます。実施される際には、法律事務所にご相談ください。

技術・サービス・実装方法等のレビュー、その他解説・分析・意見につきましてはblock-chani.jp運営者の個人的見解です。正確性・正当性を保証するものではありません。本記事掲載の記事内容のご利用は読者様個人の判断により自己責任でお願いいたします。

     

コンセンサス・ベイス(株)とブロックチェーン事業を行なってみませんか?

当サイトを運営するコンセンサス・ベイス株式会社は、2015年設立の国内で最も古いブロックチェーン専門企業です。これまでに、大手企業の顧客を中心に、日本トップクラスのブロックチェーンの開発・コンサルティング実績があります。

ブロックチェーンに関わるビジネスコンサル・システム開発・教育・講演などご希望でしたら、お気軽にお問い合わせください。

     
     

ブロックチェーン学習に最適の書籍の紹介

図解即戦力 ブロックチェーンのしくみと開発がこれ1冊でしっかりわかる教科書

ブロックチェーン イーサリアムへの入り口 第二版 (ブロックチェーン技術書籍)

本書は、ブロックチェーン技術に興味を持ったエンジニアや、その仕組みを学び、自分の仕事に活かしたいビジネスパーソンを対象にして、ブロックチェーンのコア技術とネットワーク維持の仕組みを平易な言葉で解説しています。この本を読んだうえで、実際にコードを書くような専門書、ブロックチェーンビジネスの解説書を読むことで、理解度が飛躍的に高まるでしょう。(はじめにより)

イーサリアム(Ethereum)カテゴリの最新記事