ブロックチェーン技術を使った仮想通貨プラットフォームであるEtherReum上では、暗号通貨のトランザクションをブロックチェーンのブロックとして生成できるだけではなく、独自のトランザクションを”プログラミング”し、ブロックとして生成することことが可能です。それがスマートコントラクトです。
仮想通貨プラットフォームには、EtherReumの他に、ビットコインやリップルなど、複数存在しますが、スマートコントラクトは、EtherReumのみでしか使えません。逆に言えば、スマートコントラクトによって、他の仮想通貨プラットフォームとの差別化のポイントになっています。
■ ブロックチェーンとスマートコントラクト
ブロックチェーンでは、口座から口座へ送金することを「トランザクション」と呼んでいます。トランザクションをブロックとして生成し、ブロックチェーンにつなげるための作業を「マイニング」といいます。
トランザクションには、データと操作が含まれます。例えば、引出元の口座、振込先の口座、そして金額はデータです。それを、引出元の口座から金額を引き算し、振込先の口座へ金額を加算することが操作です。
スマートコントラクトとは、このトランザクションのデータと操作を自由に定義できるためのEtherReum上の機能です。
■ スマートコントラクトプログラミング
スマートコントラクトを自由にプログラミングするための言語が「solidity」です。JavaScriptのようなスクリプト言語です。
スマートコントラクトは、C++などのクラス定義とよく似ています。クラス名がスマートコンストラクタ名となり、それに属する変数とメソッドを定義します。
ただし、変数を更新する処理を含む更新系のメソッド、変数を参照するだけの参照系のメソッドを意識しておく必要があります。更新系のメソッドは、トランザクションを介して呼び出す必要があるからです。
以下に、簡単な例を示します。更新系の売買メソッド、それ以外は変数を返却するだけの参照系のメソッドです。
スマートコントラクトをブロックチェーンに登録するには、以下の形式に変換する必要があります。そのためのコンパイラがあり、それを使って変換します。
コンパイラは、バージョンによってsolidityの文法に違いが結構ありますので、注意が必要です。(https://solidity-jp.readthedocs.io/ja/latest/installing-solidity.html)
・JSON形式abi(application binary interface)
スマートコントラクトの各メソッドについて、引数やリターン値の定義などコーリングシーケンスをJSON形式で明記した文字列です。
・バイトコード(16進数文字列)
スマートコントラクトのソースコードをコンパイルしたバイナリです。
■スマートコントラクトをプログラムから操作する
スマートコントラクトをプログラムから操作するには、まず、EtherReumのブロックチェーンをプログラムから操作する必要があります。
そのためには、「Web3」というAPIを使い、EtherReumのブロックチェーンにアクセスするためのコマンドベースのツールである「geth」介して、EtherReumのブロックチェーンをHTTP経由でアクセスします。
準備としては、「geth」を起動する必要があります。gethがWebサーバの役割を担います。その結果、「Web3」のAPI経由でアクセスすることができます。
また、マイニングの開始(miner.start())、停止(miner.stop())もgethのコンソールから実行します。
「Web3」のAPIは、PythonやJavaScriptなどに対応しています。これらのプログラミング言語を使って、スマートコントラクトをブロックチェーンに登録し、メソッドを呼び出すことが可能となります。
1)スマートコントラクトをブロックチェーンに登録する
スマートコントラクトをブロックチェーンに登録するために、スマートコントラクト自体をトランザクションとして登録します。
スマートコントラクトをトークンとし、そのトークンを送信元(account)と手数料(gas)を指定してトランザクションを生成します。(トークンとは、スマートコントラクトのインスタンスを識別するためのデータ)
その後、マイニングによって、そのトランザクションのブロックがブロックチェーンにつなげられ、スマートコントラクトが登録されます。
2)スマートコントラクトのメソッドを呼び出す
スマートコントラクトのメソッドを呼び出す際にも、メソッド用のトランザクションを生成する必要があります。
まず、ブロックチェーンに登録済のスマートコントラクトのトークンを取得します。
更新系のメソッドの場合、そのトークンを使って、送信元の口座、手数料(gas)を指定してメソッド用のトランザクションを生成します。その後、マイニングによって、そのトランザクションのブロックがブロックチェーンにつなげられます。
参照系のメソッドの場合、トランザクションを生成する必要はなく、トークンを使って、直接、各メソッドを呼び出せます。
以下に、サンプルのスマートコントラクト(RealEstateContract.sol)のメソッドを操作するWeb3のPythonプログラムを示します。
■ スマートコントラクトの規格
EtherReumにおいてスマートコントラクトには、主に以下の規格(Ethereum Request for Comments)があります。
・ERC20
お金など数量的なものを扱うためのスマートコントラクトの規格です。以下のようなメソッド(インターフェース)があります。
totalSupply()
ブロックチェーン内の発行総量を返す
balanceOf()
アカウントの残高を返す
transfer(address recipient, uint256 amount)
アカウントへの送金
approve(address spender, uint256 amount)
他アカウントへの自アカウントの利用承認(承認する金額を指定)
transferFrom(address sender, address recipient, uint256 amount):
他アカウントへの送金(送金元のアカウント指定)
・ERC721
コンテンツなどがオリジナルであることを識別するためのスマートコントラクトの規格です。以下のようなメソッド( インターフェース )があります。
ownerOf(uint256 tokenId)
トークンIDで特定されるトークンの所有者のアカウントを返す
balanceOf(address owner)
アカウントが所有するトークンの数を返す
approve(address spender, uint256 tokenId)
トークンIDのトークンを他アカウントへ移転することを事前に承認する
transferFrom(address from, address to, uint256 tokenId)
トークンIDのトークンを他アカウントへ移転する
NFT(Non-Fungible Token:非代替性トークン)とは、ERC721に従ってスマートコントラクトのトークンのことです。
■ まとめ
EtherReumの優れている点は、最初からブロックチェーンの応用を考え、「スマートコントラクト」を機能として組み込んでいる点です。
ブロックチェーンを更新する関数呼び出し=トランザクションであり、そのためにはコスト(etherによるGAS代)が必要とされるという点も斬新です。
これまで、業務のトランザクションは、中央集権的にデータベースで管理してきました。それが、ブロックチェーンに置き換わることで、セキュリティの確保と分散管理が両立が実現されることになります。
ソフトウェア開発・システム開発業務/セキュリティ関連業務/ネットワーク関連業務/最新技術に関する業務など、「学習力×発想力×達成力×熱意」で技術開発の実現をサポート。お気軽にお問合せ下さい