Bir tarayıcı madenciliği kodunu simüle ettim, çok karmaşık değil ama yanlış gitme

Takip etmek için tıklayın InfoQ , Yapışkan resmi hesap

Programcının saat 8'de teknik kahvaltısını alın

Yazar Ben

Editör Martin, Guo Lei

Kaynak Mimari hakkında konuşun

Son Bitcoin yangını ve blok zinciri yangını ... Dün endişeyle internete maruz kalmamış dördüncü sınıf bir şehirdeki ilkokul sınıf arkadaşım beni aradı ve bu blok zinciri dalgasında nasıl para kazanması gerektiğini sordu.

Mimariden bahsetmeden önce, blockchain teknolojisini tanıtmak için bir dizi makale yayınladım.Bunu düşünmek gerçekten ilginç.Okuma hacmi yüksek değil, ancak şimdi birçok blockchain medyası aniden ortaya çıktı. Elbette, blockchain teknolojisi hakkında raporlamaya odaklanan halka açık bir hesap da yaptık: blockchain ileri karakolu.Herkesin dikkatine hoş geldiniz.

Daha önce pek çok kişinin böyle bir haberi fark ettiğini tahmin ediyorum, hızla yükselen Bitcoin'i gördükten sonra bazı yetişkin web siteleri madencilik hakkında düşünmeye başladı. Madencilik kodunu web sitelerinde gizlice gizlerler ve kullanıcılar bu web sitelerini ziyaret ettiklerinde, bu madencilik kodlarını bilmeden hızlı bir şekilde çalıştırırlar, kullanıcı tarayıcıyı kapattıktan sonra bile ilgili kod çalışmaya devam edebilir ve CPU kaynaklarını ele alın.

Bugün bu çevrilmiş bir makale.Yazar Ben, üst düzey bir yabancı geliştiricidir. Haberleri gördükten sonra derin düşüncelere daldı. Başka bir bakış açısıyla, Madencilik için değilse, ancak dünyanın web tarayıcılarını web soketleri aracılığıyla bağlamaksa, bir "süper bilgisayar" oluşturabilir ve bu süper bilgisayarı dağıtılmış sorunları çözmek için kullanabilir mi?

Böylece yeni bir girişim başlattı. Sohbet mimarisi bu makaleyi tercüme etti, aşağıdaki tam metin.

Önüne yaz

Tartışmalı bir konuyu - web sitesi ziyaretçilerinin tarayıcılarından bilgi işlem kaynaklarının nasıl "çalınacağını" tartışacağız. Tarayıcının dijital para birimi madenciliği yapmak için nasıl kullanılacağına dair birçok tartışma var, ancak bu konuların tartışmasına katılmak istemiyorum, sadece bilgi işlem kaynaklarını etkili bir şekilde kullanmanın bir yolunu keşfetmek istiyorum.

Web tarayıcılarının kod yürütme yeteneği giderek güçleniyor. JavaScript'in geliştirilmesi, WebAssembly'nin ortaya çıkışı, GPU erişiminin iyileştirilmesi ve iş parçacığı modellerinin evrimi, bu faktörler bir araya gelerek tarayıcılara bilgisayarlarla aynı güçlü bilgi işlem gücünü verir. Tarayıcı dijital para madenciliği makinelerinin yükselişiyle birlikte, böyle bir sorun hakkında da düşünüyorum: dünyanın bilgi işlem kaynaklarını tek bir varlığa - web sitesi ziyaretçilerinin tarayıcılarından oluşan bir süper bilgisayara nasıl entegre edebilirim?

Tıpkı sıradan bir bilgisayar kümesi gibi, bu süper bilgisayarın tüm hesaplama düğümleri koordinasyon altında bir sorunu çözmek için birlikte çalışır. Ancak sıradan bilgisayar kümelerinden farklı olarak, bu bilgi işlem düğümleri geçicidir (web sitesi ziyaretçileri gelir ve gider) ve daha önce birbirleriyle konuşamazlar (siteler arası istek yoktur).

Bu düşündüğüm bir örnek:

Sağ tarafta süper bilgisayar kontrol sunucusu var. Solda belirli bir web sitesini ziyaret eden tarayıcı, bu süper bilgisayardaki bir düğümdür ve CPU indeksi de üzerinde görüntülenir.

Bu süper bilgisayar tarafından çözülmesi gereken sorun, verilen bir hash değerinin orijinal değerini bulmaktır. Şekilden de görülebileceği gibi, hesaplamaya toplam 23 düğüm katıldı, hesaplandı ve hesaplandı ve karşılaştırıldı 380.204.032 hash değeri ABD'den gelen ziyaretçilerin işlem gücünün% 50'sine katkıda bulundu.

Kod

Burada, websocket teknolojisi esas olarak sunucu ile bilgi işlem düğümü arasında kalıcı bir bağlantı kurmak için kullanılır. Bu bağlantılar, düğümlerin davranışlarını koordine etmek için kullanılır, böylece kooperatif varlıklar haline gelirler. websocket, kodu ve işbirliğine dayalı mesajları ileterek her şeyi mümkün kılar.

