pseudoyu

pseudoyu

Blockchain | Programming | Photography | Boyi
github
twitter
telegram
mastodon
bilibili
jike

Ethereumのコア技術解説

前書き#

ビットコインは分散型のデジタル通貨として非常に成功していますが、ビットコインスクリプト(チューリング完全ではなく、いくつかの簡単なロジックのみを処理できる)の制約により、非常に複雑なビジネスを処理することはできません。イーサリアムはスマートコントラクトを導入し、分散型の概念をより豊かなアプリケーションシナリオに適用することができるようになりました。そのため、イーサリアムはブロックチェーン 2.0 とも呼ばれています。本文では、イーサリアムのコアテクノロジーについて解説します。もし間違いや誤りがあれば、ご指摘いただければ幸いです。

Ethereum システム#

2014 年 1 月、ロシアの開発者 Vitalik Buterin がイーサリアムのホワイトペーパーを公開し、チームを結成しました。彼らはより汎用的なスクリプト言語を統合したブロックチェーンプラットフォームを作成することを目指していました。チームの一員である Dr. Gavin Wood は、イーサリアム仮想マシン(EVM)に関連するイエローペーパーを公開し、これがイーサリアムの誕生です。

ethereum_overview

簡単に言えば、イーサリアムはオープンソースの分散型システムであり、ブロックチェーンを使用してシステムの状態変化を保存します。そのため、「ワールドコンピュータ」とも呼ばれます。イーサリアムでは、開発者が不変のプログラムであるスマートコントラクトをブロックチェーン上にデプロイして実行することができます。これにより、さまざまなアプリケーションシナリオをサポートすることができます。また、システムリソースの消費を測定するためにデジタル通貨である「イーサ」を使用し、イーサリアムシステムの構築に多くの人々を奮起させることができます。

分散型アプリケーション DApp#

狭義には、DApp はユーザーインターフェースを統合し、スマートコントラクトをサポートし、イーサリアムブロックチェーン上で実行されるアプリケーションです。

ethereum_architecture

上記の図のように、イーサリアムアプリケーションインスタンスはブロックチェーンネットワークにデプロイされます(スマートコントラクトはブロックチェーン仮想マシンで実行されます)。Web プログラムは単に Web3.js を使用してブロックチェーンネットワークに対して RPC リモート呼び出しを行い、ユーザーはブラウザ(DApp ブラウザや MetaMask などのプラグインツール)を介して分散型サービスアプリケーションにアクセスすることができます。

レジャー#

イーサリアムブロックチェーンは分散型の台帳(データベース)であり、ネットワーク内のすべてのトランザクションはブロックチェーンに保存され、すべてのノードがデータのコピーをローカルに保存し、各トランザクションの信頼性を確保する必要があります。すべてのトランザクションは公開され、改ざんできません。ネットワーク内のすべてのノードはトランザクションを表示および検証することができます。

アカウント#

ウェブサイトやシステムにログインする場合、通常はアカウントとパスワードが必要です。パスワードは暗号化アルゴリズムによって中央集権型のデータベースに暗号文として保存されます。しかし、イーサリアムは分散型システムであり、アカウントはどのように生成されるのでしょうか?

ビットコインシステムと同様に

  1. 最初に、自分だけが知っている秘密鍵(sk)を生成し、それに対応する公開鍵(pk)を生成します。楕円曲線デジタル署名アルゴリズム(ECDSA)を使用します。
  2. 公開鍵(pk)を keccak256 アルゴリズムでハッシュ化します。
  3. 後ろから 160 ビットをイーサリアムのアドレスとして使用します。

ユーザーの秘密鍵とアドレスはイーサリアムのアカウントを構成し、残高の保存やトランザクションの発行などが可能です(ビットコインの残高はすべての UTXO を計算して得られるものであり、イーサリアムのようにアカウントに保存されているわけではありません)。

実際には、イーサリアムアカウントは 2 種類に分けられます。上記の方法で生成されるものは「Externally Owned Accounts(EOA)」と呼ばれ、外部アカウントとも呼ばれます。これは一般的なユーザーが所有するアカウントであり、イーサトークンを送受信したり、スマートコントラクトにトランザクションを送信したりするために使用されます。

もう 1 つは「Contract Accounts」であり、外部アカウントとは異なり、対応する秘密鍵は存在せず、スマートコントラクトのデプロイ時に生成され、スマートコントラクトコードを保存します。注意すべきは、Contract Accounts は外部アカウントまたは他のコントラクトからの呼び出しによってのみイーサを送受信できる点です。自分自身でトランザクションを実行することはできません。

ウォレット#

イーサリアムアカウントを保存および管理するソフトウェア / プラグインはウォレットと呼ばれ、トランザクションの署名、残高管理などの機能を提供します。ウォレットの生成には 2 つの方法があります。非決定論的なランダム生成またはランダムシードに基づいて生成する方法です。

ガス#

イーサリアムネットワーク上の操作には「手数料」が必要であり、これをガスと呼びます。スマートコントラクトのデプロイや送金には一定単位のガスが必要です。これはマイナーがイーサリアムネットワークの構築に参加するためのインセンティブメカニズムであり、ネットワーク全体をより安全で信頼性の高いものにします。

