ブロックチェインとイーサリアムについて

作者: リン・ハーンゼロ, 2016-05-05 17:31:57で作成しました.

海外からのメッセージhttps://jysperm.me/2016/05/blockchain-slides/

この記事は,私が3月末にLeanCloudで行った技術シェアからまとめており,読者は暗号学の基礎知識とBitcoinの実現についての初歩的な理解を持っていると仮定します.

ブロックチェーンは HashTree (散列樹) の一種と考えられるため, HashTree に似た性質がある.

blockchain-hash-tree

画像はhttp://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

つまり,樹状構造では,端末ノードごとに散布値があり,端末ノードの散布値は,直接の子ノードの散布値から生成されるので,各ノードが直接または間接的にすべての子ノードの情報を含んでいる.したがって,任意の端末ノードの散布値が変化する限り,すべての親ノードの散布値が変化すると,ルーツノードも変化しなければならない.

HashTreeに関するアプリを挙げます. "100%の準備証明"は",ゼロ知識証明"のような問題です. Bitcionの保有者が取引を行うためにビットコインを取引所に送金する必要があり,理論的には取引所はすべてのユーザーの口座残高を移動させることができるというシナリオを考えてみましょう. これはユーザーが見たくないことであり,交換所は自明したいものです. 取引所は最初に持てるBitcoinアドレスを公表し,取引が実際にこれほど多くのBitcoinを準備金として持っていることを確認します. しかし,この金額がすべてのユーザーの総和よりも大きいことをどのように証明しますか? 言い換えれば,すべてのユーザーの残高を公表しない限り,すべてのユーザーが自分の残高に含まれることをどのように認めますか? ユーザーのプライバシーを漏らします.

blockchain-proof-of-reserves

画像はhttp://blog.bifubao.com/2014/03/16/proof-of-reserves

HashTreeは,すべての端末ノードがユーザーを代表し,ユーザバランスを含む HashTreeを構成できます.Σ) とユーザーID (例えばメールアドレス) の散列h),父ノードは子ノードの余剰の和を含んでいる.sum) とすべてのサブノード情報の散列hash) ;各ユーザに対して,自分のエンドノードと兄弟ノード,すべての父ノードと父ノードの兄弟ノードを提示するだけでよい.このユーザは,父ノードを段階的に追溯することで,自分の残高が父ノードに含まれており,最終的にルートノードに含まれており,確認することができる.

これにより,各ユーザに表示される情報は,独自の情報のみと,一部の情報をまとめており,各ユーザは,他の使用余剰分が知られていない状態で,自分の余剰分がルートノードに含まれていることを確認することができる.上図には小さなエラーがあります.hありがとうございました.e4df9d12ユーザを代表する端末ノードではなく,ユーザのプライバシー情報を漏洩しないように,集約された情報ノード (このノードには3333の余剰を持つユーザと0の余剰を持つ虚偽ユーザが含まれます) があるべきです.

Gitは,実際に非常に典型的なブロックチェーンアプリケーションです.

blockchain-git-objects-example

画像はhttp://gitbook.liuhui998.com/1_2.html(GPL v2)

Gitでは,ファイル (Blob),インデックス (Tree) やコミット (Commit) のいずれも,その内容によって決定されるハッシュがあります. 2つのオブジェクトが同じ内容を持っている場合,同じハッシュがあります. Gitでは,リポジトリ全体の歴史はブロックチェーンであり,各コミットはブロックに相当します.

Git は Blockchain を使って,Repository のためのユニークな履歴を定義します. もし Commit が変更されたら,それ以降のすべての Commit の Hash が変更されます. もちろん,Git はバージョン管理ツールに過ぎませんので,履歴を変更するのを妨げません.push --forceこの変更は,すべての共同著者によって認識されます.

ブロックチェーンのもう一つの古典的な応用は,ビットコインで,ビットコインがブロックチェーンの言葉を広めた (実際,この概念は常に存在していました):

blockchain-bitcoin-block-data

画像はhttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

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

ビットコイン

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

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

設定では,すべてのマイナーは常に"最も長いチェーン"を信頼し,既知のルールを満たす最も長いチェーンに基づいて次のブロックを計算します. そうでなければ,あなたのコンピューティング力は白白に無駄になります.

