前提知識集
1. 目次
- 前提知識集とは
- 前提知識(50音順)
- Blockchainの概要
- ECDSA
- EIP2612
- EIP3009
- EIP712
- ERC20
- Oracles
- Solidity
- Upgradeability
2. 前提知識集とは
JPYC研究開発チームの記事を読む上で必要な前提知識を集約する記事です!基本的に公式ドキュメント、公式サイトから引用しています。自社記事もリンク付けしていく予定です。(どんどん更新していきます!)
3. 前提知識
Blockchainの概要
ブロックチェーンはビットコインの誕生によって出現した言葉です。Wikipediaによると、ブロックチェーンは「2つの当事者間の取引を効率的かつ検証可能で恒久的な方法で記録することができるオープンな分散型台帳」です。これにより、次から次へとイノベーションがおきて、イーサリアムの誕生によりスマートコントラクトのようなトラストレス(カンターパーティリスクが除去された)なシステムが形成されて、手数料をとるミドルマンの除去、ひいては人間社会の協力関係まで一変させる可能性があると言われています。また、ブロックチェーンがweb3.0のベースレイヤーとも呼ばれたりします。
ECDSA
デジタル署名アルゴリズムの一つでイーサリアムにおいてハッシュメッセージの身元の検証に使われています。EVMオペコード自体に検証できるものが用意されていますが、メッセージに対して署名が一意である制約がないため、OpenZepplinのライブラリを使用した方が安全です。
ECDSAライブラリ OpenZeppelin公式ドキュメント
楕円曲線DSA wikipedia
ecrecover solidity公式ドキュメント
Verifying Signature Solidity by Example
EIP2612
ERC20トークンの一般的な移転方法にapprove
とtransferFrom
の組み合わせがあります。これの相互作用により、EOA間に留まらないアプリケーション固有のトラストレスな取引を可能にしています。ただし、これらのトランザクションは通常、ユーザのEOAによって実行される必要があります。そこでEIP2612では新しい関数permit
を用意し、ユーザーがトランザクションを実行することなく、EIP712に準拠した署名だけでapprove
することを可能にします。
EIP-2612: permit – 712-signed approvals ethereum.org
ERC20Permit OpenZeppelin公式ドキュメント
EIP3009
EIP2612と機能は似ていますが互換性を最大化するために、コントラクトにはEIP2612とEIP3009の両方を実装することが望ましいです。EIP2612との違いはEIP2612がシーケンシャルナンスを使用するのに対しEIP3009ではランダムな32バイトのナンスを使用する点と、EIP2612ではapprove
とtransferFrom
のパターンに依存している点です。シーケンシャルナンスは複数のトランザクションを同時に作成できない問題があり、approve
とtransferFrom
のパターンはMultiple withdrawal attackの影響を受けやすいという問題があったのでEIP3009ではそれらに対応しました。
EIP-3009: Transfer With Authorization ethreum.org
EIP712
構造化データのハッシュ値を求める標準規格です。エンコーディング関数の正確さのための理論的フレームワークで、Solidity構造体に類似し、EVMでのハッシュアルゴリズムに最適化されています。ただし、リプレイ攻撃の対策はしていません。
EIP-712: Ethereum typed structured data hashing and signing ethereum.org
EIP712 OpenZeppelin公式ドキュメント
ERC20
代替可能トークンの標準規格です。ERC20トークンと呼ばれるにはERC20で定められている全てのメソッドとイベントを用意しなければいけません。なお、ERC20には受信したERC20トークンを操作できないコントラクトにも送信できてしまう問題があり、その問題を解決するためERC223やERC777といった新しい標準規格が提案されています。
ERC20 TOKEN STANDARD ethreum.org
EIP-20: Token Standard ethereum.org
ERC20 OpenZeppelin公式ドキュメント
Oracles
オラクルを一言でいうと、「ネットワークの外にあるオフチェーンのデータを、ネットワーク上のオンチェーンに持ってくる仕組み」です。
よく使われるオラクルですが、その中でもchainlinkがよく名前が上がります。chainlinkは外部のデータソースを分散化してインセンティブを与えた上でオラクルの仕組みや信頼を築いています。現在のブロックチェーンのdAppsの世界においてはなくてはならない存在と言っても過言ではありません。
オラクルについて hashhub記事
Chainlink 公式Doc
Solidity by Example Chainlink使い方
オラクルChainlinkの使い方 記事
Solidity
Solidityはスマートコントラクトを実装するためのオブジェクト指向の高級言語です。SolidityはEVMをターゲットにC++、Python、JavaScriptの影響を受け、設計されています。基本的な文法は公式ドキュメントに載っていますが、サンプルコードはOpenZeppelinのGitHubやSolidity by Exampeleが参考になると思います。なお、バージョンの違いはSolidity Blogで確認できますが、基本的には最新版が推奨されています。
Solidity Solidity公式ドキュメント
All Releases posts Solidity Blog
Upgradeability
アップグレード可能なスマートコントラクトはコントラクトアドレス、ステート、バランスの状態を維持しながら、コードを変更することができます。それにより、新しい機能を追加したり、本番環境で見つかったバグを修正することができます。
アップグレード可能なスマートコントラクトはproxy
コントラクトとimplementation
コントラクトの二つで構成されており、proxy
コントラクトは全ての呼び出しをimplementation
コントラクトに委任するだけの単純なコントラクトです。その呼び出しの際に使用されるdelegatecall
ですが、呼び出したコードの実行を、呼び出し元のコンテキストで行われるという特徴があり、それにより、proxy
コントラクトが状態を保存しimplementation
コントラクトがコードを提供することを可能にしています。
もちろん、改ざん不可能とされるスマートコントラクトを変更可能にしたので賛否両論はあります。伝統的な契約の場合、もし両者が後で同意すれば変更可能なのと同じように、スマートコントラクトも変更できるようにしたらどうなのかという発想から来ています。
Proxies OpenZeppelin公式ドキュメント
The State of Smart Contract Upgrades OpenZeppelin公式ドキュメント
Upgerading smart contracts OpenZeppelin公式ドキュメント
まとめ
日本初のブロックチェーン技術(ERC20)を活用した日本円ステーブルコインJPYCはこちらから購入できます!
JPYC社はブロックチェーンエンジニアを募集中です!こちらからご応募お願いします!(タイミングにより募集を行なっていない場合があります)
また、ラボ形式でブロックチェーンに関する講義をしているJPYC開発コミュニティにも是非ご参加ください!
Discussion