GMOアドマーケティングの呉です。
前回はブロックチェーンについてお話しましたが、今回はその続きとして、
ブロックチェーンのスマートコントラクトについてお話したいと思います。
現在もビットコインのブロックチェーンにはスマートコントラクトというシステムはなく、今回はスマートコントラクトを最初に導入したブロックチェーンであるイーサリアム (Ethereum) のスマートコントラクトについて紹介したいと思っています。
1.イーサリアム (Ethereum) とは?
ビットコインがブロックチェーン1.0だとして、イーサリアムは最初のブロックチェーン2.0 と言われています。 イーサリアムとは2015年に当時19歳だったVitalik Buterin氏によって作られたビットコインと同じくオープンソースのブロックチェーンで、ビットコインとの大きな違いは下記のテーブルにまとめました。
ブロックチェーンの種類 | ビットコイン | イーサリアム |
コンセプト | デジタル通貨を目指す | スマートコントラクトで様々な分散型アプリケーション(DApp)を作れる汎用なブロックチェーンを目指す |
記号 | BTC | ETH |
スマートコントラクト | 無し | 有り |
暗号化アルゴリズム | SHA256 | Ethash |
平均ブロック時間 | 10分間 | 12-15秒 |
発表時期 | 2009年1月 | 2015年7月 |
まず、コンセプトが異なります。ビットコインは2009年に、Satoshi Nakamotoという現在も特定できていない人物が作ったブロックチェーンですが、これは単にプログラマの間でのデジタル通貨を目指すというコンセプトで作られていました。その6年後に発表されたイーサリアムは通貨としてだけでなく、様々な分散型アプリケーションを開発するためのプラットフォームというより大きなビジョンで作られています。
また、イーサリアムはビットコインの問題点をいくつか改良しています。マイニングに関する暗号化アルゴリズムにも違いがあります。前回の記事ではSHA256のアルゴリズムで作られたブロックチェーンを作りましたが、SHA256にはGPUよりもマイニングに特化しているASICが有利になるという問題がありました。GPUと比較して高額なASICが有利になることで、マイニングが一部の個人や団体が有利になるようになってしまう可能性があります。これが分散型社会にしたいというブロックチェーンの基本理念に反しているため、イーサリアムはASICが有利にならないようEthashというアルゴリズムを導入しています。
また、平均ブロック時間はブロックチェーンよりもイーサリアムはかなり短くなっています。これによってイーサリアムのブロックチェーンでのトランザクションがビットコインよりはるかに速いというメリットがあります。
そして、他にも色々と違いはありますが、最大の違いはイーサリアムにはスマートコントラクトという仕組みがあることです。
2.スマートコントラクトとは?
スマートコントラクトはデータとそのデータを操作するためのプログラムコードで作られています。
これは私達日常の契約(コントラクト)と何の変わりもありません。
日常の契約を結んだ後に、もし問題が起きた際は裁判所など第三者機関で判定をしてもらうことになります。
仮想通貨は銀行など第三者機関を介さない通貨ならば、スマートコントラクトというは第三者機関を介さない契約を目指しています。スマートコントラクトで成立した契約は不可逆的にブロックチェーンのネットワークに分散的に保存されます。
スマートコントラクトは、契約内容および執行の条件を事前にスマートコントラクト内で、定義しておき、指定された条件に合致したイベントが起こると自動的にプログラムが実行される仕組みとなっていて、不可逆の性質があるため、これによって第三者機関の関与が必然ではなくなります。この仕組みは、広告や金融など様々な分野へ応用できると考えられます。
3. スマートコントラクトを実際に書くには?
イーサリアムのブロックチェーンでスマートコントラクトを書くときに一番使われているのはSolidityというスマートコントラクトのためだけに作られた言語です。
まず、IDEですが、オープンソースのRemix ( remix.ethereum.org )を使用します。
Step 1. Solidityのバージョンを指定します。
1 |
pragma solidity ^0.5.9; |
プログラムの一番上にpragmaキーワードで、どのsolidityのバージョンを指定します。現在の最新バージョンは0.5.9となっています。
Step 2. 契約を作ります。
1 2 3 |
contract TestContract{ //契約内容をここで書きます。 } |
まずは contract キーワードで契約名を書きます。(contract は他のプログラミング言語のクラスのようなものです。)
ここではとりあえず、契約名をTestContractとします。
Step 3. 契約にグローバル変数とコンストラクタを入れます。
1 2 3 4 5 6 7 8 9 10 11 |
contract TestContract { address owner; unit assetValue; bool isHappy; constructor() public payable{ owner = msg.sender; assetValue = msg.value; isHappy = false; } } |
グローバル変数として、owner, assetValue, isHappyという3つの変数を設定しました。
オーナー(owner) はブロックチェーン上ではウォレットのアドレスとなっているため、アドレス型の変数として宣言されています。そして、assetValueは資産額で、unit型はunsigned integerで、つまり正の整数しか入らない変数となっています。isHappyはownerが幸福かどうかを判断するためのboolean変数となっています。
そして、それらの初期値を設定するために、コンストラクタpayableも入れています。
コンストラクタ内のmsg.senderはビルトイン(built-in)変数で、イーサリアムのウォレットアドレス型となっています。
msg.valueもまたビルトイン変数でどれくらいのイーサリアムトークンが送られたかを確認するための変数となっています。
Step 4. Modifier を追加します。
1 2 3 4 5 6 7 8 9 |
modifier onlyOwner { require (msg.sender == owner ); _; } modifier mustBeHappy { require (isHappy == true); _; } |
Modifierとは、何かをするために必要な条件を記述するためのものです。
例えば、サッカーをやりたいとした場合、最低6人いないといけないという条件をModifier で記述することができます。
Solidityではrequireというキーワードで必要な条件を記述することができます。
最後につく ”_;” はこの条件を読んだら、実際のfunctionを読むという指示となっています。
Step 5. 友人に自分がHappyなら資産を送るfunctionを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
address payable[] friendWallets mapping (address => uint) happinessPay function setHappinessPay(address payable wallet, uint happinessPayAmount) public onlyOwner { friendWallets.push(wallet); happinessPay[wallet] = happinessPayAmount; } function pay() private mustBeHappy{ for (uint i=0; i<friendWallet.length; i++){ friendWallets[i].transfer(happinessPay[friendWallets[i]); } } function happy() public onlyOwner{ isHappy = true; pay(); } |
以上が仮に自分が幸せなら友人に仮想通貨(イーサリアム)をばら撒くスマートコントラクトとなります。
Remixでイーサリアムのテストネットワークでぜひ試してみてください。
本当のネットワークでこれをやると、後から後悔しても不可逆性から撤回することはできないので、ご注意ください。
次回はよくブロックチェーン3.0と言われているIOTAの Direct Acyclic Graph(有向非巡回グラフ)アルゴリズムの実装について紹介したいと思います。