ビットコインは10分ごとに新しいブロックを生成するように設計されており,この時間は,過去数ブロックの間隔を観察して,次のブロックの生成条件の難易度を調整する共同作業によって実現される.過去数ブロックの生成速度が予想よりも速いとき,次のブロックの生成がより難易度が高いと考えられる.

通常,ビットコインの各ノードは,取引が合法であるかどうかを確認するために,完全なブロックチェーンデータを保管する必要がある.取引の開始者が取引を開始するのに十分な残高を持っているかどうかを確認する.しかし,現在,完全なブロックチェーンには66Gがあり,毎日約0.1Gのペースで成長しています.Bitcoinのすべてのユーザに完全なブロックチェーンを保存することを要求する場合は,非常に苛立ちではありません.したがって,Bitcoinは"簡易化確認SPV,簡易化決済検証"のメカニズムを持っています.

blockchain-bitcoin-state-machine

画像はhttps://github.com/ethereum/wiki/wiki/White-Paper

  • ブロックチェーンの 帳簿 状態変更ログ
  • トランザクション トランザクション トランザクション トランザクション 状態変更
  • ブロックは,現在の状況に対する"合意"を

実際,Bitcoinのブロックチェーンは"状態マシン"として考えることができます. ブロックチェーンはすべての取引の記録を保存する状態の"帳簿"であり,これらの取引の記録に基づいて,すべての口座の"状態"を推測することができます. つまり,Bitcoinネットワーク内の各アカウントのバランスがどの時点にあるか. すべてのトランザクションは状態の変化であり,各ブロックはBitcoinネットワーク全体の鉱夫の現在の状態に対する"合意"です. Bitcoinは10分ごとに新しいブロックを生成します.

Alt コイン

ビットコインを基に多くの暗号通貨が生まれ,通常は"Alt Coin"と呼ばれています.

第"は独自のネットワークを使用し,ビットコインとは独立しているため,暗号通貨は独自のプロトコルとルールを非常に柔軟に設計することができるが,ユーザ数がビットコインと同等の数値に達することは困難であるため,悪意のある攻撃に対する防御力は非常に弱くなる.

2つ目は,Bitcoinネットワークの"メタプロトコル"を実装し,Bitocinのトランザクションの上にカスタマイズされた情報を付加して論理を実装することです.この利点は,Bitcoinの計算力の規模を攻撃に抵抗するために利用できるが,同時に,Bitcoinネットワークに付着しているため,すべてのマイナーは,Xinjiangのルールを遵守しないため,不規則なブロックがBlockchainに入ることを防ぐことができません.クライアントで不規則な取引をフィルタリングするだけで,前述のBitcoinが提供する簡易化確認機能を利用することはできません.

これらのコインの場合は,Bitcoinは大量に鉱夫が関与し,大規模な悪意のある攻撃に抵抗できるブロックチェーンを提供することができ,Bitcoinのトランザクションにはカスタマイズされたデータも搭載できる.

ビットコインはビットコインスクリプトしかし,これはBitcoinの核心機能ではないため,比較的単純な処理のみを行い,ブロックチェーン上のデータを非常に限られた範囲で読むことができる.また,循環機構がないため,一般的なチューリング完全な論理を書くことは困難です.

エサリアム

blockchain-ethereum

画像はhttps://www.ethereum.org/assets(CC 3.0)

"Ethereum (イーサリアム) "は,ビットコインのインフラストラクチャと暗号学に基づくブロックチェーン技術を統合したブロックチェーンベースの分散型アプリケーションプラットフォームであり,ビットコインネットワークに欠けている機能のいくつかを補完し,開発者が独自の分散型アプリケーションをブロックチェーン上で実行できるようにしています.

Ethereumについて詳しく説明する前に,まず2つの (私が考える) 分散型ネットワークの基礎について説明します. 暗号学とギャンブル. 暗号学は,もちろん,公钥暗号化,デジタル署名,散列,抽象化アルゴリズムによって数学的に安全性を保証するだけでなく,ギャンブルとは,分散型ネットワークでは,誰でも,悪意を持ってネットワークを攻撃したいと思っている人々を含む誰もが参加することが可能であり,分散型ネットワークを設計する際に,すべての参加者の視点から利益関係を考える必要があります. ルール遵守の利益が最大化され,ルール違反の損失やリスクを担うことを保証します.

