現在、膨大な数の分散コンピューティングネットワークがあります。 最大の数は
Folding @ home 、
BOINC 、
SETI @ home 、
Einstein @ Home 、
Rosetta @ homeです (計算結果によると、数十の論文が書かれています)。 彼らは、md5パスワードの選択からタンパク質凝固のシミュレーションまで、分散計算可能なすべてを計算します。
これらの各ネットワークは異常に高いパフォーマンスを持ち、数百万のノードが含まれています。 それぞれのパフォーマンスは、スーパーコンピューターのパフォーマンスに匹敵します。
- Rosetta @ home-110 TFlops以上
- Einstein @ Home-355 TFlops以上
- SETI @ home-560テラフロップス以上
- BOINC-5.6 Pflops以上
- フォールディング@ホーム-5.9 Pflops以上
- ビットコイン-9.4 Pflops以上
スーパーコンピューターと比較してください:
- ブルージーン/ L(2006)-478.2 TFlops
- ジャガー(スーパーコンピューター)(2008)-1.059 Pflops
- IBM Roadrunner(2008)-1.042 Pflops
- ジャガークレイXT5-HE(2009)-1.759 Pflops
- Tianhe-1A(2010)-2.507フロップ
- IBM Sequoia(2012)-20フロップ
それでは、インターネットユーザーの既存の未使用の可能性を計算してみましょう。
2010年末の推定によると、約20億人のインターネットユーザー(20億人)がいました。
各ユーザーは、少なくとも8 Gflops(AMD Athlon 64 2.211 GHz)のパフォーマンスを持つ少なくとも1つのプロセッサーコアを持っています。
簡単な数学的計算によると、このようなネットワークのパフォーマンスは次のようになります。
8 * 10 9 * 2 * 10 9
=
16エクサフロップス (10
18 )。
このようなネットワークは、まだ構築されていないIBM Sequoia(2012)の
800倍、Bitcoinネットワークの
1700倍、すべてのスーパーコンピューターとコンピューターネットワークを組み合わせた場合よりも生産性が高くなります。 現在、PCユーザーとインターネットユーザーの数が増えており、コアの数も増えています。 もちろん、この数(16エクサフロップス)は理想的で、だれも24時間365日を計算しませんが、各ユーザーが1日に少なくとも2分を計算すると(原則として実際よりも長い)、そのようなネットワークはIBM Sequoiaと比較されます。
最近では、JavaScriptの分散ブラウザコンピューティングネットワークは現実のものではありません。
この記事は1年前の私の記事の論理的な続きです:
Javascriptでの分散コンピューティング1年前に何が変わったのか、1年前にコンピューターネットワークを作成できなかったのは何ですか?1年でほとんどすべての優れたブラウザーは、WebWorkers、localStorage、SQL DB、IndexedDBを受け取りました。 メインスレッドでJavaScriptを計算し、1年前にFlash Storageを使用することを妨げるものは何もありませんでしたが、メインスレッドでの計算は驚くべき遅れの原因であり、Flash Storageの容量は限られています。 1年前には、障害のある分散ネットワーク、laguy、crutch、intrusiveがありました。
これで、WebWorkersを使用して、1番目のプロセッサコアのリソースを100%使用できます。2つのワーカー、2つのコアの場合(コア間の作業の分散は、特定のブラウザーでのワーカーの実装に依存します)。 格納されるデータの量に実質的に制限はありません:50MB IndexedDB(Firefox)+ 5MB localStorage +その他のストレージ。 これらの55 + MBは、タスクデータと中間データを保存するのに十分です。 2011年の2010年の終わりに、Node.jsはすぐに異常な状態になり始めました。 これは、分散コンピューティングサーバーに最適なソリューションだと思います。
適切なテクノロジーNode.js + WebWorkers + localStorage + IndexedDB。 2,000,000,000人のインターネットユーザーが増加しています。 コアの数は増加しており、生産性は向上しています。 毎月、ブラウザはどんどん高速になっています。 今こそ、16エクサフロップスの未使用容量のストリームを正しい方向に向ける時です!
ネットワーククライアントはどこに埋め込むことができますか?
ページを表示している間、プロセッサは10〜20%でロードされ、YouTubeからビデオを見ている間、プロセッサは30〜50%でロードされます(これ以上は考えません)。 プロセッサをロードできる広告と迷惑なフラッシュバナーを監視する必要があります。 迷惑なバナーや広告を表示する代わりに、善行を計算するように求められます。YouTubeからビデオを視聴し、この時点でブラウザーはFolding @ homeのタンパク質折りたたみを計算します。 お気に入りのファイルホスティングサービスからファイルをダウンロードしているときに、ブラウザが有用なものを計算している間、広告を見ないことを想像してください(adBlockについてはよく知っています)。 この記事を読んでいるときに、ブラウザが有用なものを計算していると想像してください。 さらに、サイトにアクセスする各ユーザーは、サイトに役立つ何か、社会に収入や利益をもたらすことができる何かをします。 ユートピアですが、実現可能です。
何を計算できますか?
数値のしきい値を必要とするタスク:徹底的な検索のタスク、ニューラルネットワークのトレーニングなど。
アムダールの法則によれば
、分散コンピューティングはタスクに逐次計算がない場合にのみ最も効果的であるため、並列計算されます。 あるノードの計算は、別のノードのデータに依存しません。
面白い? そのようなネットワークを作りましょう!
分散コンピューティングの例:md5ハッシュからのパスワード推測
例では、このタスクに選択できるネットワークアーキテクチャを示します。 md5ハッシュから長さが8文字以下のアルファベット、96文字以下のアルファベットを選択します。 何らかの方法で問題が徹底的な検索によってのみ解決されることは明らかです。 パスワード辞書やトリッキーなスキームは使用しません-ただつぶします。
タスク配布
最大96
8個の潜在的なパスワードがあります。 各パスワードに1から96までの10進法で数字を付けましょう。 現在、各パスワードは、トリッキーな変換とアルファベットを使用して、
from10toN
を96
from10toN
(
from10toN
)に変換することで取得できます。
var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL" + "MNOPQRSTUVWXYZ+/*-\\?=`~!@#$%^&*()_{}[];:'\"|.,<> ", alphabetLength = alphabet.length; function from10toN (number, base) { if (!base || base > alphabetLength) { base = alphabetLength; } if (base < 2) { base = 2; } var result = ''; while (number > 0) { result = alphabet.charAt(number % base) + result; number = Math.floor(number / base); } return result; }
各タスクには、選択のために400,000個のパスワードの間隔が含まれます(Google Chromeは1秒間に約200,000 md5を計算します)。 合計で、18034739475のタスクがあります-多くの場合、16文字のパスワードの場合ほど絶望的ではありません...クライアントがタスクを引き受けたが、完了しなかった可能性があります。 タスクごとに、有効期限が切れるまでの時間を追加します-有効期限。
ネットワーククライアントのロジックは基本的です。md5が見つかるたびにN1からN2のパスワードを並べ替えるサイクルで、受信したハッシュを標準と比較します。 ハッシュが一致する場合、パスワードをサーバーに送信し、そうでない場合は空の行を送信します。
EcdcWorker.prototype.calculateSync = function (id, data) { var maxPasswordId = data.max, password, alphabetBase = data.base, hash = data.hash; for (var i = data.min; i <= maxPasswordId; i++) {
顧客ロジック
1.クライアントがサーバーにアクセスし、ログインします
2.クライアントがコンピューティングスクリプトおよびその他の中間ロジックをロードします
3.クライアントは、廃止されたタスクをリポジトリから削除します
4.クライアントはワーカーを起動します(その数は設定によって異なります)
5.クライアントは、完了したがサーバーに配信されなかった(リポジトリ内の)タスクを確認します-これらのタスクをワーカー経由で送信します
6.各ワーカーはサーバーからタスクを要求するか、クライアントを介してストレージから未処理のタスクを取得します(1つ以上)
7.クライアントは、タスクをリポジトリに保存します(ページがリロードされた場合)
8.各ワーカーは自分のタスクを計算し始めます
9.タスクの計算が完了すると、ワーカーはソリューションをリポジトリに保存します(ページがリロードされるか、サーバーが利用できない場合)
10.ワーカーはサーバーにソリューションを送信します(ポイント6以降)。
クライアントがタスクを実行している間、他のクライアント(同じブラウザーの他のページのスクリプト)はブロックされます。
サーバーロジック
1.サーバーはクライアントを認証します
2.ワーカーからタスクリクエストが送信されます-サーバーは廃止されたタスクをチェックし、存在する場合はクライアントに送信します
2.1。 廃止されたタスクがない場合-新しいタスクを作成し、クライアントに送信します
3.ワーカーはタスクに応答を送信します-サーバーは応答を確認し、タスクに完了のマークを付けます
3.1。 サーバーは新しいタスクをワーカーに送信します(ポイント2からなど)。
4.サーバーがワーカーから正しい答えを受け取るとすぐに、サーバーは動作を停止しません-タスクを発行しません
一般的なスキーム
[Workers: EcdcWorker] / \ Tasks: XHR / \ Messages: postMessage / Page: html \ [Server: EcdcServer] ------------ [Browser: EcdcClient] --- [User] | | [Database: Any] [Storage: localStorage]
上記はMD5 Brutforsサーバーの動作の簡単な図でしたが、分散コンピューティングネットワークを構築するためのフレームワークを使用して図を実装することは実際に可能です
JavaScript ECDC結果
ここで私に起こったことを見ることができます:
md5ハッシュからパスワードピッカーサーバー (「あなたは不正です。ログイン」というメッセージを初めて取得したとき)、
任意の電子メールまたは任意の名前を使用でき、統計を保持するために使用されます-計算量への貢献(md5ハッシュとして保存) 。
パスワードの統計情報は
ここにあります (許可が必要です)。
ネットワーククライアントは、Workers、localStorage、JSON、XMLHttpRequestをサポートするブラウザーでのみ動作します。 「あなたはmd5を計算しています」というフレーズを入力すると、計算に関与することになります。 私は労働者の仕事のログをオンにしました。あなたは彼らがどんなコンソールで何をしているのかを見ることができます。
ページに計算フレームを埋め込むことができます;そのコードはメインページのソースにあります。
参照資料
1.
パスワード推測サーバーの動作例2.
パスワード選択の統計 (主なものには承認が必要です)
3.
分散コンピューティングネットワークを作成するためのJavaScriptフレームワーク4.例のサーバーソースコード:
md5-bruteforce-server.js 、
md5-bruteforce-server /おわりに
システムは、その実行可能性を証明しました(テストでは、3文字のパスワードを選択しましたが、真剣に!)。ノードスターのホスティングの可能性を確認するために、十分な量のユーザーでテストすることに変わりはありません。
分散コンピューティングに参加していますか? ブラウザの分散コンピューティングネットワークには未来があると思いますか? 広告を見たりYouTubeビデオを見たりするのではなく、何か有用なものを計算したいですか?
批判、提案、提案は大歓迎です!