本来の意味でのSmart Contractを実現するOpenlaw

紙とペンは時代遅れ。これからの時代、契約書はSmart Contractで署名は電子署名。デジタル化の波は法契約の世界まで押し寄せる。

# Smart Contractのオリジナル意味

本来のSmart Contractは[Nick Szabo](https://en.wikipedia.org/wiki/Nick_Szabo)によって提唱された[The Idea of Smart Contracts](https://nakamotoinstitute.org/the-idea-of-smart-contracts/)という論文に起源がある。VitalikがEthereumによって実現した。
意味を一言で説明すると「契約内容が組み込まれたソフトウェアによる、セキュアな形での契約の強制執行」具体例として車をローンで購入した場合が示されている。債務の取り立てや、契約の終結が自動かつ強制執行される。

- 債務者が車のローンを踏み倒したら、債権者に車のキーが返却される
- 債務者が車のローンを完済したら、車のキーは永遠に債務者のものになる

技術的にはEthereumで実現可能であり、Openlawがその実装例。

# Openlawとは

有名な[Consensys](https://consensys.net/)がサポートするプロジェクト。

> Openlawは契約を締結し執行するBlockchainベースのプロトコル。伝統的な契約とSmart Contractを結びつけた最初のプロジェクトである。ユーザーフレンドリーで法律に則っている。

### 課題：
- 契約文書は曖昧さを含み、訴訟問題のリスクをはらんでいる
- 署名回しに手間がかかる
- 大きな契約の監査時間とコストは膨大
- 文書の保管や輸送がセキュアでない

### 解決：
- Smart Contract(プログラム)に落とし込むことによって契約の曖昧さがなくなる
- 契約文書はテンプレート化されて、作成コストが下がる
- 電子文書のため署名回しの負担が減る
- 契約文書はBlockchain(とIPFS)上に保管され失われない。また、いつでも閲覧可能

参照: [Introducing OpenLaw](https://media.consensys.net/introducing-openlaw-7a2ea410138b)

# 使い方

### 1. 前提
- Openlawのに[サインアップ](https://app.openlaw.io/signup)済み
- SolidityによるSmart Contract開発経験がある
- MetamaskやRemix等の周辺ツールが使える

### 2. 契約文書のテンプレートを編集
テンプレートが用意されており、そこから契約文書を作成する。記述言語は`OpenLaw’s Markup Language`という。難しくはない。QiitaやWikiを編集するの感覚は変わらないはず。

一例として、Volkswagenのバスを200ETHで購入する場合を想定する。

文書としては、このようなイメージ。
<img width="698" alt="Screen Shot 2019-09-22 at 16.32.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48954/10d9ba5b-8717-a1a6-a73d-fc94a45da89e.png">

Markup Languageで表現するとこうなる。

```
\centered ** BILL OF SALE **

[[Seller Address: EthAddress]] (“Seller”) agrees to sell a [[Purchased Item]](The 
“Item“), and [[Buyer Address: EthAddress]] (“Buyer”) agrees to pay [[Purchase Price: Number]] 
dallars for the Item.

SELLER:
[[Seller Signatory Email: Identity | Signature]]
________________
BUYER:
[[Buyer Signatory Email: Identity | Signature]]
________________
```

`[[Purchased Item]]`はVolkswagenが入るフィールドで、`[[Purchase Price: Number]]`は200が入るフィールド。

"dallars"を"ETH"に変更する等の必要な編集を終えたらテンプレートを保存する。

### 3. 契約文書の作成

先ほど編集したテンプレートから契約文書を作成する。といっても空欄を埋めるだけ。

<img width="688" alt="Screen Shot 2019-09-22 at 16.49.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48954/4462e4f0-868f-7e04-3290-2cfa356cf47d.png">

必要事項を記入したら、売り手と買い手にメールを送信。署名を要求する。

### 3. 契約の締結
双方が署名すれば、契約締結。このような画面。

<img width="694" alt="Screen Shot 2019-09-22 at 17.03.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48954/9acb7182-bd4a-a292-a380-b97662e4762e.png">

### 4. ブロックチェーンを使う場合
先ほどはSmart Contractを使っていないが、今回は使う。Blockchainを使うことで支払いの自動執行が可能になり、契約の記録が失われない。

Smart Contractはこのようなイメージ。`recordContract`関数の実行によって契約書が作成され、`confirmReceipt`関数の実行によって、支払いが執行される。トランザクションの署名はMetamask等を使う。

<img width="636" alt="Screen Shot 2019-09-22 at 17.18.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48954/757fb2c7-1303-85f4-42f3-c5768764681f.png">

デプロイしたらSmart ContractをMarkup Languageに紐付ける。

```
[[@Purchase Price in Wei = Purchase Price * 1000000000000000000]]

[[
  Record Contract:EthereumCall
  (
    contract:”0xe4A87aaF8134e473976Fc04b68dBd5B9A5bd139C”;
    interface:[ { “constant”: false, . . . “type”: “function” } ];
    function:”recordContract”;
    Arguments: Purchased Item, Purchase Price in Wei, Seller Address, Buyer Address
  )
]]
```
`EthereumCall`が肝。Smart ContractのアドレスやInterfaceを記入する。この関数を実行するときは`[[Record Contract]]`を使う。


参照: 
[OpenLaw Tutorial: Blockchain-Enabled, Legally Enforceable Smart Contracts](https://medium.com/@OpenLawOfficial/openlaw-tutorial-blockchain-enabled-legally-enforceable-smart-contracts-24d5654050fa)
[OpenLaw - Safe Demo](https://www.youtube.com/watch?v=ySIsxEl5yME)

# ステーブルコインのDaiをサポート
Crypto Currencyバックのステーブルコインとして有名な[MakerDAO](https://makerdao.com/en/dai/)のDaiをサポートしている。Fiat Currencyバックじゃない点で個人的に信頼性を疑問視していた。しかし、　ここ一年(2019年)の価格遷移を見る限り、概ね1USDに追従している。すごい。

<img width="745" alt="Screen Shot 2019-09-22 at 18.06.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48954/e73acd98-0c95-87cf-b92b-b4ca7bf3cdfc.png">

ETH価格のボラティリティは長期契約の締結にとって大きなリスク。ステーブルコインのサポートが普及を後押しすることは間違いない。

参照： [Turning DAI into a Global Currency: Using DAI as the Medium of Exchange of Choice for On-chain Financial Transactions on OpenLaw](https://medium.com/@OpenLawOfficial/turning-dai-into-a-global-currency-using-dai-as-the-medium-of-exchange-of-choice-for-on-chain-329b8afec3b3)

# 実装例（LAO）
LAOを一言で言うと、法律に準拠した[DAO](https://blockchainhub.net/dao-decentralized-autonomous-organization/)。ハッキングされてしまい悪名高いDAOだが、プロジェクトとしては非中央集権で自立的な組織を目指すもので、Blockchainの王道をゆくものであった。分散型のファンド運営のコンセプトについては革新的であり、LAOはそれに法律面を加味している。スタートアップが資金調達をし、米国のデラウェア州に法人を設立するための契約周りの手続きが可能。参加メンバーに見返りを分配し、投票によって意思決定を行う等の組織運営用の機能も備えている。

参照: 
[The LAO: A For-Profit, Limited Liability Autonomous Organization
](https://medium.com/openlawofficial/the-lao-a-for-profit-limited-liability-autonomous-organization-9eae89c9669c)[LayerX Newsletter for Tech (2019/08/26–09/01)](https://layerxnews.substack.com/p/layerx-newsletter-for-tech-201908260901?token=eyJ1c2VyX2lkIjoyNzQ5MjA3LCJwb3N0X2lkIjoxMTU4OTUsIl8iOiJTZ2xwaSIsImlhdCI6MTU2OTA2NDAzNCwiZXhwIjoxNTY5MDY3NjM0LCJpc3MiOiJwdWItMTA3OTQiLCJzdWIiOiJwb3N0LXJlYWN0aW9uIn0.DhzF7_iiVumhvIr9EhgAKt9rR2XifztRhs-WXNGyGkU)

# Relayerという存在
RelayerはSmart Contractを定期的に実行するcronのような存在。Blockchainはプログラムを定期実行する機能はサポートしていないが、実際のビジネスでは求められる場合が多く、そのためにRelayerが存在する。

実装例がこれ

```
[[Pay Vendor:EthereumCall(
contract:"0xe532d1d1147ab40d0a245283f4457c733b5e3d41";
interface:[{"name":"makePayment", "type":"function","inputs":
[{"name":"RecipientAddress", "type":"address"},
{"type":"uint","name":"PaymentInWei"}],"outputs": []}];
function:"makePayment";
arguments:Recipient Ethereum Address,Payment in Wei;
startDate:Payment Start Date;
endDate:Payment End Date;
repeatEvery:"1 minute")]]
```

`makePayment`関数の引数に注目。`repeatEvery`で定期実行間隔を指定する。`2 minutes 30 seconds`このように秒単位で指定することも可能。

実際に定期実行するのは[Open Law VM](https://docs.openlaw.io/openlaw-core/#vm)。基本的にOpenlawのコントラクトはここで実行されるようだ。

参照: [Relayer Overview](https://docs.openlaw.io/relayer/#how-it-works)


# Oraclesという機能
Smart ContractのEventをトリガーにSmart Contractを実行してくれる機能。

例)
`StopContractOracle` : コントラクトを停止する
`ResumeContractOracle ` : コントラクトの実行を再開する
`OpenlawSignatureOracle ` : `SignatureEvent`タイプのイベントをトリガーに署名を実行する 

参照: [Oracles](https://docs.openlaw.io/openlaw-core/#oracles)

# Openlawが普及した世界を想像してみる
複雑な契約プロセスが一気通貫に流れるように執行される。人の仲介なしに自動執行されるので、人件費がかからない。また、金融機関を介さないので、基盤構築コストが下がる。そして、決済スピードが早い。加えて、契約内容は改ざん困難な形でBlockchain上に記録されるので、安全だ。

例えば、生損保業界。契約管理は中核をなす重要業務プロセスである。これが自動化されたら、人件費が大幅に削減されるはずだ。それに伴い保険料も下がるはずなので、ユーザにとってもメリットが大きい。保険料の支払いも受け取りもスムーズだ。

そして、不動産業界。まず、不動産の所有権は公開管理台帳としてのBlockchain上に登録されていて明瞭だ。そして、権利の委譲もセキュアで簡単。複雑な契約プロセスを踏む必要はない。不動産を証券化が低コストで実現し、マイクロ単位の決済が可能となる。一般投資家が気軽に不動産オーナーを名乗れるようになる。また、賃貸契約プロセスも自動化され、わざわざ店舗に訪れる必要はなくなるはずだ。


参考: [LayerX Newsletter for Biz (2019/08/05–08/11)](https://layerxnews.substack.com/p/layerx-newsletter-for-biz-201908050811?token=eyJ1c2VyX2lkIjoyNzQ5MjA3LCJwb3N0X2lkIjoxMDQ1MzIsIl8iOiJTZ2xwaSIsImlhdCI6MTU2OTA2NDA2OCwiZXhwIjoxNTY5MDY3NjY4LCJpc3MiOiJwdWItMTA3OTQiLCJzdWIiOiJwb3N0LXJlYWN0aW9uIn0.NuuYECkflQZCoUIGN_gFYHr5F3GwXvA6b6j8uBF74Hs)

# まとめ
Smart Contractの本来の意味に沿っているプロジェクトがついに出てきた感。理想と現実のギャップを埋めるため`Oracle`や`Relayer`を使う等、現実的な方法を模索している。今後、ますます発展してゆき、向こう数十年のデファクトスタンダードになるかもしれない。多少強引でも機会を作って、実際に使ってみたい。