6
フォロー
792
フォロワー

ブロックチェーンとイーサリアム入門

作成日:: 2016-05-05 17:31:57, 更新日:: 2016-05-05 17:32:31
comments   3
hits   2492

ブロックチェーンのスライドは,

この記事は,私が3月下旬にLeanCloudで行った技術共有の記事からまとめられ,読者は暗号の基礎知識とBitcoinの実装に関する初見の知識を持っていることを前提としています.

ブロックチェーンは HashTree (散列樹) の1つと考えられるので, HashTree と似た性質がある:

blockchain-hash-tree

写真素材:<http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

つまり,木形の構造では,各末端のノードには散列値があり,非末端のノードの散列値は,そのすべての直接子ノードの散列値から得られ,したがって,各ノードは,直接または間接的にそのすべての子ノードの情報を含んでいる.したがって,任意の末端のノードの散列値が変われば,そのすべての父ノードの散列値も変化し,根のノードも必ず変化する.

HashTreeのアプリの”100%の準備金証明”は”ゼロ知識の証明”のカテゴリーに属します. Bitcionの所有者が取引を行うためにビットコインを取引所に預ける必要があり,理論的には取引所はそのお金 (すべてのユーザーの預金口座の残高) をそのために使えます.

blockchain-proof-of-reserves

写真素材:<http://blog.bifubao.com/2014/03/16/proof-of-reserves

端末のノードがすべてユーザーを代表するハッシュトリーを作ることができます.Σ) とユーザID (例えばメールアドレス) の散列 (h),父ノードには子ノードの余剰の合計が含まれています.sum) とすべての子ノードの散列情報hash) ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙ ゙

このようにして,各ユーザに表示される情報は,独自の情報と,集積された情報のみであり,各ユーザは,他の余剰値が知られずに,自分の余剰値がルートノードに含まれていることを確認することができます.上図に小さなエラーがあります.h理由はe4df9d12このノードは,ユーザを代表するエンドノードではなく,集積された情報ノードであるべきです (このノードは,3333の余剰を持つユーザと,0の余剰を持つ仮想ユーザを含むことができます) あるユーザのプライバシー情報を漏らさないようにするためです.

ブロックチェーンのアプリケーションの例として,Gitは,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションを,Gitのアプリケーションに,Gitのアプリケーションを,Gitのアプリケーションに,Gitのアプリケーションを,Gitのアプリケーションに,Gitのアプリケーションを,Git

blockchain-git-objects-example

写真素材:http://gitbook.liuhui998.com/1_2.html (GPL v2)

Gitでは,ファイル (Blob),インデックス (Tree),またはコミット (Commit) のいずれにも,その内容によって決定されるハッシュがあり,二つのオブジェクトが同じ内容を持つ場合,同じハッシュがあります.Gitでは,倉庫全体の歴史はブロックチェーンです.各Commitはブロックに相当します.Commitには,前回のCmitのハッシュと,この変更に関連したオブジェクトのハッシュが含まれています.Commitのハッシュは,その内容とこれらの情報によって決定されます.

Gitは,ブロックチェーンを使って,リポジトリに単一のヒストリーを設定します. もし1つのCommitが変更されれば,その後のすべてのCommitのハッシュが変更されます. もちろん,Gitはバージョン管理ツールなので,ヒストリーを修正することはできません.push --force編集は,共同執筆者全員に知られることになる.

ブロックチェーンのもう1つの古典的な応用はビットコインで,この概念はこれまでずっと存在してきたが,ビットコインがブロックチェーンの言葉を広めたのだ.

blockchain-bitcoin-block-data

写真素材:https://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

ビットコインでは,各ブロックは一連のトランザクションと前のブロックのハッシュを含み,ブロック全体が分散された単一の帳簿を形成する.新しいブロックは10分ごとに作られ,ブロックが作られれば永遠にブロックチェーンに残るため,ブロックは取引の順序を固定し,取引の順序を保持し,取引を開始するのに十分な余剰があるかどうかを判断する.

Bitcoin

この記事の最初の部分は,Bitcoinについて簡単に説明します.