Websocket'in ortaya çıkışı, Web istemcilerinin davranışını önemli ölçüde değiştirdi. İstemci web sitesine bağlanır, önce önceden tanımlanmış JavaScript'i çalıştırır ve websocket bağlantısı kurulduktan sonra diğer tüm JavaScript komut dosyalarını çalıştırabilir.

Aşağıdaki şeklin sağ tarafı süper bilgisayar kontrol sunucusudur ve sol tarafı dinamik komutları alan Web istemcisidir.

Bir Uygulama Web Görünümü kullanıyorsa, JavaScript doğrudan Uygulama içinde çalışabilir, yani websocket aracılığıyla iletilen kod Web Görünümünü atlayabilir ve doğrudan Uygulamanın etki alanına girebilir.

Aşağıdaki şeklin sağ tarafı süper bilgisayar kontrol sunucusudur ve sol tarafı talimatları alan Web Uygulamasıdır. Talimatların doğrudan Uygulama katmanına nüfuz ettiği görülebilir.

Geri kalanıyla ilgili yeni bir şey yok. Uygulama, CC protokolü (Botnet Command and Control) aracılığıyla talimatlar alabilir ve web sayfası ilk yüklemeden sonra JavaScript komut dosyalarını dinamik olarak alabilirken, websocket gerçekten dinamiktir (Ajax'ın sorgulama çekme modunun aksine) ve birden fazla tarayıcıyı kapsayabilir Ve ekipmanın çalışması ve çalışma ortamına tam erişim.

Bu nedenle, komut kodlarını websocket aracılığıyla hesaplama düğümlerine iletebiliriz ve tabii ki dağıtılmış koordinasyonu elde etmek için mesajları iletmek için de kullanılabilir.

Crackzor.js

Altı yıl önce, crackzor adlı OpenMPI tabanlı dağıtılmış bir parola kırıcı (ben.akrin.com/?p=1424) geliştirdim.

Parola kırma çok tipik bir dağıtılmış problemdir, basittir, karakterleri permütasyon ve birleştirerek parolayı tahmin etmektir. Crackzor'u JavaScript'te yeniden yazdım ve OpenMPI'yi websocket ile değiştirdim.

Bununla birlikte, dağıtılmış her problem farklıdır ve crackzor tüm sorunları çözmek için iyi bir yol değildir. Crackzor'un büyüsü esnekliğinde yatar: Bir karakter düzenlemesini ve kombinasyon alanını birçok bloğa böler ve sonra bu blokları hesaplama düğümlerine tahsis eder. Çözülecek problem çözüldükten ve yinelemenin başlangıç ve bitiş konumları verildikten sonra, düğümler kendilerine karakter permütasyonları ve kombinasyonları sağlamadan çalışmaya başlayabilir, böylece ağ bant genişliği darboğazları olmaz.

İlk soru: düğümün CPU'sunun kullanımı nasıl en üst düzeye çıkarılır

JavaScript varsayılan olarak tek iş parçacıklı bir model kullanır ve kod istemciye websocket aracılığıyla iletilir ve varsayılan olarak CPU'nun yalnızca bir çekirdeği kullanılır. Günümüzde çoğu bilgisayar CPU'su çok çekirdekli, bu yüzden tüm bu CPU'ları kullanmanın bir yolunu bulmalıyız.

Böylece kurtarıcı ortaya çıktı - Web Çalışanı. HTML 5, çoklu iş parçacığının uygulanmasını büyük ölçüde basitleştiren bu özelliği sağlar. Ancak yine de bir sorunu çözmemiz gerekiyor. Web Çalışanı belgeleri bize dosyalardan komut dosyası yüklememizi söyler, ancak kodumuz websocket aracılığıyla aktarılır ve bellekte bulunur, bu nedenle kodu komut dosyasını belirterek doğrudan yürütemeyiz.

Kodu bir Blob nesnesine sararak bu sorunu çözüyoruz:

var worker_code = 'alert ("bu kod düğümlerde işlenir");' window.URL = window.URL || window.webkitURL; var blob; {blob = new Blob (\, {type: 'application / javascript '});} catch (e) {window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; blob = new BlobBuilder; blob.append (worker_code); blob = blob.getBlob;} worker.push (yeni Çalışan (URL.createObjectURL (blob)));

İkinci soru: görevleri düğümler arasında dağıtın

Websocket sunucusu, sonraki koordinasyon çalışmalarının çoğunu üstlenir. Düğümlere erişim ve çıkışları ve bir düğümün bilgi işlem görevleri gerçekleştirip gerçekleştirmediğini izlemesi ve kullanılabilir düğümler olduğunda bunlara görevler ataması gerekir.

Sunucunun her zaman çalışıyor olması ve düğümlerden gelen bağlantıları ele alması gerekir. Ancak bu süper bilgisayarın her gün farklı sorunları çözmesi gerekebilir. Bu amaçla, dosyayı okumak ve dosyadaki kodu çalıştırmak için bir fonksiyon yazdım. Bu işlev, bir işlem tarafından adlandırılır.

function eval \ _code \ _from_file {if (! file_exists ("/ tmp / code")) {console.log ("hata: dosya / tmp / kod mevcut değil");} else {var code = read_file ("/ tmp / code "); code = code.toString; eval (kod);}} process.on ('SIGUSR1', eval \ _code \ _from_file.bind);

Bu işlevle, bir dahaki sefere eski işlemi sonlandırabilir ve yeni kodu yüklemek için yeni işlemi kullanabilirim. Bu, çalışma zamanı ortamına tam erişimimiz olduğu sürece herhangi bir zamanda herhangi bir kodu çalıştırmamıza izin veren JavaScript'in esnekliğinden kaynaklanmaktadır.

Görevleri düğümlere dağıtmak da çok basittir.Sunucuya bağlanırken istemcinin bir geri arama işlevi kaydetmesine izin verin ve ardından geri arama işlevindeki kodu çalıştırın.

Örneğin müşteri:

var websocket_client = io.connect (" websocket_client.on ("eval_callback", function (data) {data = atob (data), eval (data)}. bind);

Servis Terminali:

client_socket.emit ("eval_callback", new Buffer ("alert ('bu kod istemcide çalışacak');"). toSt

şimdiye kadar:

  • Tüm geçici düğümler (web sitesi kullanıcılarının web tarayıcıları) websocket sunucusuna bağlıdır;

  • Websocket sunucusunun işlem sinyalleri aracılığıyla yeni kodu çalıştırmasına izin verin;

  • Yeni kod, düğümün çözmesi gereken yeni sorunları içerir;

  • Yeni kod, websocket sunucusuna düğümleri nasıl koordine edeceğini söyler;

  • Bir düğüm sorunu çözdüğünde, sonraki soruna geçin;

  • Artık bir web tarayıcısı kullanarak nasıl süper bilgisayar yapılacağını biliyoruz. Okunabilirlik, güvenlik ve karmaşıklık gibi birçok nedenden dolayı, tüm kodumu herkese açık hale getirmek istemiyorum. Ancak ilgilenen varsa benimle iletişime geçebilirsin, daha fazla fikir paylaşmaktan mutluluk duyarım.

    Daha fazla ipucu

    • Bir görevi bölerken görev çok büyük olamaz. Düğümler geçici olduğu için, görev çok ağırsa, kesintiye uğrama olasılığı çok yüksektir. Çoğu web tarayıcısı, çok yoğun kaynak gerektiren kodun yürütülmesini reddeder veya sonlandırır ve küçük görevler, kesinti olmaksızın birkaç saniye içinde tamamlanabilir.

    • MD5'i uygulamak için JavaScript kullanın: https://gist.github.com/josedaniel/951664.

    • Düğümün sorunu çözmesi için geçen ortalama süreyi kaydedin ve "süper bilgisayarın" genel performansını etkilememek için yavaş çalışan düğümü hariç tutun.

    Song Hye Kyo gece geç saatlerde adamla yüzüğü olmayan soğuk bir ifadeyle fotoğraf çekti, ancak Song Joong Ki'nin son fotoğrafı mutluydu
    önceki
    "Final Fantasy 15" hızlı yükseltme yöntemi
    Sonraki
    Toprak yiyenler için mutlaka görülmesi gereken, mevsim için hassas kas bitkilerinin listesi
    Yang Yang, infazcılar listesine dahil edildi.Fanlar nedenleri açıkladı ve taşındı: Yanlış bir şey yapmadı mı?
    Ah Sa, üç kuşaktan zengin bir erkek arkadaşıyla evlenecek ve erkek arkadaşı, sadece bir ödül kazanma hayalini gerçekleştirmek için yıl sonunda düğün tarihini mi belirleyecek?
    A-pay pazar politikası kademeli olarak ayarlanır ve Yeni Üçüncü Kurul'daki şirketler için bırakılan halka arz sayısı giderek daha az olabilir
    Aralık 2016'da Hong Kong sunucusu PS + üyeleri için ücretsiz oyunlar
    2498 yuan olarak fiyatlandırılan Insta 360 ONE X panoramik kamera resmi olarak piyasaya sürüldü
    Hu Shiwei ile diyalog: Üç büyük devlete ait bankanın hisselerini aynı anda aldıktan sonra, dördüncü paradigma yapay zekanın değerini işletmelere sunmalıdır.
    "Doğu Sarayı" Zhao Sese, defalarca Xiaofeng için potu taşıdıktan sonra siyaha döndü ve kalbini aşka adayan en acınası oydu.
    190326 "1987 It's" imza etkinliğine geri dönüp, Yifeng Baby Who Şüphe Eden Yifeng'e imza atıyor.
    Amerikan dizisi "Game of Thrones": Yaşlandıkça oyunculuk becerileriniz daha kötü olacak? Bran nasıl yüz felç oldu?
    Mobil oyunlar için doğan Xiaomi, Black Shark Technology'ye yatırım yaptı.
    Razer Phone 2 resmi olarak piyasaya sürüldü: Snapdragon 845 amiral gemisi 120Hz yenileme hızı kullanıyor
    To Top