Bir önceki makalemizde enGrehberin bir Big Data, Machine Learning ve Deep Learning projesi olduğundan bahsetmiştim.
Geçen zamanda enGrehberin 3. sürümü için aşağıdaki Web 3.0 teknolojilerini kullanacağımız kesinleşti:
Mobil için React Native
Web için React
Üyelik sistemi olarak SSI (Trinsic) kullanacağız, ve geleneksel kullanıcı adı ve şifre üyeliğini Smart Contract’larla implemente edeceğiz. Ama kişisel verileri Cassandra’da depolamamız gerekiyor.
Backend’in %90’ını Ethereum Smart Contract’ları ile hazırlayacağız. Geliştirim için NodeJS, Solidity ve Truffle kullanacağız.
Verileri decentralized Cassandra veritabanında depolayacağız. Tabi Smart Contract’lar ile Cassandra’yı konuşturmayı başarmamız lazım.
Video ve resimleri IPFS ile depolayacağız. Yani Storage çözümümüz de Blockchain üzerinde olacak.
Yapay Zeka için merkezi Python backend, Bot Framework, Azure Bot Service ve Google Dialogflow kullanacağız.
Böyle yaptığımızda Frontend %90 oranında Trinsic ve DApp ile konuşacak. Böylece tüm uygulamanın %90’ı merkeziyetsiz Web 3.0 olarak çalışacak. Ama merkezi Python backend tarafı eski tekniklerle çalışmaya devam edecek.
İçişleri Bakanlığı sponsorluğunda devam eden enGrehber projesi için hangi teknolojileri kullanmam gerektiği konusunda nihai kararı verdiğime inanıyorum.
Öncelikle öğrenme güdüsüyle, çözüme en kısa yoldan ulaşma hedefi arasında sağlıklı karar vermek gerekiyor. Öğrenme amacıyla bulaştığımız teknolojiler böylesine bir projeyi bitmek bilmez ve yıldırıcı bir engele dönüştürme ihtimali vardır.
Big Data, Machine Learning ve Deep Learning projelerinde Python tercih edilir. Ben de o yüzden Backend katmanını tamamen Python’la hazırlamaya karar verdim. Daha önce .NET Core ile hazırladığım backendi Python’a dönüştüreceğim. Böylece on-premise yapay zeka çözümü geliştirmek mümkün olacak. IoT projelerinde de big data söz konusudur. Milyonlarca küçük cihazdan akan verilerin depolanması ve bunlar üzerinde yapılan madencilik ve analiz çalışmalarında Python’un güçlü olduğunu ve yaygın olarak kullanıldığını biliyoruz.
Big Data projelerinde HBase, Cassandra ve MongoDB veritabanları tercih edilir. HBase’de yüksek performanslı sorgulama yapmak isterseniz yabancı olduğum değişik bir protokol kullanmanız gerekiyor. MongoDB ise çok büyük projeler için uygun değil çünkü hem yüksek transaction desteklemiyor hem de satır başına veri büyüklüğü en fazla 16 MB olduğu için veritabanında resim ve video depolamanız neredeyse olanaksız. Ama Cassandra hem SQL’e çok benzeyen CQL sayesinde kolayca kullanılabilir hem de küçük dosyaları Cassandra’da depolayabiliyoruz.
BlockChain projelerinde NodeJS ve Solidity kullanılmaktadır. Ethereum blockchain PoW, PoS ve PoA algoritmalarının tümünü desteklemektedir. Biz yüksek performans için PoA tercih edeceğiz. HyperLedger Besu, Truffle, NodeJS ve Solidity ile DApp uygulamamızı hazırlayabiliyoruz.
Hybrid mi Native mi? Kesinlikle Native ama bir sorun var. Tasarım yapamıyorum ve React Native’in gerçekten çok inatçı bugları var. O yüzden React/Ionic‘teki mevcut tasarımla devam edersem hem web hem de mobilin ikisini birden çıkarmak bana acayip zaman kazandırıyor. Tek çalışma yapıyorum web ve mobil hazır oluyor. Dezavantajı nedir peki? Ionic projeleri telefonlarda biraz yavaş çalışıyor, aslında proje büyük olursa bu yavaşlığı belirgin derecede hissedebiliyorsunuz. Ancak Facebook ve Twitter dahi hybrid uygulamayla piyasada bulunuyor. Native’e geçmeyi gelecekte tekrar düşüneceğiz, öncelikli hedefim toplamdaki çalışmayı hızlandırmak.
Burada bir sorunumuz daha var: Her ne kadar Twitter ve Facebook uygulamaları hybrid te olsa Jitsi toplantı uygulaması mobilde React Native ile yapılmış. Video ve animasyon içeren uygulamaların native olması önemli bir performans getirisi sağlıyor. Ancak daha önceki testlerimde hybrid mobil uygulamaların 4 adet canlı videoyu aynı anda görüntüleyebildiğini tespit ettim, ısınma sorunları oluyor ama Ionic ile canlı toplantıyı başarabiliriz.
Buradaki bir diğer sorun Ionic ile toplantı yapılırken arama geldiğinde veya görüşme arka plana alındığında problemler oluşuyor olması. Ancak bu problemler React Native’de de var.
Ionic ile ilgili bir diğer problem: bildirimler. Web push bildirimleri iOS’ta çalışmıyor ve Firebase kütüphaneleri gerçekten sıkıntılı, sanırım bu konuyu profesyonel bir firmadan bildirim hizmeti alarak çözeceğiz.
Dosya Storage’ı için BlockChain tabanlı IPFS‘e bakacağım. IPFS en iyi GoLang’le çalışıyor ama NodeJS de destekliyor.
Mimari nasıl olmalı? Kesinlikle mikro servis mimarisi olmalı. Çünkü mikro servis mimarisi yüksek yük kaldırabiliyor. Sanallaştırma için Kubernetes ve Docker tercih ediyorum. Yerelde Minikube ile çalışma yapmak mümkün. Ayrıca kod mimarisi için NX kullanacağım, buna kesin karar verdim. NX’in Python’la sıkıntısı var, ama bunu aşmayı başardım.
Stratejimiz Ne?
Neden bu teknolojileri tercih ettik?
Bu tercihlerimle projemizi ister yurtdışı bulutunda, istersem Ethereum MainNet’inde istersem de yurtiçi bulutunda deploy edebiliyorum. Ki nihayi hedefimiz yurtiçi bulutuna taşınmak olduğu için tercihlerimi böyle yaptım.
Media Server kullanacak mıyız?
Güvenlik için media server çok gerekli. Fakat muazzam bir bant-genişliği maliyetine neden oluyor. O yüzden başlangıçta Media Server kullanmayacağız. Böylece bu projeyi TV reklamlarında görseniz dahi gelen trafiği kolay müdahelelerle kaldırabilecek şekilde tasarlayacağım.
gRPC kullanmayacağız, Rest ve WebSockets kullanacağız, ama neden?
Anlık mesajlaşma bölümünde ve Mikro servis mimarisinde iletişim için gRPC kullanmayacağız Rest ve WebSockets kullanacağız. gRPC yerine WebSocket’i tercih ediyorum çünkü gRPC realtime değil.
ÖZET:
enGrehber’in yeni sürümünde kullanacağımız teknolojiler özetle şöyle:
Bildiğiniz üzere ben eskiden İş-Kur Nitelikli Bilişim Uzmanı Eğitimcisiydim. Ancak o sektörü bıraktım, şu an yazılımcıyım.
Fakat geçen zamanda yazılım dünyası öyle hızlı gelişti ki, bizler all-in-one developerlar olmaya zorlandık. Ancak bu akşam bunun pek te mümkün olmadığını anladım.
Genç öğrencilere tavsiyelerde bulunacağım. Bilişimde ya tasarımcısınızdır, ya donanımcısınızdır, ya yazılımcısınızdır, ya içerikçisinizdir ya da yöneticisinizdir.
Hemen yöneticiliğe kalkışmayın, yöneticilik olgunluk ve saygınlık ister, ileri yaşlarda tercih edilmesi daha doğru olur.
Tasarım ve İçerik alanlarıyla pek ilgilenmiyorum. Tasarımda Photoshop gibi Adobe yazılımları daha çok tercih edilirken, içerikte Metin Yazarlığı, Sosyal Medya Yönetimi gibi alanlar var.
Donanımla da pek ilgilenmiyorum. Burada Sistem, Ağ ve Siber Güvenlik alanları var. Ayrıca Devops Mühendisleri ile de yakınlığı var. Bir de SEO alanı var, bu da Satış ve Pazarlama ile ilgili bir alan, İçerik alanını da ilgilendiriyor çünkü Google içeriğe de bakıyor.
Eğer Proje Yöneticisiyseniz PMP ve Agile Scrum bilmeniz gerekir.
Benim asıl ilgilendiğim kısım YAZILIM. İş-Kur eğitimlerinde Yazılım eğitimi all-in-one bir eğitimdi. Hala da öyle. Ancak sonradan o kadar çok teknoloji gelişti ki bu yazılım alanının birden fazla mesleğe ve eğitime ayrıştırılması zorunluluk hale geldi.
Ne Gibi?
Öncelikle Yazılım Mimarı diye bir meslek var. Ne yapar? Büyük bir projeyi ayrıntılarıyla teknik olarak tasarlar. Bu proje hangi teknolojilerle yapılmalıdır, hangi mimarisel tasarım kalıpları kullanılmalıdır bunlara karar verir.
Yazılımla İlgili Meslekler ve Eğitimleri:
Proje Yöneticisi/Scrum Master: Proje planlama ve yönetimini bilir, metodolojilerini bilir, projeyi Agile Scrum gibi metodolojilerle yürütür ve zamanında teslim eder.
Yazılım Mimarı: Büyük projelerin teknolojilerini ve teknik bileşenlerini entegrasyonlarıyla birlikte planlar ve tasarlar. Mimarisel Tasarım Kalıplarına hakimdir.
Ağ ve Siber Güvenlik Uzmanı: Bir firmanın tüm networkü istemci ve sunucu bilgisayarlarını kurabilir, bakım ve tamirini yapabilir, network kurulumunu, kablolu ve kablosuz ağ kurumlarını, yazıcıları, telefonları, switch’leri ve diğer gerekli tüm donanımları kurup ayarlayabilir ve tüm sistemin siber saldırılara, yapay zeka saldırılarına karşı güvenliğini ve yedeklemesini sağlar. En azından Azure bilir.
Devops Uzmanı: Yazılım ekibinin çalışma ortamını hazırlar ve bakımını yapar, CI/CD altyapısını kurar, sanallaştırma teknolojilerine çok hakimdir, Docker, Kubernetes ve OpenShift bilir, bunların bakım ve güvenliğinden sorumludur. Production’daki sanallaştırma ve güncellemeleri yönetir.
Backend Geliştirici: Java Spring uzmanıdır. Veritabanı olarak MongoDB, Cassandra gibi Big Data veritabanları tercih edilir. Design Patternleri, Unit Test’i bilir ve IoT bilir.
Full Stack Geliştirici: MongoDB, Express, NodeJS, React uzmanıdır. Mobil de eklenecekse React Native öğretilir.
Mobil Uygulama Geliştiricisi: Hybrid ve Native uygulama konseptlerini bilir, React Native (TypeScript) uzmanıdır, Flutter da öğretilebilir. React Native expo ile birlikte kullanıldığında Mac gerektirmeden doğrudan iPhone’da test edilebilir.
Yapay Zeka Geliştiricisi: Python FastAPI ile yapay zeka, makine öğrenmesi, derin öğrenme alanlarında uzmandır. NLP ve Tensorflow da bilir. Robotlar ve Yapay Zeka çipleri ve donanımlarıyla da çalışabilir.
BlockChain Geliştiricisi: Decentralized ID’ler, Decentralized Uygulamalar, DeFi ve NFT hakkında uzmandır. NodeJS, Truffle, HyperLedger Fabric, HyperLedger Besu ve Solidity bilir.
Oyun Geliştiricisi: Unreal Engine, AR/VR ve Metaverse uzmanıdır. Swift ve Java/Kotlin ile native mobil oyun yazabilir.
Veri Bilimi ve İş Zekası Uzmanı: Veri bilimi denildiğinde akla Python gelir. Python ve ilgili kütüphaneleri ile Big Data (MongoDB) ve SQL Server gibi veritabanlarında veri analizi ve iş zekası (Power BI) çalışmalarında uzmandır.
Yazılım Test Uzmanı: End2End test otomasyonu yazabilir. Selenium bilir, BrowserStack bilir, test senaryolarını yazar, test datası vardır, mobil uygulama testlerinin nasıl yapıldığını bilir.
ERP Uzmanı: Microsoft, Logo, SAP’nin ERP yazılımlarını bilir; ve bunlar için yazılım geliştirebilir.
Sanırım bu kadar. C# neden yok? C# yapay zeka, veri bilimi ve blockchain’de henüz başarılı olamadı. Java, Python ve NodeJS daha popüler. Gençlerin buna ayak uydurması lazım. Ancak C#’tan vazgeçmeyeceksek onu nasıl konumlandırabiliriz? Backend Geliştirici (C#) diye bir eğitim olabilir.
Git, GitHub ve Firebase gibi teknolojileri tüm yazılımcıların bilmesi gerekir. Yani en azından frontendin Firebase’de bedava host edilebileceği ve Firebase’in ücretsiz mesajlaşma servisi anlatılmalıdır.
enGrehber projesine Trinsic parolasız üyelik sistemini dahil etmeye çalışırken şunu farkettim: Kişisel verilerimi Trinsic platformuna gönderiyor olmam blockchain üyelik sistemindeki ana fikri zedeliyor.
BlockChain üyelik standardı neden çıktı?
Trust Is Broken. En önemli gerekçe bu. Kişisel verileri hackerlardan, yapay zekalardan koruyamıyoruz. Parolalı sistemler hacklenebiliyor, veritabanlarına sızılabiliyor.
Çözüm olarak kişisel verileri dağıtık bir şekilde telefonlarda tutalım denilmiş. Fakat telefonlar da güvenli değil. Telefon hacklemek çok kolay. O yüzden datayı telefonlarda şifreleyerek tutmak gerekiyor.
Kişisel verileri bulutta ya da kendi veritabanımızda merkezi olarak tutmak güvenli değil. Ancak tutmanız gerekirse yine şifreleyerek tutmanızı öneririm.
Ana fikri anladınız mı?
Kişisel veriyi veritabanımda tutmadığım taktirde sistemim hacklense bile sistemimde çalınacak kişisel veri olmayacak.
Herkesin kişisel verisi kendi telefonunda şifrelenerek saklanacak.
Böylece hackerların 1 milyon kişisel veri elde etmek için 1 milyon telefon hacklemeleri gerekecek, pratikte bu bir insan için çok zor bir görev. Sadece yapay zeka ile yapılabilir ama siz kişisel verileri telefonda şifrelerseniz ellerine sadece şifrelenmiş veri geçecektir.
Trinsic ile ilgili problem ne?
Trinsic kişisel verileri bulutta da depoluyor. Eğer Trinsic hacklenirse tüm kişisel veriler çalınmış oluyor. O yüzden blockchain üyelik sisteminde merkezi olan bulut cüzdanlarını sevmiyor ve istemiyoruz. Decentralized olarak herkes kendi datasını kendi telefonunda saklarsa hackleme işi çok zorlaşıyor ve hacklerın yapay zeka kullanmaktan başka çaresi kalmıyor.
Yapay zeka ile hackleme ise telefondaki datayı şifreleyerek daha da zorlaştırılabilir. Böylece 1 milyon telefon yapay zeka ile hacklense bile ellerine sadece şifrelenmiş veri geçecektir. Üstelik veriler farklı farklı cüzdanlarda depolanabiliyor olacak. Yani hacklenecek cihaz ve uygulama kombinasyonu çok fazla oluyor.
Hackerların işini ne kadar zorlaştırdığımızı anladınız mı?
Trinsic ile connectionless VC kullanarak parolasız üyelik geliştirebilirsiniz. Ben bu akşam NodeJS Express örnek uygulamayı kullanarak enGrehber projesi için parolasız üyelik sistemini test ettim.
Trinsic’in ücretsiz sürümünde ayda 50 credential takasına ücretsiz izin veriyor. O yüzden Trinsic kullanacaksanız maliyetleri düşürmek için eski parolalı üyelik sistemi ile yeni parolasız üyelik sisteminin ikisini birden kullanıcılara sağlamanızı tavsiye ederim.
Ayrıca görme engelliler henüz bu tür QR kodu taratarak oturum açma işlevine hazırlıklı değiller. Engrehber projesinde ilk defa görme engelliler için bu QR kodlu üyelik sistemini test etmiş olacağız.
BlockChain üyelik sistemlerinde blockchain networkü kurmak için genellikle HyperLedger Indy yazılımı tercih edilir. HyperLedger Indy’yi birden fazla sunucuya yükleyerek bir blockchain ağı kurarsınız ve bu blockchain üzerinde Credential şablonlarını saklarsınız.
Bir web sitesi ve bir adet üyelik sistemi geliştirmek için birden fazla sunucu üzerine Indy networkü kurmayı istemeyiz, bunun yerine profesyonel Indy networkleri ile çalışmayı tercih ederiz. Ben Indicio networkünü tercih ediyorum. Indicio test, demo ve production network hizmetleri sağlıyor. Trinsic Indicio test networkünü desteklemektedir.
Production sistemlerinde hem Trinsic için ödeme yapmalısınız hem de Indicio için ödeme yapmalısınız. Biz bu makalede ücretsiz olan Indicio test networkünü kullanacağız ve Trinsic’in ücretsiz sürümünü kullanacağız.
Daha sonra Trinsic Studio’da bir organizasyon oluşturun. Organizasyon oluştururken Indicio Test Network’ünü seçin.
Bundan sonra Credential Template oluşturacağız. Yani üye olma formumuzdaki alanları tanımlayacağız. Ben iki alan tanımladım Full Name ve Email.
Son olarak Verification Template oluşturacağız. Ve bunu oluştururken Credential Template’imizin adını ve alanlarını gireceğiz, yani Full Name ve Email.
Şimdi zor kısmı başlıyor:
https://github.com/trinsic-id/verifier-reference-app adresinde örnek bir uygulama var. Ama uygulamanın modifiye edilmesi gerekiyor. Bu uygulama sanal Pasaport uygulaması. Ben bu uygulamayı alanları değiştirerek üye olma ve oturum açma uygulamasına dönüştürdüm.
Sonuçta şöyle bir ekran görüntüsü elde ettim:
Sol taraftaki bloktan üye olabiliyorsunuz, üye olmak için alanları dolduruyorsunuz ve Issue Member butonuna tıkladığınızda girmiş olduğunuz üyelik formu Trinsic Studio’ya ve mobil Trinsic cüzdanına transfer ediliyor.
Cüzdanınızda girmiş olduğunuz Full Name ve Email bilgilerini görebiliyorsunuz.
Daha sonra login olmak istediğinizde Verify Member butonuna tıklıyor ve açılan QR Kod’u tarıyorsunuz ve cüzdanınızdaki üyelik bilgilerinizi web sitesiyle paylaşıyorsunuz.
DİKKAT:
Üye olurken üyelik bilgilerini hiçbir şekilde veritabanıma kaydetmiyorum. Hacker’lara karşı güvendeyim. Üyelik bilgilerini Trinsic’e gönderiyorum.
Oturum açıldığında üyelik bilgilerini Session’a kaydedebilirim ve oturum kapandığında session bir süre sonra otomatik silinir. Yani üyelik bilgilerini veritabanıma kaydetmek zorunda değilim.
Dolayısıyla kişisel verileri kalıcı olarak depolamak zorunda değilim.
Üye olma formunda kullanıcıya Parola ve Parola Doğrula gibi alanlar getirmiyorum, çünkü BlockChain üyelik sistemi Parolasız Üyelik Sistemi’dir.
Bu sistem her türlü dijital kanıtlanabilir belge için kullanılabilir. Mesela sanal pasaport, sanal diploma, sanal kimlik kartı gibi.
Üye olma formundaki e-posta ve telefon numarası gibi alanları doğrulama işlemi halen ayrıca yapılması gerekmektedir (biz burda yapmadık).
2022 yılı başlarından bu yana BlockChain üyelik standardı üzerinde çalışıyorum. DID (di-ay-di diye okuyabilirsiniz.) yani Decentralized Identifiers ve Verifiable Credentials standartlarının ilk sürümü W3C tarafından yayınlandı ve ISO sertifikasyon süreçleri başladı.
Artık BlockChain üyelik sistemine geçebiliriz. Peki BlockChain üyelik sistemine neden ihtiyaç var?
Trust-Is-Broken: Geleneksel Hackerlara Karşı Daha Dirençli Kişisel verileri korumak çok zor, şirket içinden ve dışından veri sızdırmalarını tespit etmek çok maliyetli. Her an her yerde sızdıran kişisel verilerle ilgili haberler duyuyoruz. Sitelere kişisel verilerimizi bırakmak istemiyoruz. Şifre cehenneminden kurtulmak istiyoruz. Kişisel verilere karşı en iyi önlem ise onları veritabanımıza kaydetmemektir. İşte BlockChain üyelik sisteminde kişisel veriler mobil cüzdanınızda yani telefonunuzda ve bulut cüzdanlarda (örneğin e-devlette) depolanır, sizin siteniz çok az bir bilgi ile kişiyi tanır ve işlemlerini yapar. Böylece sizin veritabanınızda kişisel veri olmadığı için hackerlara karşı fazla endişelenmeniz gerekmez.
Immutable (Değişmez) Insert-Only Kayıt Sistemi BlockChain defterleri değişmez insert-only kayıt sistemleridir, böylece manipülasyon çok zordur. Güvenlik algoritmanız sağlamsa manipülasyon yapılamaz ve veriler değişmez olarak depolanır. BlockChain üyelik sistemlerinde BlockChain üzerine kişisel veri kaydedilmez, üyeliğin tanımı (alanlar) kaydedilir. Kişisel veriler ise cüzdanlara kaydedilir.
Web 3.0’a Geçiş BlockChain üyelik sistemi, DID, VC tüm bu yeni standartlar aslında Web 3.0 standartlarıdır. Meta’nın Metaverse projelerinde hali hazırda QR kodlu üyelik sistemleri görmekteyiz, işte W3C ve ISO bu QR kodlu Web 3.0 üyelik sistemlerine bir güvenlik ve altyapı standardı getirmişlerdir. Standartlarla uyumlu cüzdanlar e-devlet siteleriyle birlikte kullanılabilir ve aynı standartları kullanan her web sitesi ile uyumlu çalışır.
Yapay Zeka Dostu BlockChain üyelik sistemi yapay zeka dostudur. Yani kişisel veriler yapay zekalarca daha kolay okunabilir ve kullanılabilir, ayrıca kuantum yapay zekalar blockchain defterlerindeki güvenlik algoritmaları üzerinde kafa yorabilir. Böylece Web 3.0 backendden frontende yapay zeka tarafından daha anlaşılabilir bir altyapı ve standart getirmiş olmaktadır.
Bazı BlockChain Üyelik Sistemi Kavramları
ACA-Py (Aries Cloud Agents – Python): Python ile yazılmış Aries Bulut Ajanlarıdır. Eğer kişisel verileri bulutunuzda depolamak istiyorsanız ACA-Py ile başlayın. Ancak Trinsic’in ya da Evernym’in hazır bulut ajanlarını da kullanabilirsiniz.
AFJ (Aries Framework JavaScript): NodeJS ve React Native uygulamaları içindir. React Native ile mobil cüzdan hazırlamak isterseniz kullanabilirsiniz.
HyperLedger Aries: Kendi DID networkünüzü kurarsanız iletişim için Aries gereklidir.
HyperLedger Indy: Kendi DID networkünüzü kurarsanız üyelik tanımlarını kaydetmek için Indy gereklidir.
HyperLedger Ursa: Kendi DID ve VC networkünüzü kurarsanız dijital belgeleri kaydetmek için Ursa gereklidir.
Indicio ve Sovrin: Kendi DID networkünüzü kurmak yerine hali hazırda profesyonel DID networkü hizmeti veren organizasyonlardır.
Güvenliğin, performansın, desteğin ve sağlamlığın kritik olduğu projelerde hangi teknolojiler tercih edilmelidir?
2019 yılından bu yana geliştirmekte olduğum enGrehber projesi sayesinde hangi teknolojileri kullanmam gerektiği konusunda bolca düşünme fırsatı yakladım. Engrehber projesini başlangıçta bildiğim teknolojilerle hazırladım.
.NET Core, Angular ve Ionic kullandım.
Ancak bazı sorunlarla karşılaştım:
Ionic çok yavaş
Angular’ın mobil karşılığı yok
.NET Core yerli yapay zeka için uygun değil
SQL Server big data için uygun değil
Zamanla Engrehber bir Big Data, WebRTC, WebSocket ve BlockChain projesine dönüştü. Araştırmalarım neticesinde tüm bunları karşılayabilen aşağıdaki teknolojileri kullanmam gerektiğine karar verdim.
Big Data veritabanları MongoDB, HBase ve Cassandra’dır
Yerli Yapay Zeka üretmek istiyorsanız Python veya Java kullanmalısınız
React ve React Native ile kod paylaşımlı ve blockchain uyumlu proje geliştirmek daha kolaydır.
O yüzden Engrehber’in 3. sürümü için aşağıdakilerden birini tercih etmek mantıklı oldu
Python, React, React Native
Java, React, React Native
Python çok avantajları olan bir dildi. Ama çok eski ve çok yavaştı ve Finance, E-Commerce projelerinde çok tercih edilmiyor ama yapay zeka, blockchain DID ve veri bilimi için çok tercih ediliyordu.
Kamu ile projelerinde ise tartışmasız Java tercih ediliyordu ve Engrehber bir kamu projesiydi.
Yaptığım araştırmalarda:
Java ile yazılmış yapay zeka: OpenNLP
Java ile yazılmış big data veritabanı: Cassandra
Java ile kurumsal blockchain: HyperLedger Besu
yazılımları benim Java’yı tercih etmeme neden oldu. Buna karşın Tensorflow ve ACA-Py olmak üzere iki proje Python kullan diye bastırmaya devam ediyordu. Çünkü bunların Java SDK’ları stabillik garanti etmiyor.
Ancak buna karşın Siber Güvenliğin ve sağlamlığın kritik olduğu kamu projelerde mutlaka Java tercih ediliyor, üstelik Java Python’dan daha hızlı.
Engrehber projesi için Tensorflow şu an o kadar önemli olmasa da Aries Cloud Agent Py (ACA-Py) çok önemli, o yüzden Java, Python, TypeScript dillerinin üçünü de kullanmaya karar verdim.
Selfserve.indicio.tech Indicio Test Ağlarını kullanmaya başlamanızın bir bölümünde size yardımcı olmak için tasarlanmış bir web sitesidir. TestNet, ilk aracılarınızı, DID’lerinizi, Şemalarınızı vb. ayarlayarak ilk denemeleriniz içindir ve en yeni yükseltmeleri önce aldığı için ağlar arasında en güncel olanıdır. Uygulamanız hazır olduğunda DemoNet daha kararlıdır ve ilerlemeye hazır olduğunuzda son kullanıcı testleri ve demolar için güvenle kullanılabilir.
Sağlanan forma bir DID ve bir Verkey girebilmek için, forma sağlayacağınız bu öğeler için ortak anahtarların özel karşılıklarını saklayabilecek bir cüzdana sahip bir aracı yüklemeniz gerekecektir. Başka bir deyişle, SelfServe aracının bunları istenen Ağdaki deftere ekleyebilmesi için öğeleri kendi cüzdanınızda oluşturmanız gerekir. DID’yi oluşturmak için başka araçlar da kullanılabilirken, bu talimatlar size Ubuntu, Mac veya Windows’ta kendi cüzdanınıza erişim sağlayan bir komut satırı arabirimi olan indy-cli’yi yüklemek için adım adım bir kılavuz sağlayacaktır.
Bilgisayarınıza indy-cli’yi yükleyin Bu makalenin kaynağındaki talimatları izleyerek bilgisayarınıza Indy CLI’yi yükleyebilirsiniz. Kaynak bağlantısı için makalenin sonuna bakın.
indy-cli’yi Başlatın Platformunuz için aşağıdaki talimatları kullanarak indy-cli’nizi başlatın.
indy-cli --config cliconfig
Gerekirse TAA sözleşmelerini kabul etmek için ‘y’ yazın.
Havuzlar Oluşturun “Havuz oluşturmak” gerçekten sadece mevcut bir ağa (veya havuza) adlandırılmış bir bağlantı eklemektir. Yalnızca ihtiyacınız olanı oluşturmanız gerekir, ancak her biri için talimatlar şunlardır:
pool create testnet gen_txn_file=pool_transactions_testnet_genesis
pool create demonet gen_txn_file=pool_transactions_demonet_genesis
Bir havuz oluşturma, indy-cli’yi kurduğunuz her makinede her havuz için yalnızca bir kez yapılması gerekir. Havuz bağlantısı (aşağıdaki komut), indy-cli’yi her yeniden çalıştırdığınızda yapılmalıdır.
pool connect <pool-name>
pool connect testnet
Cüzdan Oluşturun ve Açın <wallet key> yalnızca sizin bilmeniz gereken güvenli bir anahtardır. Bu anahtar için tırnak işaretleri gerekli değildir. Daha sonra kullanmak üzere güvenli bir yerde saklayın. CLI’den komut çalıştırmanız gerektiğinde her zaman kullanacaksınız.
wallet create my_wallet key=<wallet key>
“wallet create”, makinenizdeki her cüzdan için yalnızca bir kez çalıştırılmalıdır. Aşağıdaki “wallet open” komutunun, indy-cli’yi her yeniden başlattığınızda ve bu cüzdandaki anahtarları kullanmak istediğinizde çalıştırılması gerekecektir.
wallet open my_wallet key=<wallet key>
Not: Bu kılavuzda kalan komutlar için cüzdanınızı açık tutun.
DID Oluşturun
did new
Bu komutun dönüşü, self servis web sayfasında ihtiyaç duyulan DID ve Verkey’dir. Cüzdanınızdaki tüm DID’leri görmek için did list kullanın. DID’nizin bağlı olduğunuz ağda (havuzunuz) olduğunu doğrulamak için ledger get-nym did=<your DID> kullanın. Lütfen “did new” komutuna bir seed=<32 character secret seed> ekleyebileceğinizi unutmayın. Tohum parametresi, gerekirse DID’nizi farklı bir cüzdanda yeniden oluşturmanıza olanak tanır. seed parametresi gerekli değildir ve test ağlarında gerekli olmayabilir, ancak üretim ağında kullanılan demolar veya DID’ler için gereken DID’ler için kullanılmalıdır.
Öncelikle belirtelim Bitcoin C++ ile yazılmıştır. chainparams.cpp altında Genesis Block’u oluşturan iki adet statik fonksiyon tanımlanmıştır. Bunların kodları aşağıdadır:
static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
CMutableTransaction txNew;
txNew.nVersion = 1;
txNew.vin.resize(1);
txNew.vout.resize(1);
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
txNew.vout[0].nValue = genesisReward;
txNew.vout[0].scriptPubKey = genesisOutputScript;
CBlock genesis;
genesis.nTime = nTime;
genesis.nBits = nBits;
genesis.nNonce = nNonce;
genesis.nVersion = nVersion;
genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
genesis.hashPrevBlock.SetNull();
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
return genesis;
}
/**
* Build the genesis block. Note that the output of its generation
* transaction cannot be spent since it did not originally exist in the
* database.
*
* CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1)
* CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
* CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73)
* CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
* vMerkleTree: 4a5e1e
*/
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}
Daha önceki yıllarda incelediğimde Unique Genesis Block’u oluşturan bir kod vardı, Unique Genesis Block’u oluşturmak için 6 elemanlı bir rastgele sayısı dizisi private hash olarak üretilip kullanılıyordu. Deploy edilmiş Bitcoin hala böyle olması gerekiyor, çünkü Blockchain’in değiştirilmemesi lazım. Ancak şimdi incelediğimde Genesis Block üretiminin değiştirildiğini ve PubKey’in CScript ile üretildiğini görüyorum. Bu kaynak kod geliştiricilere özel sunulmuş olabilir halen production’daki Bitcoin 6 elemanlı rastgele sayı dizisini Genesis block’un private key’i olarak kullanıyor olabilir. Bunu bilmiyoruz. Ancak eğer öyleyse productionda bir güvenlik zayıflığı var demektir.
Bu kodlardaki assert’lerden sanki Genesis Block’un ve Merkle Root’un Bitcoine özel sabit bir hashi olduğunu anlamak mümkün.
Bu durumda 0. block yani Genesis Block’u ile ilgili bilinmeyen bir şey yok gibi duruyor, bu durumda 1. block’a bakmamız lazım. 1. block’ta da muhtemelen cüzdandan alınan private key’i gizli parametre olarak kullanılıyor, bu durumda güvenlik maksimize edilmiş görünüyor.
Sonuç:
Bitcoin’in önceki sürümlerinde bir güvenlik zayıflığı vardı. Çünkü 6 elemanlı rastgele sayısı dizisi Genesis Block’un private key’i olarak kullanılıyordu. Şimdi ise Genesis block açıkça statik ve sabit bir hashe kavuşmuş. Cüzdanların private key’leri ile bir güvenlik sağlanmış. Bu durumda Satoshi Nakamoto’nun gizli bir cüzdanı olduğu sonucuna varabiliriz. Bu durumda Satoshi Nakamoto (minimum) ilk iki block’la ilgili tüm bilgilere sahip özel biri oluyor. Ve bitcoin ekibi, kurucuları ilk blocklardaki tüm detayları biliyorlar. Private key’leri de biliyorlar. Peki bu ona ve onlara ne avantaj sağlar?
Buradan yola çıkarak diğer block’lardaki private key’leri tespit edebilirler mi? Bunun için SHA256 hash algoritmasını decrypt etmeyi çözmeleri lazım. Olası bir teorimi paylaşmak istiyorum.
cüzdan private key’ini SHA256 ile şifreleyelim.
PreviousHash+Block+SHA256(PrivateKey) tekrar SHA256 ile şifreleyip Public Key hashini üretelim
Diğer kodları incelemediğim için teorik olarak Bitcoin’in güvenli olduğunu, SHA256 hashi kırılmadığı sürece bir sıkıntı olmadığını söyleyebilirim. Ancak aşağıdaki makalede 1500 qubitlik bir kuantum bilgisayar ile SHA256 güvenlik algoritmasının kırılabileceği tahmin edilmiş.