ブロックチェーン

スマートコントラクト

投稿日:2021年7月10日 更新日:

ブロックチェーン技術を使った仮想通貨プラットフォームであるEtherReum上では、暗号通貨のトランザクションをブロックチェーンのブロックとして生成できるだけではなく、独自のトランザクションを”プログラミング”し、ブロックとして生成することことが可能です。それがスマートコントラクトです。

仮想通貨プラットフォームには、EtherReumの他に、ビットコインやリップルなど、複数存在しますが、スマートコントラクトは、EtherReumのみでしか使えません。逆に言えば、スマートコントラクトによって、他の仮想通貨プラットフォームとの差別化のポイントになっています。

■ブロックチェーンとスマートコントラクト

ブロックチェーンでは、口座から口座へ送金することを「トランザクション」と呼んでいます。トランザクションをブロックとして生成し、ブロックチェーンにつなげるための作業を「マイニング」といいます。

トランザクションには、データと操作が含まれます。例えば、引出元の口座、振込先の口座、そして金額はデータです。それを、引出元の口座から金額を引き算し、振込先の口座へ金額を加算することが操作です。

スマートコントラクトとは、このトランザクションのデータと操作を自由に定義できるためのEtherReum上の機能です。

■スマートコントラクトプログラミング

スマートコントラクトを自由にプログラミングするための言語が「solidity」です。JavaScriptのようなスクリプト言語です。

スマートコントラクトは、C++などのクラス定義とよく似ています。クラス名がスマートコンストラクタ名となり、それに属する変数とメソッドを定義します。
ただし、変数を更新する処理を含む更新系のメソッド、変数を参照するだけの参照系のメソッドを意識しておく必要があります。更新系のメソッドは、トランザクションを介して呼び出す必要があるからです。

以下に、簡単な例を示します。更新系の売買メソッド、それ以外は変数を返却するだけの参照系のメソッドです。

[RealEstateContract.sol]

スマートコントラクトをブロックチェーンに登録するには、以下の形式に変換する必要があります。そのためのコンパイラがあり、それを使って変換します。
コンパイラは、バージョンによって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のコンソールから実行します。

[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に従ってスマートコントラクトのトークンのことです。

-ブロックチェーン

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

PythonによるWeb3とNFT(ERC721)

ERC721に準拠したスマートコントラクト(NFT(Non Fragile Token)と呼ばれる)をSolidity言語を使ってプログラミングし、PythonのWeb3から以下を実施します。①コンパ …

決済とブロックチェーン

モノを買う時、お金を支払う行為を「決済する」と言います。決済とは、お互いに合意して決めた量の自分のお金を他人に引き渡すことです。意思決定と口座から口座へ資金を移動する業務が合体した言葉です。決済者とは …