イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです。ITトレンド・List Finderの開発をベースに、業務外での技術研究などもブログとして発信していってます!


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

社内通貨(風)「いのコイン」をEthereumのスマートコントラクトで作ってみる

こんにちは!
いい感じに涼しくなってまいりまして、八王子の朝は寒いくらいです。風邪を引きました。
矢ヶ崎です。

前回のPちゃん(うちのPepperのこと)ブログでは、顔を認識してもらって打刻をしてもらうということをやってみました!
http://tech.innovation.co.jp/2017/07/14/Pepper.html

さっそく、社内で実運用をしてみてます。いい感じに打刻されてます!

では、今回は引き続き、

  • Pepperに「会議室どこ?」と聞くと、次の会議の会議室を教えてくれる

をやろうと思った矢先に!
Pちゃんが体調不良になり、起動しなくなってしまいました。。。
カスタマーサポートさんに連絡したところ、ドナドナ決定!
新しいPちゃん(なぜか少し黄ばんでる)がやってきたばかりなので、今回は急遽ブロックチェーン関係に変更しました!笑

感動と成長!

唐突ですが、弊社では「感謝の気持ち、ありがとうを忘れません」という行動指針や、サンクスカードを送るという文化があり、 ちょっとしたありがとうの気持ちをカードとして送り、壁に貼り出す、というようなことをやっております。

こちら、その内容を取材していただいた内容です。

そこで、ブロックチェーンとスマートコントラクトを使って、社内通貨(風)の物を作成し、サンクスメッセージが送られたら、仮想通貨(風)「いのコイン」を100(単位inno)を一緒に送るという物を作ってみます!

ブロックチェーン、スマートコントラクトってなによ?!

ここで説明するのも野暮なので、是非、検索エンジンに聞いてみてください!

スマートコントラクトの開発環境を作る

今回は、スマートコントラクトを実装する言語として、たぶんメジャーだと思われる、Solidityを利用してみます。
また、開発環境としては、とってもお手軽なBrowser Solidityを使ってみます。

開発環境の準備はとっても簡単。
https://remix.ethereum.org/
にブラウザでアクセスするだけ!
ただ、
それだけ!!!

最低限の「いのコイン」を作ってみる

では早速、仮想通貨(風)「いのコイン」(単位inno)を作ってみようと思います!

Browser Solidityの左上の「+」みたいなアイコンを押します。

ic1

新しいファイル「Untitled.sol」ができるので、とりあえず「InnoCoin.sol」にリネームしておきましょう。

ic2

右側のソースコードを書くっぽいところに、以下のコードをコピー&ペーストしましょう。

ic3
pragma solidity ^0.4.8;

contract InnoCoin {
    string public symbol;
    uint256 public totalSupply;
    address public owner;
    mapping (address => uint256) public balanceOf;

    event Transfer(address indexed from, address indexed to, uint256 value);

    function InnoCoin(uint256 _supply) {
        owner = msg.sender;
        balanceOf[owner] = _supply;
        symbol = "inno";
        totalSupply = _supply;
    }

    function transfer(address _to, uint256 _value) {
        if (balanceOf[msg.sender] < _value) throw;
        if (balanceOf[_to] + _value < balanceOf[_to]) throw;

        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;

        Transfer(msg.sender, _to, _value);
    }

}

右下の方の、Createボタンのとなりに、innoの発行総量を入れて、Createボタンを押しましょう。
今回は、総量として10万inno用意しておきます。

ic4

こんな感じになったら、もうすでに「いのコイン」が出来ました!!!
totalSupplyがいのコインの総量ですが、ちゃんと10万になってますね!

ic5

では、innoを他のアカウントに送金してみましょう。
現在、「いのコイン」を発行したアカウントは、右の方にあるAccountと書いてある右のドロップダウンに表示されているアドレスです。

ic7

Accountのとなりにある、コピーっぽいボタンをクリックすると、画面に入りきっていない正式なアドレスがクリップボードにコピーされますので、テキストエディタなどに貼って確認してみてください。

0xca35b7d915458ef540ade6068dfe2f44e8fa733c

こんな感じのものがコピーされているはずです。
これが「いのコイン」を発行したアカウントなので、別のアカウントに送金してみましょう。

ic6

Accountのドロップダウンで別の物を選んで、コピーして、さらに元の発行アカウントに戻しておきます。
その状態で、コピーされたアドレスを、balanceOfボタンの右の箱にダブルクォートで囲んでペーストし、balanceOfボタンを押すと、そのアドレスのinno残高が取得できます。

ic8

現在は、当然 0 です。