ビットコインにおけるブロックの生成は”作業量証明”によって実現される.つまり”,マイニング”に参加するすべての”マイナー”は,計算力と関連した,ランダムな性質の散列計算を行い,特定の条件を満たすランダムな数値が計算されるまで,ブロックを発行する権利を得る.

定義では,それぞれのマイナーは常に”最も長いチェーン”を信頼し,知られたルールを満たす最も長いチェーンに基づいて次のブロックを計算します. そうしないと,あなたの計算力は無駄に浪費されます.

ビットコインは10分ごとに新しいブロックを生成するように設計されており,この時間は,皆が共同で過去数ブロックの間隔を観察して,次のブロックの生成条件の難易度を調整することで実現されます.

通常,Bitcoinの各ノードは,取引が合法であるかどうかを確認するために完全なブロックチェーンデータを保存する必要があります.しかし,現在,完全なブロックチェーンには66Gがあり,毎日約0.1Gの速度で成長しています.Bitcoinの各ユーザが完全なブロックチェーンを保存することを要求した場合,それは過度に苛刻ではありません.Bitcoinは,SPV,簡略化された支払い検証の仕組みを持っているため,いわゆる軽量な”クライアント”は,完全なブロックチェーンを保存しないことを選択できます.

blockchain-bitcoin-state-machine

写真素材:<https://github.com/ethereum/wiki/wiki/White-Paper

  • ブロックチェーンの帳 の状態変更のログ
  • トランザクション トランザクション トランザクション トランザクション トランザクション トランザクション
  • ブロック:現状に関する”合意”

実際には,ビットコインのブロックチェーンを”状態マシン”として考えることができます. ブロックチェーン全体が状態の”帳簿”であり,その中で各取引の記録が保存され,これらの取引記録に基づいて,その全体の帳簿の”状態”を計算できます. つまり,ビットコインネットワークの各アカウントのバランスがどの程度であるかを計算できます.

Alt Coin

ビットコインの基礎から,他の多くの暗号通貨が生まれ,通常は”Alt Coin”と呼ばれ,通常は2つの実装があります.

第”つは,Bitcoinとは独立した独自のネットワークを使用することです.その利点として,Coinは独自のプロトコルやルールを非常に柔軟に設計できます.しかし,Bitcoinと同等の数のユーザーを獲得することは困難ですので,悪意のある攻撃に対する防御力は非常に弱いでしょう.

2つ目は,Bitcoinのネットワークを使用して”メタプロトコル”を実装し,Bitocinのトランザクションの上にカスタマイズされた情報を添付して,自身のロジックを実装する.このような利点は,Bitcoinのコンピューティングの規模を利用して攻撃を防御できるが,同時に,Bitcoinのネットワークに依拠しているため,すべての鉱夫が山形貨幣のルールを遵守するわけではないので,規則に合わないブロックがブロックチェーンに入ることを防ぐことはできず,規則に合わない取引をクライアントでフィルターするだけで,前述のBitcoinが提供する簡素化された確認機能を利用することもできません.

これらの偽造通貨については,Bitcoinは,大規模な悪意のある攻撃に抵抗する,多くの鉱夫が関与するブロックチェーンを提供し,Bitcoinのトランザクションにはカスタマイズされたデータも搭載できます.

Bitocinは,その1つを提供している.Bitcoin Scriptより複雑なトランザクションを実現するために使用されます.しかし,これはビットコインの核心機能ではないため,比較的単純な操作しか実行できず,ブロックチェーン上のデータを非常に限られた範囲でしか読み取ることはできません.また,循環機構の欠如のために,一般的な,チューリンの完全なロジックを書くことは困難です.

Ethereum

blockchain-ethereum

写真素材:https://www.ethereum.org/assets (CC 3.0)

“Ethereum (エーテル) “は,ブロックチェーンベースの分散型アプリケーションプラットフォームで,Bitcoinのインフラストラクチャを,暗号学に基づくブロックチェーン技術で,一般的なプラットフォームとして構築し,Bitcoinネットワークの欠けている機能を補足し,開発者が独自の分散型アプリケーションをブロックチェーン上で実行できるようにする.

Ethereumについて詳しく説明する前に,私が考える分散型ネットワークの2つの基礎を紹介しましょう. 暗号学と博学. 暗号学は,公鍵暗号化,デジタル署名,散列,抽出アルゴリズムによって数学的にセキュリティを保証するだけです. 博学は,分散型ネットワークでは,悪意のある攻撃を望む人を含む,誰でも参加することができます.