各トランザクションには対応するガス量とガス価格を設定することができます。ガス料金を高く設定すると、マイナーはトランザクションをより速く処理する傾向がありますが、トランザクションの複数回実行によるガス料金の大量消費を防ぐために、ガスリミットを設定することもできます。ガスに関する情報はEthereum Gas Trackerツールで確認できます。

If START_GAS * GAS_PRICE > caller.balance, halt
Deduct START_GAS * GAS_PRICE from caller.balance
Set GAS = START_GAS
Run code, deducting from GAS
For negative values, add to GAS_REFUND
After termination, add GAS_REFUND to caller.balance

スマートコントラクト#

先述のように、イーサリアムブロックチェーンはトランザクション情報だけでなく、スマートコントラクトコードも保存します。

スマートコントラクトはアプリケーションとトランザクションのロジックを制御します。イーサリアムシステムでは、専用の Solidity 言語を使用してスマートコントラクトを記述します。この言語は JavaScript に似た構文を持ち、他にも Vyper や Bamboo などのプログラミング言語があります。スマートコントラクトコードはバイトコードにコンパイルされ、ブロックチェーンにデプロイされます。一度ブロックチェーンにデプロイされると、編集することはできません。EVM はスマートコントラクトの実行環境であり、実行結果の決定性を保証します。

スマートコントラクトの例:クラウドファンディング#

もっと複雑なシナリオを想像してみましょう。新しい製品を開発するために 1 万ドルをクラウドファンディングしたいとします。既存のクラウドファンディングプラットフォームでは高額な手数料が発生し、信頼問題を解決するのが難しいため、クラウドファンディングの DApp を使用してこの問題を解決することができます。

まず、クラウドファンディングにいくつかのルールを設定します。

  1. クラウドファンディングに参加したい人は、10〜10000 ドルの寄付金を提供することができます。
  2. 目標金額が達成された場合、金額はスマートコントラクトによって私(クラウドファンディングの主催者)に送信されます。
  3. 一定期間(例:1 ヶ月)内に目標が達成されなかった場合、クラウドファンディングの資金は参加者に返金されます。
  4. また、1 週間後に目標金額が達成されなかった場合、参加者は返金を申請することができます。

これらのクラウドファンディングの条項は、スマートコントラクトによって実現され、公開されたブロックチェーン上にデプロイされるため、主催者であっても条項を改ざんすることはできず、誰でも閲覧することができます。これにより、信頼問題が解決されます。

完全なコードはこちらからご覧いただけます:デモ

トランザクション#

イーサリアムでは、典型的なトランザクションはどのように行われるのでしょうか?

  1. 開発者はスマートコントラクトをブロックチェーンにデプロイします。
  2. DApp はコントラクトをインスタンス化し、適切な値を渡してコントラクトを実行します。
  3. DApp はトランザクションにデジタル署名を行います。
  4. ローカルでトランザクションを検証します。
  5. トランザクションをネットワークにブロードキャストします。
  6. マイニングノードはトランザクションを受け取り、検証します。
  7. マイニングノードは信頼できるブロックを確認した後、ネットワークにブロードキャストします。
  8. ローカルノードはネットワークと同期し、新しいブロックを受け取ります。

アーキテクチャ#

ethereum_architecture_simple

イーサリアムは「Order - Execute - Validate - Update State」というシステムアーキテクチャを採用しています。このアーキテクチャでは、新しいトランザクションが生成されると、マイナーは PoW(Proof of Work)の計算を行います。検証が完了すると、ブロックはゴシッププロトコルを介してネットワークに広まります。ネットワーク内の他のノードは新しいブロックを受け取ると、ブロックを検証します。最終的に、ブロックチェーンに提出され、状態が更新されます。

具体的には、イーサリアムシステムには共識層、データ層、アプリケーション層などのコアコンポーネントがあり、以下のように相互作用します。

ethereum_architecture_concrete

上記の図のように、イーサリアムのデータは「Transaction Root」と「State Root」で構成されています。「Transaction Root」はすべてのトランザクションからなるツリーであり、「From」、「To」、「Data」、「Value」、「Gas Limit」、「Gas Price」を含みます。一方、「State Root」はすべてのアカウントからなるツリーであり、「Address」、「Code」、「Storage」、「Balance」、「Nonce」を含みます。

まとめ#

以上がイーサリアムのコアテクノロジーについての解説です。スマートコントラクトの導入により、ブロックチェーンのアプリケーションにはさらなる可能性がもたらされましたが、セキュリティ、プライバシー、効率などの課題も依然として存在します。複雑な企業向けアプリケーションシナリオには、コンソーシアムチェーンがより適しており、次回は Hyperledger Fabric について詳しく分析しますので、お楽しみに!

参考文献#

  1. COMP7408 Distributed Ledger and Blockchain Technology, Professor S.M. Yiu, HKU
  2. Udacity Blockchain Developer Nanodegree, Udacity
  3. 区块链技术与应用肖臻,北京大学
  4. 区块链技术进阶与实战蔡亮 李启雷 梁秀波,浙江大学 | 趣链科技
  5. Ethereum Architecture, zastrin
  6. Learn Solidity: Complete Example: Crowd Funding Smart Contract, TOSHBLOCKS
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。