では、送金してみます。
transferボタンの横の箱に、"送金先アドレス", inno送金額を入力し、transferボタンを押します。
すると、送金出来たっぽい表示がされます。
とりあえず、100inno送ってみましょう。

ic9

送ったinnoが反映されているか、確認してみましょう。
先ほどと同じように、balanceOfボタンを押してみましょう。

ic10

100inno入ってますね!

ちょ〜〜〜〜基本的な「いのコイン」は、これで完成です!

メッセージを送ったら「いのコイン」が送られるようにしてみる

では、ちょっとだけスマートコントラクトっぽくしてみます。
サンクスメッセージが送られたら、自動的に100innoも送るようにしてみましょう。
また、総量も増やせないと尽きてしまうので、「いのコイン」創始者だけは総量を増やせるようにしてみましょう。
改めて、以下のソースコードを貼って、Createしてみてください。

pragma solidity ^0.4.8;

contract InnoCoin {
    string public symbol;
    uint256 public totalSupply;
    address public owner;
    mapping (address => uint256) public balanceOf;
    mapping (address => string) public thanksMessage;

    event Transfer(address indexed from, address indexed to, uint256 value);

    function InnoCoin(uint256 _supply) {
        owner = msg.sender;
        balanceOf[owner] = _supply;
        symbol = "inno";
        totalSupply = _supply;
    }

    // innoの総量は、創始者だけが増やせる(減らせない)
    function addTotalSupply(uint256 _value) {
        if (owner != msg.sender) throw;
        totalSupply += _value;
    }

    function transfer(address _to, uint256 _value) {
        if (balanceOf[msg.sender] < _value) throw;
        if (balanceOf[_to] + _value < balanceOf[_to]) throw;

        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;

        Transfer(msg.sender, _to, _value);
    }

    // サンクスを送ると、100innoも一緒に送られる
    function thanks(address _to, string _message) {
        transfer(_to, 100);
        thanksMessage[_to] = _message;
    }

    function thanksMessage(address _address) constant returns (string) {
        return thanksMessage[_address];
    }

}

では、サンクスメッセージを送ってみます。
thanksボタンが出てきたと思うので、となりの箱に、"送り先アドレス","サンクスメッセージ"を書いて、thanksボタンを押してみましょう。
送り先アドレスは、先ほどと同じ手順で、ドロップダウンからコピーしてみてください。
また、コピーしたあとにAccountのドロップダウンを元に戻すのをお忘れなく!ドロップダウンの内容が、送り元(実行アカウント)になります。

ic12

なんだか送れたっぽい雰囲気ですね!
メッセージが送れているか、確認してみましょう!
thanksMessageボタンの横の箱に、送り先のアドレスを入れてボタンを押してみます。

ic14

ちゃんと、メッセージが送れているっぽいですね。
さらに、ちゃんと100innoも送れているのでしょうか?
先ほどと同じように、balanceOfボタンで確認してみましょう。

ic15

ばっちしですね〜!
サンクスメッセージを送ると、いのコインが送られるというコントラクトが出来ました!
何回もサンクスメッセージを送ると、そのたびに100innoづつ送られているのが確認できますので試してみてください。
めっちゃ簡単ですよね〜。 ソースコードの説明は全くしていませんが、プログラミング経験者なら、実際にここまでやってみるだけで、なにをどうすればよいのか、なんとなくわかっちゃうと思います!
すごすぎる!すごすぎるぞEthereum!

Ethereumで「いのコイン」を使ってみる(次回予告)

では、表現的にはあれかもしれませんが、実際パブリックなブロックチェーンのネットワークである、Ethereumで運用してみましょう。
しかし!先ほどのBrowser Solidityのテスト環境と違い、現状は Proof of Work(PoW) で動いているEthereumやEthereum Classicでは、ブロックチェーンの正当性を担保してくれているマイナーに、コントラクト実行の手数料を払う必要があります。そのため、実際の仮想通貨であるETHやETCが必要です。
上の方で画面に出てきたTransaction costなどの「gas」というのが、実はその手数料になります!
また、勝手に「いのコイン」をパブリックにのせて良いか問題も残っています笑

なので、今回はものすごい中途半端なところまで書いておしまいにします!

その準備とは?!

まず、go-ethereumをインストールします。
https://github.com/ethereum/go-ethereum からがんばってインストールするか、 gethインストール で検索していただければ、簡単にインストールできますのでいい感じにインストールしてください。
そして、gethをrpcモードでmain-netに接続する状態で起動します。
まさかのあとは次回!!!

こちらからは以上です。

※「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer’s Books)」 を多分に参考にさせていただきました。ありがとうございます!