しかし,デジタルの世界では,データを公開することはコストがなく”,利益”と”損失”が考えられないので”,利益”を定義するには,物理世界と何らかのつながりを構築する必要があります.例えば,Bitocinネットワークでは,攻撃者がBlcokchainの方向性を人工的に変更したい場合は,他のすべての鉱夫よりも高いコンピューティングパワーを持つ必要があります.

つまり,分散型ネットワークでは,すべての問題が”技術”によって解決されるわけではない.技術が到達できない部分では,利益,経済インセンティブによって解決しなければならない.また”,経済インセンティブ”の必要性のために,Ethereumにもウォレットシステム (通貨単位は”Ether (エーテル) “と呼ばれる) があり,各ユーザーはウォレットアドレスを唯一の識別として持っており,この点ではBitcionと類似している.

“Contract (契約) “はEthereumが導入した最も重要な概念である.Bitcoinでは,すべてのアドレスは1人のユーザーに属している.しかし,Bitcoinでは,すべてのアドレスは1人のユーザーに属している.しかし,Bitcoinでは,すべてのアドレスは1人のユーザーに属している.しかし,Bitcoinでは,すべてのアドレスは1人のユーザーに属している.しかし,Bitcoinでは,すべてのアドレスは1人のユーザーに属している.

  • ブロックチェーンの入力と出力のみで,計算は繰り返される.実際には,計算の結果は,いつでも再計算できるので,ブロックチェーンの上に保存する必要はありません.
  • 他のコントラクトの関数 (他のコントラクトのコードとデータもブロックチェーン上に存在する) を呼び出すことができます.
  • 実行の過程で新しい取引が作成され (自分の財布のバランスを操作する) 取引は,他のContractを実行する可能性があります.

まず,Ethereumの公式クライアントには,複数人のウォレットを作成する機能があります.

blockchain-ethereum-multi-sig-wallet

図のように,この機能によって,他の2人の共同所有者のウォレットアドレスを作成することができ,それぞれが1日最大100エーテルを使用し,この制限を超えれば,他の人の同意を得なければなりません.

