海外からのメッセージhttps://jysperm.me/2016/05/blockchain-slides/
この記事は,私が3月末にLeanCloudで行った技術シェアからまとめており,読者は暗号学の基礎知識とBitcoinの実現についての初歩的な理解を持っていると仮定します.
ブロックチェーンは HashTree (散列樹) の一種と考えられるため, HashTree に似た性質がある.
画像はhttp://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html
つまり,樹状構造では,端末ノードごとに散布値があり,端末ノードの散布値は,直接の子ノードの散布値から生成されるので,各ノードが直接または間接的にすべての子ノードの情報を含んでいる.したがって,任意の端末ノードの散布値が変化する限り,すべての親ノードの散布値が変化すると,ルーツノードも変化しなければならない.
HashTreeに関するアプリを挙げます. "100%の準備証明"は",ゼロ知識証明"のような問題です. Bitcionの保有者が取引を行うためにビットコインを取引所に送金する必要があり,理論的には取引所はすべてのユーザーの口座残高を移動させることができるというシナリオを考えてみましょう. これはユーザーが見たくないことであり,交換所は自明したいものです. 取引所は最初に持てるBitcoinアドレスを公表し,取引が実際にこれほど多くのBitcoinを準備金として持っていることを確認します. しかし,この金額がすべてのユーザーの総和よりも大きいことをどのように証明しますか? 言い換えれば,すべてのユーザーの残高を公表しない限り,すべてのユーザーが自分の残高に含まれることをどのように認めますか? ユーザーのプライバシーを漏らします.
HashTreeは,すべての端末ノードがユーザーを代表し,ユーザバランスを含む HashTreeを構成できます.Σ
) とユーザーID (例えばメールアドレス) の散列h
),父ノードは子ノードの余剰の和を含んでいる.sum
) とすべてのサブノード情報の散列hash
) ;各ユーザに対して,自分のエンドノードと兄弟ノード,すべての父ノードと父ノードの兄弟ノードを提示するだけでよい.このユーザは,父ノードを段階的に追溯することで,自分の残高が父ノードに含まれており,最終的にルートノードに含まれており,確認することができる.
これにより,各ユーザに表示される情報は,独自の情報のみと,一部の情報をまとめており,各ユーザは,他の使用余剰分が知られていない状態で,自分の余剰分がルートノードに含まれていることを確認することができる.上図には小さなエラーがあります.h
ありがとうございました.e4df9d12
ユーザを代表する端末ノードではなく,ユーザのプライバシー情報を漏洩しないように,集約された情報ノード (このノードには3333の余剰を持つユーザと0の余剰を持つ虚偽ユーザが含まれます) があるべきです.
Gitは,実際に非常に典型的なブロックチェーンアプリケーションです.
画像はhttp://gitbook.liuhui998.com/1_2.html(GPL v2)
Gitでは,ファイル (Blob),インデックス (Tree) やコミット (Commit) のいずれも,その内容によって決定されるハッシュがあります. 2つのオブジェクトが同じ内容を持っている場合,同じハッシュがあります. Gitでは,リポジトリ全体の歴史はブロックチェーンであり,各コミットはブロックに相当します.
Git は Blockchain を使って,Repository のためのユニークな履歴を定義します. もし Commit が変更されたら,それ以降のすべての Commit の Hash が変更されます. もちろん,Git はバージョン管理ツールに過ぎませんので,履歴を変更するのを妨げません.push --force
この変更は,すべての共同著者によって認識されます.
ブロックチェーンのもう一つの古典的な応用は,ビットコインで,ビットコインがブロックチェーンの言葉を広めた (実際,この概念は常に存在していました):
画像はhttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)
ビットコインでは,各ブロックは一連のトランザクションと前方のブロックのハッシュを含み,ブロック全体は分散した単一の帳簿を形成する.新しいブロックが10分ごとに生成されるため,ブロックが生成されると,ブロックは永遠にブロックチェーンに残るので,ブロックチェーンは取引の順序を固定し,取引の順序を維持し,取引を開始するのに十分な残高があるかどうかを決定する.
この記事の最初の部分は,Bitcoinについて簡単に説明します.
ビットコインにおけるブロックの生成は"作業量証明"によって実現される.つまり",マイニング"に参加するすべての"マイナー"は,特定の条件を満たすランダムな数を計算するまで,計算力に関連した,ランダムな性質の散列計算を行なう.
設定では,すべてのマイナーは常に"最も長いチェーン"を信頼し,既知のルールを満たす最も長いチェーンに基づいて次のブロックを計算します. そうでなければ,あなたのコンピューティング力は白白に無駄になります.
ビットコインは10分ごとに新しいブロックを生成するように設計されており,この時間は,過去数ブロックの間隔を観察して,次のブロックの生成条件の難易度を調整する共同作業によって実現される.過去数ブロックの生成速度が予想よりも速いとき,次のブロックの生成がより難易度が高いと考えられる.
通常,ビットコインの各ノードは,取引が合法であるかどうかを確認するために,完全なブロックチェーンデータを保管する必要がある.取引の開始者が取引を開始するのに十分な残高を持っているかどうかを確認する.しかし,現在,完全なブロックチェーンには66Gがあり,毎日約0.1Gのペースで成長しています.Bitcoinのすべてのユーザに完全なブロックチェーンを保存することを要求する場合は,非常に苛立ちではありません.したがって,Bitcoinは"簡易化確認SPV,簡易化決済検証"のメカニズムを持っています.
実際,Bitcoinのブロックチェーンは"状態マシン"として考えることができます. ブロックチェーンはすべての取引の記録を保存する状態の"帳簿"であり,これらの取引の記録に基づいて,すべての口座の"状態"を推測することができます. つまり,Bitcoinネットワーク内の各アカウントのバランスがどの時点にあるか. すべてのトランザクションは状態の変化であり,各ブロックはBitcoinネットワーク全体の鉱夫の現在の状態に対する"合意"です. Bitcoinは10分ごとに新しいブロックを生成します.
ビットコインを基に多くの暗号通貨が生まれ,通常は"Alt Coin"と呼ばれています.
第"は独自のネットワークを使用し,ビットコインとは独立しているため,暗号通貨は独自のプロトコルとルールを非常に柔軟に設計することができるが,ユーザ数がビットコインと同等の数値に達することは困難であるため,悪意のある攻撃に対する防御力は非常に弱くなる.
2つ目は,Bitcoinネットワークの"メタプロトコル"を実装し,Bitocinのトランザクションの上にカスタマイズされた情報を付加して論理を実装することです.この利点は,Bitcoinの計算力の規模を攻撃に抵抗するために利用できるが,同時に,Bitcoinネットワークに付着しているため,すべてのマイナーは,Xinjiangのルールを遵守しないため,不規則なブロックがBlockchainに入ることを防ぐことができません.クライアントで不規則な取引をフィルタリングするだけで,前述のBitcoinが提供する簡易化確認機能を利用することはできません.
これらのコインの場合は,Bitcoinは大量に鉱夫が関与し,大規模な悪意のある攻撃に抵抗できるブロックチェーンを提供することができ,Bitcoinのトランザクションにはカスタマイズされたデータも搭載できる.
ビットコインはビットコインスクリプトしかし,これはBitcoinの核心機能ではないため,比較的単純な処理のみを行い,ブロックチェーン上のデータを非常に限られた範囲で読むことができる.また,循環機構がないため,一般的なチューリング完全な論理を書くことは困難です.
画像はhttps://www.ethereum.org/assets(CC 3.0)
"Ethereum (イーサリアム) "は,ビットコインのインフラストラクチャと暗号学に基づくブロックチェーン技術を統合したブロックチェーンベースの分散型アプリケーションプラットフォームであり,ビットコインネットワークに欠けている機能のいくつかを補完し,開発者が独自の分散型アプリケーションをブロックチェーン上で実行できるようにしています.
Ethereumについて詳しく説明する前に,まず2つの (私が考える) 分散型ネットワークの基礎について説明します. 暗号学とギャンブル. 暗号学は,もちろん,公钥暗号化,デジタル署名,散列,抽象化アルゴリズムによって数学的に安全性を保証するだけでなく,ギャンブルとは,分散型ネットワークでは,誰でも,悪意を持ってネットワークを攻撃したいと思っている人々を含む誰もが参加することが可能であり,分散型ネットワークを設計する際に,すべての参加者の視点から利益関係を考える必要があります. ルール遵守の利益が最大化され,ルール違反の損失やリスクを担うことを保証します.
しかし,デジタルの世界では,データの一片を公開することはコストなしであり",利益"や"損失"などありません.したがって",利益"を定義するには,物理の世界と何らかの関連性を持つ必要があります.例えば,ビットコインネットワークでは,攻撃者がBlcokchainの方向性を人工的に変えたいのであれば,他のすべてのマイナーよりも高い計算力を必要とします.
つまり,分散型ネットワークでは,すべての問題は"技術"によって解決されるわけではない.技術が達成できない部分は,利益や経済的インセンティブによって解決されなければならない.また",経済的インセンティブ"の必要性のために,Ethereumにはまた,各ユーザが独自のIDとして財布アドレスを持っている財布システム (通貨単位は"エッテル (Ether) ") もあり,この点ではBitcionと比較的類似している.
"契約"はイーサリアムで導入された最も重要な概念である.ビットコインでは,すべての住所はユーザーに属している.しかし,イーサリアムでは,鍵によって所有される住所に加えて",コード"によって所有される住所,すなわち"契約"があります.契約はユーザーによって発行され,その本質はコードの一部であり,発行後に変更することはできません.契約は,通常のアカウントと同様に,財布の住所を持っています.この住所を受け取るたびに,関連する取引コードが実行されます.
Ethereumの公式クライアントには,マルチウォレットを作成する機能があります.
図のように,この機能によって,2人の他の人と共有されたウォレットアドレスを作成することができ,そのうちの1人は1日100エッテルまで使用し,この制限を超えると,他の人の同意を得なければならない.
この機能は実際に Contract を作成し,上記の論理は Contract のコードで記述されている. この共有財布から支出をしたいとき,共有財布にメッセージを送る (取引はメッセージであり,取引額はゼロであり,データのみを運ぶことができる) ので,共有財布のコードが実行され,この支出要求が上記の論理に準拠している場合,実際の支出取引を開始する.そうでなければ,この支出要求は実際の支出項目なしで拒否されます.
別の例は"ヘッジ契約"で,ビットコインはデジタル通貨として通貨価値 (および法定通貨の為替率) が不安定で,しばしば1日間で通貨価値が倍増または倍減するケースが起きています.しかし,契約によってヘッジ契約を実現すれば,この問題はある程度解決できます.
通貨の変動を保持したい人は"リスク回避者"と呼ばれ,通貨の変動のリスクを承担し,そこから利益を得たい人は"リスク承担者"と呼ばれ,彼らは金額 (例えば1000 CNY) と時間窓口 (例えば1ヶ月) を合意し,次の論理を実行する契約を作成します:
エーテルが値上がりするとリスク承担者は利益を得,エーテルが値下がりするとリスク承担者は損失を被りますが,リスク回避者は常に利益を得ます.もちろん,リスク回避者とリスク承担者は,リスク回避者が支払う必要がある"保険料"を事前に合意したり,リスク承担者が1000 CNY以上の保証金を提供する必要があることを合意することもできます (倍率が高いほどリスク承担が可能です).
上記の例では,Etherと法定通貨との間の為替率をどのように決定するかという問題も解決できていない. 前述したように,Contractはブロックチェーン上のデータしかアクセスできないが,法定通貨は物理的な世界ではなく暗号の世界にあるデータである.我々は何らかのメカニズムによって,このような"非暗号の世界からのデータ"をブロックチェーンに導入する必要がある.
Etherと法定通貨との間のレートを物理の世界から抽出する論理を指定する別の契約を設計することができます.
競争相手の申し出を知らずに,真価を提出した参加者は報酬を受ける可能性が高く,非現実的な申し出を提出した参加者は保証金を失う可能性が高くなる.
もちろんこのルールにはいくつかの欠陥があります. 例えば,人が非常に多くの保釈金を持っている場合,彼は平均値を実際の通貨比よりも高くまたは低く引き上げ,同時に報酬を得ることができ,正確な通貨比を提供した他の何人かの人が保釈金を失うことになります. しかし,実際は同じです.
もう"つの漏洞は",誰でも契約に担保金を支払って,通貨を提供できる"というステップです. このステップは,取引を作成することで実現されます. すべての取引はブロックチェーンに書き込まれます. したがって,あなたが提出する通貨は,実際に他の人に見られるもので,悪意のある攻撃者にさらに機会を与えます.
ブロックチェーンのデータを読み取れるという話ですが ブロックチェーンのデータは決まっています ギャンブルのようなアプリケーションを 実現するには ランダムな数字をどこから入手すればいいのでしょうか?
想像できるランダム数源は次のブロックのハッシュであり,ほとんどの場合,この程度のランダム性は十分である.しかし,実際には鉱夫はこのランダム数を一定程度操作できる. 仮に,鉱夫が賭けに参加し,賭けの利益が一つのブロックの利益よりも大きいと仮定すると,この鉱夫が賭けの利益を失うようなブロックを掘った場合,明らかにこの鉱夫は新しいブロックを公開しないことを選択するほど,これは個々の鉱夫の計算力のある状況においてより顕著である.
したがって,抽選率のようなメカニズムを導入し,ランダムな数の種子を抽選し,それから各時間窓口の終わりにそれらの種子を使ってランダムな数を計算する.しかし,抽選率と同様に,参加者は取引を作成することで送信率を実現しているため,時間窓間の各者が送信したランダムな数は他者にとって表示されるので,既に賭けをしている人は,他の者が提出した種子と生成されたランダムな新しい種子の数を他者が提出した種子に足して,自分の期待にちょうど合致するように,ランダムな数の種子を慎重に選択することができます.
だから,種を集める窓を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が放送された知らせを受け取る"の間の時間の計算は,実際には無駄にされているが,中心的な鉱山池の他の鉱夫は,新しいブロックの情報をより早く入手し,すぐに新しいブロックの基礎で作業を開始できるので,この問題はありません.
この放送時間は10秒ほどかかるかもしれませんが,コンセンサスの間隔を短くすると,集中型マイニングプールの利点はますます明らかになります.しかし,イーサリアムは"Uncle Block"の概念を導入することで,この問題を解決し,コンセンサスの間隔を15秒に短縮し,ビットコインよりも支払いの確認速度を大幅に向上させました.
ビットコインのブロックチェーンでは,ブロックには父ブロックと子ブロックが1つしかない.しかし,イーサリアムでは,新しく生成されたブロックには父ブロックと複数の叔父ブロックが1つしかない.上記の例に戻り,もしAで新しいブロックが掘り出され,他の誰かがそれをまだ受け取っていない場合,誰かが新しいブロックを掘り出したが,放送が遅いため,それが受け入れられていなかった場合,ブロックは次のブロックの"叔父ブロック"になる可能性があります.このブロックが代表する作業量は次のブロックの一部とみなされる証明になります. (つまり,この人が次のブロックを掘り出す難易度は低下します),このブロックは単に作業量を証明し,その中に含まれる取引は無効です.これは,低ブロック間隔でより遅い放送を受けたクライアントの劣点を補うため,特に,叔父ブロックが直接作業量を証明し,25%の叔父ブロックを証明し,この種の作業を最大で50%の叔父ブロックに承認します.
画像は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
イベントは,実際には実用的な作用を持たないが,デビュー時に重要なイベントを印刷するだけで,将来も軽量クライアントの実現を便利にする (軽量クライアントはイベントのみを受け入れ,実際に契約を実行しない).
Ethereum は Mix という IDE を提供し,このコードをデフォッグします. Mix の右側では,ブロックやアカウントを仮想化して,あなたの Contract をテストし,実行中に各状態変数の値の変化を見ることができます. Contract がリリースされると変更できないこと,その後は他の人の取引によって完全に起動することが,毎日バグを書いているプログラマにとって非常に不快なことですが, Contract の意味は"契約"です.
この契約が作成されたら,この契約をEthereumウォレットでウェブに公開できます.
公開後,この契約をご覧いただけます.
この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;
}
}
簡単なコードで,この契約は,participants
列は,すべての参加者のウォレットアドレスを順序的に保存するために使用されます.payoutIdx
3 Ether の返済を記録するために使用されます.enter
この契約の主要な機能は,まず各参加者が1エッテルを支払ったことを保証するいくつかのパラメータのチェックです.participants
列の終わりに,当参加者の先行番号がちょうど3の倍数である場合は, 3 Ether を第 1 に送信します.payoutIdx
市民が参加し,payoutIdx
この記事へのトラックバック一覧です.
ハッシュツリー:
ビットコイン:
停止問題:
イーサリアム:
イーサリアムネットワーク:
エサリアムの次は
契約書
契約 IDE:
発明者 量化 - 微かな夢完全に理解できず,ほとんど理解できず,ほとんど理解できず
シュアンシュアン会社長はETHとBTCを研究するために行った
モモックスわからない