しかし,デジタルの世界では,データの一片を公開することはコストなしであり",利益"や"損失"などありません.したがって",利益"を定義するには,物理の世界と何らかの関連性を持つ必要があります.例えば,ビットコインネットワークでは,攻撃者がBlcokchainの方向性を人工的に変えたいのであれば,他のすべてのマイナーよりも高い計算力を必要とします.

つまり,分散型ネットワークでは,すべての問題は"技術"によって解決されるわけではない.技術が達成できない部分は,利益や経済的インセンティブによって解決されなければならない.また",経済的インセンティブ"の必要性のために,Ethereumにはまた,各ユーザが独自のIDとして財布アドレスを持っている財布システム (通貨単位は"エッテル (Ether) ") もあり,この点ではBitcionと比較的類似している.

"契約"はイーサリアムで導入された最も重要な概念である.ビットコインでは,すべての住所はユーザーに属している.しかし,イーサリアムでは,鍵によって所有される住所に加えて",コード"によって所有される住所,すなわち"契約"があります.契約はユーザーによって発行され,その本質はコードの一部であり,発行後に変更することはできません.契約は,通常のアカウントと同様に,財布の住所を持っています.この住所を受け取るたびに,関連する取引コードが実行されます.

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

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

blockchain-ethereum-multi-sig-wallet

図のように,この機能によって,2人の他の人と共有されたウォレットアドレスを作成することができ,そのうちの1人は1日100エッテルまで使用し,この制限を超えると,他の人の同意を得なければならない.

この機能は実際に Contract を作成し,上記の論理は Contract のコードで記述されている. この共有財布から支出をしたいとき,共有財布にメッセージを送る (取引はメッセージであり,取引額はゼロであり,データのみを運ぶことができる) ので,共有財布のコードが実行され,この支出要求が上記の論理に準拠している場合,実際の支出取引を開始する.そうでなければ,この支出要求は実際の支出項目なしで拒否されます.

別の例は"ヘッジ契約"で,ビットコインはデジタル通貨として通貨価値 (および法定通貨の為替率) が不安定で,しばしば1日間で通貨価値が倍増または倍減するケースが起きています.しかし,契約によってヘッジ契約を実現すれば,この問題はある程度解決できます.

通貨の変動を保持したい人は"リスク回避者"と呼ばれ,通貨の変動のリスクを承担し,そこから利益を得たい人は"リスク承担者"と呼ばれ,彼らは金額 (例えば1000 CNY) と時間窓口 (例えば1ヶ月) を合意し,次の論理を実行する契約を作成します:

  • リスク回避者は1,000 CNYのエッテルをコントラクトのウォレットアドレスに送信し,リスク承担者は1,000 CNY (またはそれ以上) のエッテルをコントラクトに送信し,契約 (もし誰も契約しない場合,リスク回避者は自分のエッテルを回収することができます) を完了します.
  • 1ヶ月後,リスク回避者は,その時点で1000 CNYの価値のあるエッテルを契約から取り戻すことができ,残りのエッターは,エッテルとCNYの間の為替関係に関係なく,リスク承担者が取り戻す.

エーテルが値上がりするとリスク承担者は利益を得,エーテルが値下がりするとリスク承担者は損失を被りますが,リスク回避者は常に利益を得ます.もちろん,リスク回避者とリスク承担者は,リスク回避者が支払う必要がある"保険料"を事前に合意したり,リスク承担者が1000 CNY以上の保証金を提供する必要があることを合意することもできます (倍率が高いほどリスク承担が可能です).

上記の例では,Etherと法定通貨との間の為替率をどのように決定するかという問題も解決できていない. 前述したように,Contractはブロックチェーン上のデータしかアクセスできないが,法定通貨は物理的な世界ではなく暗号の世界にあるデータである.我々は何らかのメカニズムによって,このような"非暗号の世界からのデータ"をブロックチェーンに導入する必要がある.

Etherと法定通貨との間のレートを物理の世界から抽出する論理を指定する別の契約を設計することができます.

  • 誰でも契約に保証金を支払って,通貨レートを提供できます.
  • 時間窓の終わりに,Contractは所有者が提供した為替の平均値を計算し (保証金加重で) 公開します.
  • そして,集まった保釈金 (保釈金加重) を,平均値に最も近い25%に分配します.

競争相手の申し出を知らずに,真価を提出した参加者は報酬を受ける可能性が高く,非現実的な申し出を提出した参加者は保証金を失う可能性が高くなる.

もちろんこのルールにはいくつかの欠陥があります. 例えば,人が非常に多くの保釈金を持っている場合,彼は平均値を実際の通貨比よりも高くまたは低く引き上げ,同時に報酬を得ることができ,正確な通貨比を提供した他の何人かの人が保釈金を失うことになります. しかし,実際は同じです.

もう"つの漏洞は",誰でも契約に担保金を支払って,通貨を提供できる"というステップです. このステップは,取引を作成することで実現されます. すべての取引はブロックチェーンに書き込まれます. したがって,あなたが提出する通貨は,実際に他の人に見られるもので,悪意のある攻撃者にさらに機会を与えます.

ブロックチェーンのデータを読み取れるという話ですが ブロックチェーンのデータは決まっています ギャンブルのようなアプリケーションを 実現するには ランダムな数字をどこから入手すればいいのでしょうか?

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

したがって,抽選率のようなメカニズムを導入し,ランダムな数の種子を抽選し,それから各時間窓口の終わりにそれらの種子を使ってランダムな数を計算する.しかし,抽選率と同様に,参加者は取引を作成することで送信率を実現しているため,時間窓間の各者が送信したランダムな数は他者にとって表示されるので,既に賭けをしている人は,他の者が提出した種子と生成されたランダムな新しい種子の数を他者が提出した種子に足して,自分の期待にちょうど合致するように,ランダムな数の種子を慎重に選択することができます.

だから,種を集める窓を2つに分け,誰も予測したり,介入したりできないランダムな数値を得ることが必要でした.

  • 第"段階:誰でも契約に担保金を納入し",ランダムに選ばれた種子の配当値"を提供できる.
  • 第2段階:第1段階の参加者は,未配列の種子を契約に提供します.
  • 第2段階終了:契約はすべての合法的な種子を配列し,ランダムな数のセットを生成し,公表する;第2段階の返還は,正しい種子を提供した人の保証金である.

第"段階では,他の人が提出した種子の散数値しか知らず,実際の種子も知らないので,結果に介入するために精巧に種子を構築することはできません. 第2段階では,すべての人が最初の段階の提出を確認するだけで,新しい種子も提出できず,他の人の提出を阻止することもできません.

先ほど述べたように,Bitcoin Scriptは回転,回帰,跳ね返りなどの能力を提供していないが,おそらくBitcoinはBitcoin Scriptの実行時間を制御する目的で,チューリングの"停止定理"によると,チューリングが完全に使ったプログラミング言語で書かれたプログラムは,常に静的分析の観点からのみ終了するかどうかを判断することはできません.

Ethereumは再びこの問題を"経済的なインセンティブ"で回避し,Contractは,Ethereum Virtual Machineと呼ばれる仮想マシンで,EVMは自費の仮想マシンであり,Ethereumの標準では,操作に必要なメモリとCPU時間に基づいて,Etherが購入する計算資源である各 opcodeが消費するガスが定義されます. 前述のように,取引の目的はContractであるとき,Contractのコードは実行され,取引の開始者はContractの実行中に消費されたガスに支払う必要があり",最大限のガスに支払う意思がある"と宣言し,中途が尽きると,Contractが停止されます.

そして,再び"コンセンサス間隔"の問題について議論します. Bitcoinは10分ごとに新しいブロックが生じ,つまりネットワーク全体が10分ごとに"コンセンサス"に達します. そのため,通常のBitcoin取引は10分以上待たなければなりません.

明らかにより短いコンセンサスはユーザーにとってより良い体験をもたらすだろう.なぜビットコインはブロックの出荷時間を短縮しないのか? これは,より速いコンセンサスの間隔が"集中型鉱山"の利点を一定程度増加させるからです.いわゆる"鉱山"とは,ビットコインの鉱夫が集まって鉱山を採掘することを指します.鉱夫は,鉱山の指示に無条件に従い,最終的に鉱山と利益分割を合意します.

鉱夫Aが新しいブロックを掘り出すと,彼はそのブロックを広め,他の人たちはこの知らせを受け取るとすぐに新しいブロックに基づいて作業を開始する. "Aが新しいブロックを掘り出す"と"Aが放送された知らせを受け取る"の間の時間の計算は,実際には無駄にされているが,中心的な鉱山池の他の鉱夫は,新しいブロックの情報をより早く入手し,すぐに新しいブロックの基礎で作業を開始できるので,この問題はありません.

blockchain-ethereum-without-uncles

この放送時間は10秒ほどかかるかもしれませんが,コンセンサスの間隔を短くすると,集中型マイニングプールの利点はますます明らかになります.しかし,イーサリアムは"Uncle Block"の概念を導入することで,この問題を解決し,コンセンサスの間隔を15秒に短縮し,ビットコインよりも支払いの確認速度を大幅に向上させました.

ビットコインのブロックチェーンでは,ブロックには父ブロックと子ブロックが1つしかない.しかし,イーサリアムでは,新しく生成されたブロックには父ブロックと複数の叔父ブロックが1つしかない.上記の例に戻り,もしAで新しいブロックが掘り出され,他の誰かがそれをまだ受け取っていない場合,誰かが新しいブロックを掘り出したが,放送が遅いため,それが受け入れられていなかった場合,ブロックは次のブロックの"叔父ブロック"になる可能性があります.このブロックが代表する作業量は次のブロックの一部とみなされる証明になります. (つまり,この人が次のブロックを掘り出す難易度は低下します),このブロックは単に作業量を証明し,その中に含まれる取引は無効です.これは,低ブロック間隔でより遅い放送を受けたクライアントの劣点を補うため,特に,叔父ブロックが直接作業量を証明し,25%の叔父ブロックを証明し,この種の作業を最大で50%の叔父ブロックに承認します.

blockchain-ethereum-uncles

画像はhttps://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

解決されていない問題

この部分では,エサリアムで解決されていないいくつかの問題について説明します.

まず,現在合意されているEthereumの方法は,ビットコインと同様にPOW (作業量証明) によって保証されているため,特定の作業量完了したノードだけがブロック生成の作業に参加できる.作業量証明の問題は,ネットワークの安全性を保証するために大量のコンピューティング力を無駄にすることであり,これは,前述の"経済的なインセンティブ"の考えに基づいているが,実際には改善可能である.

Etherは価値あるものなので,なぜそれ自体で経済的なインセンティブを施さないのか? POSとは,誰もが持っているEtherを保証するために使っていることであり,ブロックの生成 (従来の意味でのマイニング) に参加したいすべてのノード (従来の意味でのマイニング) は,システム (このシステムとは,すべてのノードがこの保証金が"凍結"されていると仮定するプロトコルで規定されていることを意味します) に保証金を支払う必要があります.

このモデルはPOWと非常に似ています.POWでは,鉱夫は自分の計算力を使って"賭け"し,一旦鎖が長くなったら,その鎖に切り替える必要があり,その鎖に引き続き採掘する.

POSは,ネットワーク全体のスムードを増加させるだろう. 冗長な計算を重ねて合意に達する必要はなく,各ノードの処理量は,契約中のコードを実行し,データ検証を行う計算量に近いだろう.

もちろんPOSは現在まだ採用されていないのは,POWのようなまだ解決されていない問題があるためである.POSでは,51%の攻撃が問題である.POWでは全ネットワークの51%のコンピューティング力が物理的に制限されている.POSでは,全ネットワークの51%のエッテルを収集することは比較的簡単である.POSは,十分なお金がある限りである.POSはもちろんPOWよりも複雑ではなく,上記の作業の論理を実現するために,有効な検証者リストの維持,保証金の封鎖,罰金,返金しない和解,提案区块と賭け区块,検証者間の同盟攻撃の防止,ネットワークの分離後の復旧などに対処する必要があります.

もう一つのテーマは"スライス"である.ビットコインとイーサリアムは,現在,すべての取引が同じブロックチェーン上で確認されています. これは分散ネットワークのコンピューティング能力を非常に制限しています.

したがって,イーサリアムは将来,ネットワーク全体をいくつかの部分に分割し,相互に独立して取引を検証するための"分割"の仕組みを導入することを望んでいます.しかし,分割は指針の構造によって他の分割のデータを参照し,異動式呼び出しによって他の分割に影響を与えます.したがって,ネットワーク全体はユーザーの観点から依然として単体であり,しかし,ネットワーク全体の処理能力は非常に強力に拡張可能になります.現在,分割に関連する実装は比較的初期の開発段階で限られています.私が見つけた情報はあまり説明されません.

契約

この部分では,実際に動作する 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複雑なデータ構造を宣言する.また,トランザクションを受信したときに実行される関数を定義し,トランザクションの発起者がどの関数を実行するか選択できる.したがって,契約は複数の関数を提供し,関数内で論理判断,回転,修飾の値を変更することができます.

言語には,一般的な暗号化アルゴリズムなどの便利な機能が組み込まれています.sha256ユニット換算10 finney財布の住所を書いてください.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2待ってなさい.msg契約のコードは,他の契約のコードを2つの方法で呼び出すことができます. 契約のコードは,他の契約のコードを2つの方法で呼び出すことができます.delegatecall文献の文脈は,文脈の文脈にコードを入れ,文庫の関数を導入するのと同じです.call契約の論理は,別の契約を誘発するために新しい取引を開始することです.

では,契約はブロックチェーンからデータを読み書きするのでしょうか? この複雑な作業は"状態変数"のために抽象化されています. 上にある storedDataは状態変数です. 実際,契約実行中に状態変数への変更はブロックチェーンに保存されません. 契約を実行するものは確実性の計算です.

次に,Ethereumネットワーク上で独自のトークンを発行するための実際に利用可能な Contract Padを紹介します.

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)

コインと呼ばれるこの契約は,2つの状態変数を宣言します.minterこのトークンの作成者は,このトークンを保存するために,関数を構成しています.function Coin()) は,この変数に最初の契約を作成する取引の開始者値を代入し,また,財布のアドレスから数字へのマッピング表を宣言します.balancesこのトークンは,各トークン保有者の住所に対する残高を表します.

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

声明は,Sentイベントは,実際には実用的な作用を持たないが,デビュー時に重要なイベントを印刷するだけで,将来も軽量クライアントの実現を便利にする (軽量クライアントはイベントのみを受け入れ,実際に契約を実行しない).

blockchain-ethereum-mix

Ethereum は Mix という IDE を提供し,このコードをデフォッグします. Mix の右側では,ブロックやアカウントを仮想化して,あなたの Contract をテストし,実行中に各状態変数の値の変化を見ることができます. Contract がリリースされると変更できないこと,その後は他の人の取引によって完全に起動することが,毎日バグを書いているプログラマにとって非常に不快なことですが, Contract の意味は"契約"です.

この契約が作成されたら,この契約をEthereumウォレットでウェブに公開できます.

blockchain-ethereum-create-contract

公開後,この契約をご覧いただけます.

blockchain-ethereum-wallet-contract

この2つの状態変数の値が左側に示されていますminterこの記事へのトラックバック一覧です.balancesこの契約はマップ表なので,そのバランスを調べるためにアドレスを入力できます.右側には,この契約に新しい取引を開始し,選択するドロップダウンメニューがあります.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

簡単なコードで,この契約は,participants列は,すべての参加者のウォレットアドレスを順序的に保存するために使用されます.payoutIdx3 Ether の返済を記録するために使用されます.enterこの契約の主要な機能は,まず各参加者が1エッテルを支払ったことを保証するいくつかのパラメータのチェックです.participants列の終わりに,当参加者の先行番号がちょうど3の倍数である場合は, 3 Ether を第 1 に送信します.payoutIdx市民が参加し,payoutIdxこの記事へのトラックバック一覧です.

参考リンク

ハッシュツリー:

ビットコイン:

停止問題:

イーサリアム:

イーサリアムネットワーク:

エサリアムの次は

契約書

契約 IDE:


もっと

小さな夢完全に理解できず,ほとんど理解できず,ほとんど理解できず

シュアンシュアン会社長はETHとBTCを研究するために行った

モモックスわからない