この機能は実際にContractを作成し,上記のロジックはContractのコードで記述されます.あなたがこの共有財布から支払いをしたいとき,あなたはこの共有財布にメッセージを送信する必要があります ((取引はメッセージであり,取引金額はゼロで,データのみを運ぶことができます),そして共有財布のコードが実行され,この支払いの要求が上記のロジックに適合する場合は,実際の支払いの取引が開始されます.

もう一つの例は”ヘッジコントラクト”で,ビットコインはデジタル通貨として,その通貨価値 (および法的な通貨の為替レート) が不安定で,しばしば1日の間に通貨価値が倍増または倍増する状況が起こりますが,もしContractを使ってヘッジコントラクトを実現すれば,この問題はある程度解決できます.

通貨の値が変わらないことを望む人を”リスク回避者”と呼び,通貨の値が変動するリスクを背負い,そこから利益を得ようとする別の人を”リスク承担者”と呼び,彼らは金額 (例えば1000 CNY) と時間枠 (例えば1ヶ月) を契約し,Contract を作成します.

  • リスク回避者は,Contractのウォレットアドレスに1000 CNYのEtherを送信し,リスク承担者は,Contractに1000 CNY (またはそれ以上) のEtherを送信し,Contractを履行する.
  • 1ヶ月後,リスク回避者は,Contractから当時1000 CNYの価値のイーサーを取り戻すことができるが,イーサールとCNYの為替レートに関係なく,残りのイーサーはリスク承担者に取り戻される.

エーテルの価値が上がれば,リスク承担者は利益を得,エーテルの価値が下がれば,リスク承担者は損をするが,リスク回避者は決して損しない.当然,リスク回避者とリスク承担者は,リスク回避者が支払う必要となる”保険料”を事前に合意することができる.また,リスク承担者は,1000 CNYの倍数以上の保険を提供する必要があることも合意することができる.

上記の例では,エーテルと暗号通貨の間の交換率をどのように決定するかという問題も解決されていません. 前述したように,Contractはブロックチェーン上のデータしかアクセスできません. 暗号通貨は暗号世界のデータではなく,物理世界のデータです.

別のContractを設計して,Etherと法定通貨の交換率を,実世界から,各時間 (例えば1時間) で,次のように指定できます.

  • 契約者は保証金を支払って 交換レートを提示できます
  • タイムウィンドウの終わりに,Contractは所有者が提供する為替レートの平均値を計算し, (保証金で加算した) 公開する.
  • 集めた保釈金は, (保釈金加減で) 平均値に最も近い25%の人たちに分配されます.

任意の参加者にとって,他の参加者の出札を知らずに,真実の為替レートを提出すると,報酬を得る可能性が高くなり,非常識な為替レートを提出すると,保証金を失う可能性が高くなります.

もちろん,この規則にはいくつかの漏れがあります.例えば,人が非常に多くの保証金を持っている場合,彼は平均値を実際の為替レートよりも高いまたは低い価格に引き上げることができ,同時に賞金を獲得し,正確な為替レートを提供した他の何人かの人を保証金を失うことができます.しかし,実際には,現実世界でも同じです.もしあなたが非常に多くのお金を持っているなら,商品の価格を上昇させまたは抑制することもできます.しかし,現実世界と比較して,電子通貨の体積は非常に小さいので,多くのお金を必要としません.しかし,実際には,このような悪意のある高額化または圧迫は,非常に大きなリスクがあります.なぜなら,あなたが支払っている保証金がいくらかわからないので,一度失敗すると,すべての保証金を失うでしょう.

もう”つの漏れは,誰もがContractに保証金を支払って,取引の為替を提供できるというステップです. 取引は取引の作成によって実現され, すべての取引はブロックチェーンに書き込まれます.

前にも述べたように,Contractはブロックチェーン上のデータを読み取ることができます. しかし,ブロックチェーン上のデータは固有です. ギャンブルのようなアプリを導入したい場合は, ランダムな数字をどこから入手しますか?

考えられるランダムな数の源は次のブロックのハッシュであり,ほとんどの場合,この程度のランダム性は十分である.しかし,実際には鉱夫は,このランダムな数をある程度操作することができる.ある賭博に参加した鉱夫を想定して,賭博の収益がブロックを掘り出すよりも大きいと仮定すると,もし鉱夫が,自分自身を賭博のブロックを失うことになるブロックを掘り出した場合,明らかに鉱夫は,この新しいブロックを公開しないことを選択する.これは,個々の鉱夫の計算力が強くなれば,より顕著である.

したがって,交換比率の徴収に似たメカニズムを導入して,ランダムな数の種を徴収し,各時間ウィンドウの終わりにそれらの種を使って,ランダムな数を計算し, 交換比率の徴収を行う必要があります. しかし,交換比率の徴収と同様に,参加者は取引を作成することで交換比率を提出するので,各人の提出したランダムな数は,時間ウィンドウの間,他のすべての人に可視です.

種子採集の窓を2つに分けることが必要であり, ランダムな数値を得るために,誰も予測し,介入することができません.

  • ステージ”では,誰もがContractに保証金を支払って”ランダムに選択された種子の散列値”を提供できます.
  • ステージ2 ステージ1の参加者は,未散播の種をContractに提供します.
  • ステージII終了:Contractは,すべての合法的な種子を散列し,ランダムな数のセットを生成し,公開する.ステージIIで正しい種子を提供した人の保証金に戻る.

第”段階では,他の人の提出した種子の散列値しか知らず,実際の種子を知らず,その結果に干渉するために精密に種子を構築することはできません. 第2段階では,すべての人が第1段階の提出の種子を確認しているだけで,新しいものを提出することができず,他の人の提出を阻止することもできません.

前述したBitcoin Scriptは,ループ,リクルージョン,ジャンプなどの能力を提供していない.おそらくBitcoinは,Bitcoin Scriptの実行時間をコントロールする考えのためである.なぜなら,チューリンの”停止定理”によれば,チューリンの完全なプログラミング言語で書かれたプログラムは,常に静的分析の観点からのみ,それが有限なステップの後に終了するかどうかを判断することができないため,これに依存する悪意のある攻撃者は,死循環を引き起こすトランザクションを構成して,鉱夫の正常な作業を妨害することができる.

Ethereumは再び”経済インセンティブ”によってこの問題を回避し,Contractはopcode (操作コード) の形で,EVM (イーサリアム・バーチャル・マシン) という仮想マシン上で動作する.EVMは自作の”計算”の仮想マシンであり,EVMの標準では,オペレーションに必要なメモリとCPU時間に応じて,opcodeが消費する Gasを定義する.これは,エーテルが購入する計算資源である.前述の通り,取引の目標はContractであるとき,Contractの代数は実行され,取引の開始者は,Contractの実行過程で消費される Gasの支払いを必要とし,同時に”最大限のガス量を支払う意向がある”と宣言し,Gasが途中で使用されれば,Contractの実行は停止される.

そして,この”コンセンサス・インターフェース”について,Bitcoinは10分ごとに新しいブロックが作られ,ネットワーク全体で10分ごとに”コンセンサス”が作られるので,通常,Bitcoinの取引は10分後に確認されるので,計算力があまり高い初期の段階で,おそらく1時間ほど待たされるので,この取引は信頼できると考えられるでしょう.

明らかに,より短いコンセンサスの時間は,ユーザーにとってより良い経験をもたらすだろう.なぜビットコインはブロックの時間を短縮しないのか?それは,より速いコンセンサスの間隔が”中央集権鉱池”の優位性を一定程度に増加させるからである.いわゆる”鉱池”は,ビットコインの鉱夫が集まって鉱山を掘り,鉱夫は無条件に鉱池の指示に従うことを意味し,最終的に鉱池と収益を分け合うことを約束する.明らかに,ビットコインは,分散型システムとして,このような中央集権鉱池が追加の優位性を望まない.

鉱夫Aが新しいブロックを掘ったとき,彼はそのブロックを放送し,他の鉱夫は,このニュースを受け取るとすぐに,この新しいブロックに基づいて作業を開始する.他の鉱夫は”,Aが新しいブロックを掘った”と”Aのメッセージを受け取った”の間の時間の計算が実際に無駄にされ,中央集権鉱池の他の鉱夫は,新しいブロックの情報をより早く得ることができ,すぐに新しいブロックに基づいて作業を開始するので,この問題は起こらない.

blockchain-ethereum-without-uncles

この放送の時間は,数秒かかることもあるが,10分という点ではそれほど重要ではないが,合意の間隔を短くすれば,中央集権鉱池の優位性はますます明らかになるだろう.しかし,Ethereumは”Uncle Block”の概念を導入することで,この問題を解決し,合意の間隔を15秒に短くし,決済確認の速度においてBitcoinに大きく改善した.

ビットコインのブロックチェーンでは,ブロックには父ブロックと子ブロックしかあり得ない.しかし,イーサリアムでは,新たに生成されるブロックには父ブロックといくつかの叔ブロックがある.上記の例に戻ると,もしAが新しいブロックを掘ったが,他の者はまだ放送の時間を受け取っていない場合,もし誰かが新しいブロックを掘ったが,放送が遅れて受け入れられていないので,このブロックは次のブロックの”叔 block”になる可能性があり,このブロックが代表する作業量証明は次のブロックの一部とみなされる (つまり,この人が次のブロックを掘る難しさが低下する),そして叔ブロックは単に作業量証明を提供するだけで,その中に含まれている取引は無効である.このようにして,遅れて受信した放送の低端のクライアントは,ブロックの間隔の劣勢を補償する.具体的には,直接の叔父の50%の作業量証明を供給する,2代目の叔父の25%の作業量証明を供給する,このタイプの叔父は5世代以上で認められる.

blockchain-ethereum-uncles

写真素材:<https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

解決されていない問題

この部分では,Ethereumがまだ解決していない問題についてお話しします.

まず,Ethereumは,Bitcoinと同様に,POW (作業量証明) を使って,現在の一致的な方法で保証されています. 特定の作業量を完了したノードのみが,ブロック生成の作業に参加することができます.作業量証明の問題は,ネットワークのセキュリティを保証するために大量の計算力を無駄にするということです.

Ether自体は価値あるものなので,なぜそれ自体で経済的なインセンティブを作らないのか.POSとは,皆が持っているEtherを使って保証をするということであり,ブロック生成に参加したいすべてのノード (従来の意味での鉱山) (検証者と呼ばれる) は,システムに保証金を支払わなければならない (ここでは,このシステムはプロトコルで規定され,すべてのノードが,この保証金は”凍結”されていると考え),そして,皆が自分の保証金を使って,次のブロックのブロックになる可能性のあるものに保証金を支払わなければならない (いわゆる”可能性”の重要な前提は,このブロックは,協定の規定に適合しなければならないというものです).このブロックが本当に次のブロックになると,すべての注釈されたノードに報酬が与えられ,そうでなければ保証金は取り消されます.

このモデルはPOWと非常に似ています.POWでは,鉱夫は自分の計算力を使って”賭け”します.そして,もしチェーンが長くなったら,このチェーンに切り替えることが必要になります.参加者が多いほど,正しいチェーンになる可能性が高まり,最終的に合意に達します.

POSはネットワーク全体で通量を増やすことになるだろう もう,無意味な計算を大量に行うことでコンセンサスを達成する必要はなくなり,各ノードの処理量は,Contractのコードを実行し,データ検証を行う計算量に近づくだろう.

もちろん,POSがまだ採用されていないのは,まだ解決されていない問題があるためであり,その一つは,POWと同じ51%の攻撃の問題である.POWで全ネットワークの51%のコンピューティングは,コンピューティングが提供されるため,一定の物理的な制限がある.それに対して,POSで全ネットワークの51%のイーサーは,十分なお金がある限り,比較的簡単に作られる.POSは,POWよりも自然に複雑ではない.上記の作業ロジックは,有効な検証者リストの維持,証券の金凍結,不払い戻し,提案ブロックと賭けブロック,検証者間の同盟攻撃,ネットワーク分割の復元などに対処する必要があります.

もう一つの話題は”分割”です. ビットコインとイーサリアムの両方が,現在,同じブロックチェーン上ですべての取引を確認しています. これは,分散ネットワークのコンピューティング能力を大幅に制限しています.

したがって,Ethereumは将来,ネットワーク全体をいくつかの部分に分割し,それらの間で取引を独立に検証する”分割”の仕組みを導入したい.しかし,分割は,指針の構造によって他の分割のデータを引用し,異步呼び出しによって他の分割に影響を与える.したがって,ネットワークはユーザーの目には依然として”体”であり,ただし,ネットワーク全体の処理能力は非常に強固な拡張性を持つだろう.現在,分割に関する実装は,比較的初期の開発段階にあるため,私は限られた情報を見つけることができ,あまり説明できません.

Contract

この部分では,実際に動作するContractのコードを紹介します.Contractは,多くの異なる言語で記述され,最終的には,EVM上で実行されるopcodeにコンパイルされます.

contract Test {
  uint storedData; // State variable

  struct Voter { // Struct
    uint weight;
    bool voted;
    address delegate;
    uint vote;
  }

  event HighestBidIncreased(address bidder, uint amount); // Event

  function func() { // Function
    if (msg.sender.balance < 10 finney) {
        msg.sender.send(10 finney);
    }

    sha256("...");

    address nameServer = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
    nameServer.delegatecall("isAvailable", "MyName");
    nameServer.call("register", "MyName");
  }
}

Solidity の状態変数を宣言するコアグラフィックの例です.uint storedData;変数の値は永遠にブロックチェーンに保存されます.struct複雑なデータ構造を宣言する;また,関数を定義できる.これらの関数は,取引が受信されたときに実行され,取引の開始者は,実行する関数を選択することができます.したがって,Contractは,関数の中で論理判断,循環,変更量の値を修飾するいくつかの関数を提供することができます.

言語は,一般的な暗号アルゴリズムなど,便利な小さな機能を内蔵しています.sha256単位換算10 finneyウォレットアドレスを直接書きます.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2(笑)msgContract は,他の Contract のコードを 2 つの方法で呼び出すことができます.delegatecallこれは,別の Contract のコードを,現在のコンテキストの実行に挿入する,つまり,リバリー関数として導入する,というものです.call契約の論理は,新しい取引を始めるため,別の契約を始めるというものです.

では,Contract はどのようにブロックチェーンからデータを読み書きするのでしょうか? この複雑な作業は”状態変数”として抽象化されています. storedData は,状態変数です. 実際,Contract の実行過程で,状態変数への変更は,ブロックチェーンに保存されません.

Ethereumのネットワークを基に独自のトークンを発行する,実際に使えるContractを紹介します.

contract Coin {
    // The keyword "public" makes those variables
    // readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react on
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    function Coin() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

コードはhttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example (MIT)

コイン (Coin) と呼ばれるこのコントラクトは,2つの状態変数を宣言しています.minterこのトークンの作成者は, () の関数を構築しています.function Coin()) は,この変数に Contract を作成するための最初の取引の起始者属性を与え, ウォレットアドレスを数字のマッピング表に宣言します.balances, このトークンを保有する各住所の余剰を表す.

mintこの関数は,取引の開始者がそのトークンの作成者かどうかを判断し,そうであれば,関数パラメータに従って,指定されたアドレスに一定数のトークンを追加します.sendこの関数は,すべての人が呼び出すことができ,取引開始者のアドレスから一定量の残高を控え (もし十分な残高がある場合),目的地アドレスに加え,転送の機能に相当する.

イスラム教は,イスラム教をSent事件は,実際に何の実用的な役割も持たないが,デビュー時に重要なイベントを印刷するだけで,将来的には軽量級クライアントの実装も便利である.

blockchain-ethereum-mix

EthereumはMixというIDEでこのコードをデビュートします.Mixの右側では,ブロックやアカウントを作成してコントラクトをテストできます.実行中の各ステート変数の値の変化も確認できます. Contractはリリースされると変更できません.

作成が完了すると,このContractをEthereum Walletで公開できます.

blockchain-ethereum-create-contract

公開後,Contractの詳細をご覧いただけます.

blockchain-ethereum-wallet-contract

左側には2つの状態変数の値があります.minter住所を指定して 住所を指定してbalancesこの Contract はマップ表なので,その残高を調べるために,アドレスを入力できます. 右側には,この Contract に新しい取引を起動する,sendそうかmintこの関数で Contract に送信するパラメータを入力してください. ここで取引は Ether ではなくメッセージを送信するため,取引金額を設定する必要はありません.

このコントラクトは”ポンチス詐欺”の効果を 発揮します このコントラクトに1エーテルを支払って ゲームに参加し 3人の参加者に 3エーテルを支払います

contract Pyramid {
    struct Participant {
        address etherAddress;
    }

    Participant[] public participants;

    uint public payoutIdx = 0;

    // events make it easier to interface with the contract
    event NewParticipant(uint indexed idx);

    // fallback function - simple transactions trigger this
    function() {
        enter();
    }

    function enter() {
        if (msg.value < 1 ether) {
            msg.sender.send(msg.value);
            return;
        }

        if (msg.value > 1 ether) {
            msg.sender.send(msg.value - 1 ether);
        }

        uint idx = participants.length;
        participants.length += 1;
        participants[idx].etherAddress = msg.sender;

        NewParticipant(idx);

        // for every three new participants we can
        // pay out to an earlier participant
        if (idx != 0 && idx % 3 == 0) {
            // payout is triple, minus 10 % fee
            uint amount = 3 ether;
            participants[payoutIdx].etherAddress.send(amount);
            payoutIdx += 1;
        }
    }

    function getNumberOfParticipants() constant returns (uint n) {
        return participants.length;
    }
}

コードを簡素化しました.<https://ethereumpyramid.com/contract.html

このContractは, 簡単なコードで,participantsこのアレイは,すべての参加者のウォレットアドレスを順番に保存するために使用されます.payoutIdx3 Etherの返済を記録するために使用されます.enter契約の主な機能は 参数チェックで 1 エーテルが支払われたことを確認し 新しい参加者を追加しますparticipants配列の最後に,もし,現在の参加者のコード番号が 3 の倍数であれば, 3 Ether を第 1 に送ります.payoutIdxプロジェクトに参加する人payoutIdx次の参加者を指す

参考リンク

HashTree:

Bitcoin:

Halting Problem:

Ethereum:

Ethereum Network:

Next of Ethereum:

Contract:

Contract IDE: