Merkezi olmayan bir Ethereum oylama uygulaması geliştirme kılavuzu

Kripto para piyasasının tamamı piyasa değeri olarak 700 milyar doları geçtikten sonra, kripto para birimi alanı bu son birkaç ayda patladı. Ama bu sadece başlangıç. Blockchain sistemleri gelişmeye ve ölçeklenmeye devam ettikçe, bu yeni alana dalmanın ve bu teknolojiden yararlanmanın harika bir yolu, diğer adıyla dApps olarak bilinen merkezi olmayan uygulamalardır.

Ethereum Blockchain tıkanıklığıyla ünlü CryptoKitties, üreyebilir ve tahsil edilebilir kedilerin konseptlerini blockchain ile benzersiz bir şekilde birleştiren harika bir dApp örneğidir. Bu sansasyonel oyun, neredeyse sınırsız sayıda fırsattan yalnızca bir yaratıcı örnektir.

Görünüşte çok karmaşık olmasına rağmen, blok zinciri ve akıllı sözleşmelerle etkileşimlerinizi soyutlamak için belirli çerçeveler ve araçlar geliştirilmiştir. Bu blog yazısında, Ethereum'da merkezi olmayan bir oylama uygulaması oluşturmanın bir yolunu inceleyeceğim. Kısaca Ethereum üzerinden geçeceğim, ancak bu kılavuzu sonuna kadar kullanmak için muhtemelen bir anlayışa sahip olmalısınız. Ayrıca Javascript bilmenizi bekliyorum.

Neden Merkezi Olmayan Oylama uygulaması yapmalı?

Esasen, blockchain teknolojisini kullanan harika bir merkezi olmayan uygulama, güvenilir bir üçüncü taraf olmadan bugün yaptığınız aynı eylemleri (para transferi gibi) gerçekleştirmenize olanak tanır. En iyi dApp'lerin, blockchain'in benzersiz özelliklerini kullanan belirli bir gerçek dünya kullanım durumu vardır.

Temelde, blok zinciri, tek bir kullanıcının kontrol etmediği ve hiç kimse tarafından incelenemeyen, paylaşılan, programlanabilir, kriptografik olarak güvenli ve bu nedenle güvenilir bir defterdir. - Klaus Schwab

Bir oylama uygulaması tüketiciler için harika bir uygulama olmasa da, onu bu kılavuz için kullanmayı seçtim çünkü blockchain'in çözdüğü ana sorunlar - şeffaflık, güvenlik, erişilebilirlik, duyulabilirlik - mevcut demokratik seçimleri rahatsız eden ana sorunlar.

Bir blok zinciri, dağıtılan işlemlerin (oyların) kalıcı bir kaydı olduğundan, her oy reddedilemez bir şekilde, seçmen kimliğini açıklamadan tam olarak ne zaman ve nerede gerçekleştiğine kadar izlenebilir. Ek olarak, geçmiş oylar değiştirilemez, ancak şimdiki zaman ele geçirilemez, çünkü her işlem ağdaki her bir düğüm tarafından doğrulanır. Ve kaydı değiştirmek için dışarıdan veya içeriden herhangi bir saldırgan, düğümlerin% 51'inin kontrolüne sahip olmalıdır.

Saldırgan, radar altında gerçek kimlikleriyle kullanıcı oylarını yanlış girerken bunu başarabilse bile, uçtan uca oylama sistemleri seçmenlerin oylarının sisteme doğru şekilde girilip girilmediğini doğrulamasına olanak vererek sistemi son derece güvenli hale getirebilir.

Ethereum'un Temel Bileşenleri

Bu kılavuzun geri kalanı için Blockchain ve Ethereum hakkında bilgi sahibi olmanızı bekliyorum. İşte bununla ilgili harika bir rehber ve bilmenizi istediğim temel bileşenlere kısa bir genel bakış yazdım.

  1. Akıllı Sözleşmeler , arka uç mantığı ve depolama görevi görür. Bir sözleşme, akıllı bir sözleşme dili olan Solidity'de yazılmıştır ve Ethereum blok zincirinde belirli bir adreste bulunan bir kod ve veri koleksiyonudur. Fonksiyonları ve durum değişkenlerini içerdiği Nesne Yönelimli Programlamadaki bir sınıfa çok benzer. Akıllı Sözleşmeler, Blockchain ile birlikte tüm Merkezi Olmayan Uygulamaların temelini oluşturur. Blockchain gibi, değişmez ve dağıtılmış durumdalar, bu da Ethereum Network'teyse yükseltmenin bir acı olacağı anlamına geliyor. Neyse ki, işte bunu yapmanın bazı yolları.
  2. Ethereum Sanal Makinesi (EVM) , tüm Ethereum Ağının dahili durumunu ve hesaplamasını yönetir. EVM'yi, kod çalıştırabilen, verileri değiştirebilen ve birbirleriyle etkileşim kurabilen "adresler" içeren bu büyük, merkezi olmayan bilgisayar olarak düşünün.
  3. Web3.jsAkıllı sözleşmeler için işlemler ve çağrılar dahil olmak üzere Blockchain ile etkileşime girmenize izin veren bir Javascript API'sidir. Bu API, Ethereum İstemcileri ile iletişimi özetler ve geliştiricilerin uygulamalarının içeriğine odaklanmalarına olanak tanır. Bunu yapmak için tarayıcınıza bir web3 örneğinin yerleştirilmiş olması gerekir.

Kullanacağımız Diğer Araçlar

  1. Yer mantarıEthereum için popüler bir test geliştirme çerçevesidir. Sözleşmenizi Blockchain'e dağıtmak, sözleşme testi vb. İçin bir geliştirme blok zinciri, derleme ve geçiş komut dosyaları içerir. Geliştirmeyi kolaylaştırır!
  2. Truffle Contracts , Akıllı Sözleşmeniz ile kolayca bağlanmanıza ve etkileşim kurmanıza olanak tanıyan Web3 Javascript API'sinin üzerinde bulunan bir soyutlamadır.
  3. Metamask , Ethereum'u tarayıcınıza getirir. Merkezi Olmayan Uygulamaları kullanmanıza olanak tanıyan, Ethereum adresinize bağlı güvenli bir web3 örneği sağlayan bir tarayıcı uzantısıdır. Bu eğitimde Metamask kullanmayacağız, ancak bu, insanların üretimde DApp'nizle etkileşime girmesinin bir yoludur. Bunun yerine, geliştirme sırasında kendi web3 örneğimizi enjekte edeceğiz. Daha fazla bilgi için bu bağlantıya göz atın.

Hadi başlayalım!

Basitleştirmek adına, aslında daha önce anlattığım tam oylama sistemini oluşturmayacağız. Açıklama kolaylığı için, bir kullanıcının kimliğini girip bir adaya oy verebileceği tek sayfalık bir uygulama olacaktır. Ayrıca, aday başına oy sayısını sayan ve gösteren bir düğme olacaktır.

Bu şekilde, bir uygulama içinde akıllı sözleşmeler oluşturma ve bunlarla etkileşim kurma sürecine odaklanabileceğiz. Bu uygulamanın tamamı için kaynak kodu bu havuzda olacak ve Node.js ve npm'nin kurulu olması gerekecek.

Öncelikle, Truffle'ı global olarak kuralım.

npm install -g truffle

Truffle komutlarını kullanmak için bunları mevcut bir projede çalıştırmanız gerekir.

git clone //github.com/tko22/truffle-webpack-boilerplatecd truffle-webpack-boilerplatenpm install

Bu depo, tek bir komutla edinebileceğiniz kazan plakaları veya örnek uygulamalar olan Truffle Box'ın sadece bir iskeletidir - truffle unbox [box name]. Ancak, web paketli Truffle kutusu en son sürümlerle güncellenmez ve örnek bir uygulama içerir. Böylece, bu depoyu (yukarıdaki talimatlarda bağlantılı olanı) oluşturdum.

2. Dizin Yapısı

Dizin yapınız şunları içermelidir:

  • contracts/- Tüm Sözleşmelerin bulunduğu klasör. SİLMEMigrations.sol
  • migrations/ - Akıllı sözleşmelerinizi Blockchain'e yerleştirmenize yardımcı olan Taşıma dosyalarını tutan klasör.
  • src/ - uygulama için HTML / CSS ve Javascript dosyalarını tutar
  • truffle.js - Truffle Yapılandırma dosyası
  • build/- Sözleşmelerinizi derleyene kadar bu klasörü görmeyeceksiniz. Bu klasör derleme yapılarını içerir, bu nedenle bu dosyaların hiçbirini değiştirmeyin! Yapıtlar oluşturun, sözleşmenizin işlevini ve mimarisini açıklayın ve Blok Zincirinde Akıllı Sözleşmenizle nasıl etkileşim kuracağınız konusunda Truffle Sözleşmeleri ve web3 bilgileri verin.

1. Akıllı Sözleşmelerinizi yazın

Kurulum ve tanıtım için bu kadar yeter. Kodu girelim! Öncelikle, Solidity'de yazılmış olan Akıllı Sözleşmemizi yazacağız (diğer diller o kadar popüler değil). Korkunç görünebilir ama değil.

Herhangi bir uygulama için, akıllı sözleşmelerinizin olabildiğince basit, hatta aptalca basit olmasını istersiniz. Yaptığınız her hesaplama / işlem için ödeme yapmanız gerektiğini ve akıllı sözleşmelerinizin sonsuza kadar Blockchain'de kalacağını unutmayın. Yani, gerçekten mükemmel çalışmasını istiyorsunuz - yani, ne kadar karmaşıksa, hata yapmak o kadar kolay olur.

Sözleşmemiz şunları içerecektir:

  1. Durum Değişkenleri - Blok zincirinde kalıcı olarak depolanan değerleri tutan değişkenler. Seçmenlerin ve Adayların bir listesini ve sayısını tutmak için durum değişkenlerini kullanacağız.
  2. İşlevler - İşlevler, akıllı sözleşmelerin yürütülebilir dosyalarıdır. Blockchain ile etkileşime geçmek için arayacağımız şeyler bunlar ve dahili ve harici olarak farklı görünürlük seviyelerine sahipler. Bir değişkenin değerini / durumunu değiştirmek istediğinizde, bir işlemin gerçekleşmesi gerektiğini unutmayın - Ether'e mal oluyor. Ayrıca yapabilirsiniz calls(biz aslında yaparken Bölüm 3'te Bu konuda daha fazla mahvolacaksın yapılan değişiklikleri nedeniyle herhangi Eter maliyeti olmaz Blockchain için transactionsve calls).
  3. Olaylar - Bir olay çağrıldığında, olaya aktarılan değer işlem günlüğüne kaydedilir. Bu, Javascript geri arama işlevlerinin veya çözümlenmiş vaatlerin bir işlemden sonra geri vermek istediğiniz belirli değeri görüntülemesine olanak tanır. Bunun nedeni, her işlem yaptığınızda, bir işlem günlüğü döndürülecek olmasıdır. Görüntüleyeceğimiz yeni oluşturulan Adayın kimliğini kaydetmek için bir etkinlik kullanacağız (Bölüm 3'ün ilk madde işaretini kontrol edin).
  4. Struct Türleri - Bu, bir C yapısına çok benzer. Yapılar, birden çok değişkeni tutmanıza izin verir ve birden çok özniteliğe sahip şeyler için harikadır. Candidatessadece isimleri ve partileri olacak, ancak onlara kesinlikle daha fazla özellik ekleyebilirsiniz.
  5. Eşlemeler - Bunları, anahtar / değer çiftinin olduğu karma haritalar veya sözlükler gibi düşünün. İki eşleme kullanacağız.

Burada listelenmeyen birkaç tür daha var, ancak bazıları biraz daha karmaşık. Bu beş, akıllı bir sözleşmenin genellikle kullanacağı yapıların çoğunu kapsar. Bu türler burada daha ayrıntılı olarak açıklanmaktadır.

Referans için, işte Akıllı Sözleşme kodu. Bu dosyanın çağrılması gerektiğini unutmayın, Voting.solancak Github temelinin stil sahibi olmasını istedim, bu yüzden ona bir .jsuzantı verdim . Bu kılavuzun geri kalanında olduğu gibi, kodun içinde ne yaptığını açıklayacak yorumlar sunacağım ve daha sonra bazı uyarılara ve mantığa işaret ederek büyük resmi açıklayacağım.

Temel olarak, bir Seçmeni ve bir Adayı tanımlayan iki Yapımız (birden çok değişken içeren türler) var. Structs ile bunlara e-postalar, adres vb. Gibi birden çok özellik atayabiliriz.

Seçmenleri ve Adayları takip etmek için, onları tam sayı indekslendikleri ayrı eşlemelere koyarız. Bir Aday veya Seçmen'in indeksi / anahtarı - buna ID diyelim - işlevlerin bunlara erişmesinin tek yoludur .

Ayrıca, onları endekslememize yardımcı olacak Seçmen ve Aday sayılarını da takip ediyoruz. Ek olarak, 8. satırdaki etkinliği unutmayın; bu, eklendiğinde adayın kimliğini kaydedecektir. Bir adaya oy verebilmek için adayın kimliğini takip etmemiz gerektiğinden, bu etkinlik arayüzümüz tarafından kullanılacaktır.

  1. Biliyorum, sözleşmeleri süper basit hale getirmekle ilgili daha önce söylediğimin aksine, bu sözleşmeyi bu uygulamanın gerçekte yaptıklarına kıyasla biraz daha karmaşık hale getirdim. Ancak, bunu daha sonra düzenlemeler yapmanız ve bu uygulamaya özellik eklemeniz çok daha kolay olsun diye yaptım (bununla ilgili daha fazlası sonunda). Daha da basit bir oylama uygulaması yapmak istiyorsanız, akıllı sözleşme 15 satırdan daha az kodla çalışabilir.
  2. Not durum değişkenleri olduğu numCandidatesve numVoterskamuoyuna deklare edilmez. Varsayılan olarak, bu değişkenlerin görünürlüğü internalvardır; bu, bunlara yalnızca mevcut sözleşme veya türetilmiş sözleşmelerle doğrudan erişilebileceği anlamına gelir (bunun için endişelenmeyin, onu kullanmayacağız).
  3. Biz kullanan 32bytesdizeleri yerine kullanmak için stringtipini. EVM'mizin 32 baytlık bir kelime boyutu vardır, bu nedenle 32 baytlık parçalar halinde verilerle başa çıkmak için "optimize edilmiştir". (Solidity gibi derleyiciler, veriler 32 baytlık yığınlar halinde olmadığında daha fazla iş yapmalı ve daha fazla bayt kodu üretmelidir, bu da etkin bir şekilde daha yüksek gaz maliyetine yol açar.)
  4. Bir kullanıcı oy verdiğinde, yeni bir Voteryapı oluşturulur ve eşlemeye eklenir. Belirli bir adayın sahip olduğu oyların sayısını saymak için, tüm Seçmenleri gözden geçirmeli ve oy sayısını saymalısınız. Adaylar aynı davranışla çalışırlar. Böylece, bu eşleştirmeler tüm Aday ve Seçmenlerin geçmişini tutacaktır.

2. Web3'ü ve sözleşmeleri örnekleyin

Akıllı Sözleşmemiz tamamlandıktan sonra, şimdi test blok zincirimizi çalıştırmamız ve bu sözleşmeyi Blockchain'e yerleştirmemiz gerekiyor. Ayrıca onunla konuşmak için web3.js yoluyla bir yola ihtiyacımız olacak.

Test blok zincirimize başlamadan önce 2_deploy_contracts.js, klasörün içinde çağrılırken , /contractsgeçiş yaptığınızda Oylama Akıllı Sözleşmenizi içermesini söyleyen bir dosya oluşturmalıyız .

Ethereum blok zincirini geliştirmeye başlamak için komut satırınıza gidin ve şunu çalıştırın:

truffle develop

Bu, komut satırınızda yaşayacak. Solidity derlenmiş bir dil olduğundan, EVM'nin yürütmesi için önce onu bayt koduna derlemeliyiz.

compile

Şimdi build/dizininizin içinde bir klasör görmelisiniz . Bu klasör, Truffle'ın iç işleyişi için kritik olan yapı eserlerini içerir, bu yüzden onlara dokunmayın!

Ardından, sözleşmeyi taşımalıyız. Geçişler, geliştirirken uygulamanızın sözleşmesinin durumunu değiştirmenize yardımcı olan bir Truffle betiğidir. Sözleşmenizin Blockchain üzerinde belirli bir adrese dağıtıldığını unutmayın, bu nedenle her değişiklik yaptığınızda sözleşmeniz farklı bir adreste yer alacaktır. Geçişler bunu yapmanıza yardımcı olur ve ayrıca verileri hareket ettirmenize yardımcı olur.

migrate

Tebrikler! Akıllı sözleşmeniz artık sonsuza kadar Blockchain'de. Şey, gerçekten değil…. çünkü truffle developonu her durdurduğunuzda yenilenir.

Kalıcı bir blok zincirine sahip olmak istiyorsanız, Truffle tarafından da geliştirilen Ganache'yi düşünün. Ganache kullanıyorsanız aramanıza gerek kalmayacaktır truffle develop. Bunun yerine, koşacaksın truffle compileve truffle migrate. Truffle olmadan bir sözleşmeyi dağıtmanın gerçekte ne gerektiğini anlamak için bu blog gönderisine göz atın.

Akıllı sözleşmeyi Blockchain'e uyguladıktan sonra, uygulama başladığında tarayıcıda Javascript ile bir web3.0 örneği kurmamız gerekecek. Böylece, sonraki kod parçası öğesinin altına yerleştirilecektir js/app.js. Web3.0 0.20.1 sürümünü kullandığımızı unutmayın.

Bu kodu anlamadıysanız gerçekten çok endişelenmenize gerek yok. Bunun uygulama başladığında çalışacağını ve tarayıcınızda zaten bir web3 örneği (Metamask) olup olmadığını kontrol edeceğini bilin. Eğer yoksa, sadece localhost:9545Truffle geliştirme blok zinciri olan onunla konuşan bir tane yaratacağız .

Ganache kullanıyorsanız, bağlantı noktasını olarak değiştirmelisiniz 7545. Bir örnek oluşturulduktan sonra, startfonksiyonu çağıracağız (sonraki bölümde tanımlayacağım).

3. İşlevsellik ekleyin

Yapmamız gereken son şey, uygulama için arayüz yazmak. Bu, herhangi bir web uygulaması için gerekli olan HTML, CSS ve Javascript'i içerir (Web3 örneği oluştururken biraz Javascript yazdık). Öncelikle HTML dosyamızı oluşturalım.

Bu, kullanıcı kimliği için bir giriş formu ve Oylama ve Sayma oyları için düğmeler içeren çok basit bir sayfadır. Bu düğmelere tıklandığında, oy veren belirli işlevleri çağıracaklar ve adayların oy sayısını bulacaklar.

: Üç önemli div kimlikleri ile olsa elemanları vardır candidate-box, msgve vote-boxsırasıyla her aday, bir mesaj, ve oy sayısı onay kutularını düzenleyecek. Ayrıca JQuery, Bootstrap ve app.js.

Şimdi, sadece Sözleşme ile etkileşime girmemiz ve her aday için oylama ve oy sayısını sayma işlevlerini uygulamamız gerekiyor. JQuery DOM'u değiştirecek ve Blockchain'e işlem veya çağrı yaparken Promises'i kullanacağız. Kod aşağıdadır app.js.

Bir web3 örneği oluşturmak için önceki adımda verdiğim kodun da burada olduğunu unutmayın. İlk olarak, web3 ve Truffle Sözleşmeleri dahil olmak üzere gerekli kitaplıkları ve web paketi malzemelerini içe aktarıyoruz. Blockchain ile etkileşimde bulunmak için web3 üzerine inşa edilen Truffle Sözleşmelerini kullanacağız.

Bunu kullanmak için, oylama akıllı sözleşmesini derlediğimizde otomatik olarak inşa edilen yapı eserlerini alıp Truffle Sözleşmesini oluşturmak için kullanacağız. Son olarak, windowuygulamayı başlatmak, bir adayı oylamak ve oy sayısını bulmak için global değişkendeki işlevleri ayarlıyoruz .

Blockchain ile gerçekten etkileşimde bulunmak için, deployedişlevi kullanarak Truffle Sözleşmesinin bir örneğini oluşturmalıyız . Bu da, akıllı sözleşmeden işlevleri çağırmak için kullanacağınız dönüş değeri olarak örnekle birlikte bir söz verecektir.

Bu işlevlerle etkileşim kurmanın iki yolu vardır: işlemler ve çağrılar. Bir işlem bir yazma işlemidir ve tüm ağa yayınlanacak ve madenciler tarafından işlenecektir (dolayısıyla Ether'e mal olur). Bir durum değişkenini değiştiriyorsanız, blok zincirinin durumunu değiştireceği için bir işlem gerçekleştirmelisiniz.

Çağrı, bir işlemi simüle eden ancak durumdaki değişikliği atan bir okuma işlemidir. Bu nedenle, Ether'e mal olmayacak. Bu, alıcı işlevlerini çağırmak için harika (akıllı sözleşmemizde daha önce yazdığımız dört alıcı işlevine bakın).

Truffle Sözleşmeleri ile işlem yapmak için, yazma instance.functionName(param1, param2)ile, instancetarafından iade edildi örneği olarak deployedişlevi (bir örnek için kontrol hattı 36). Bu işlem, dönüş değeri olarak işlem verilerini içeren bir taahhüt döndürecektir. Bu nedenle, akıllı sözleşme işlevinizde bir değer döndürürseniz ancak aynı işlevle bir işlem gerçekleştirirseniz, bu değeri döndürmez.

Bu nedenle, döndürülecek işlem verilerine yazmasını istediğiniz her şeyi günlüğe kaydedecek bir etkinliğimiz var. 36-37. Satırlar söz konusu olduğunda, Aday eklemek için bir işlem yaparız. Sözü çözdüğümüzde, işlem verilerini alırız result.

Almak için candidateIDbiz olayla açmış olduğu AddedCandidate()(o 0 görmeye akıllı sözleşme kontrol), biz günlükleri geçmesi ve bunun gibi onu almak gerekir: result.logs[0].args.candidateID.

Neler olduğunu gerçekten görmek için, Chrome geliştirici araçlarını kullanarak çıktısını alın resultve yapısına bakın result.

Bir arama yapmak için yazacaksın instance.functionName.call(param1,param2). Ancak, bir işlev anahtar kelimeye sahipse, viewTruffle Contracts otomatik olarak bir çağrı oluşturur ve bu nedenle .call.

Alıcı işlevlerimizin viewanahtar kelimeye sahip olmasının nedeni budur . Bir işlem yapmanın aksine, bir çağrının döndürülen vaadi, akıllı sözleşme işlevi tarafından döndürülen değerin bir dönüş değerine sahip olacaktır.

Şimdi 3 işlevi kısaca açıklayacağım, ancak bir veri deposundan veri alan / değiştiren ve DOM'u buna göre işleyen uygulamalar oluşturduysanız bu çok aşina olacaktır. Blockchain'i veritabanınız olarak ve Truffle Contracts'ı veritabanınızdan veri almak için API olarak düşünün.

App.start ()

Bu işlev, bir web3 örneği oluşturduktan hemen sonra çağrılır. Truffle Sözleşmelerinin çalışması için, sağlayıcıyı oluşturulan web3 örneğine ayarlamalı ve varsayılanları ayarlamalıyız (hangi hesabı kullandığınız ve bir işlem yapmak için ödemek istediğiniz gaz miktarı gibi).

Geliştirme modunda olduğumuz için, her miktarda gazı ve herhangi bir hesabı kullanabiliriz. Üretim sırasında, MetaMask tarafından sağlanan hesabı alır ve gerçekte gerçek para olduğu için kullanabileceğiniz en küçük gaz miktarını bulmaya çalışırdık.

Her şey ayarlandığında, artık kullanıcının oy vermesi için her adayın onay kutularını görüntüleyeceğiz. Bunu yapmak için, sözleşmenin bir örneğini oluşturmalı ve Adayın bilgilerini almalıyız. Aday yoksa biz yaratacağız. Bir kullanıcının bir adaya oy vermesi için o adayın kimliğini vermemiz gerekir. Bu nedenle, her onay kutusu elemanının idadayın kimliğinin bir (HTML element özniteliği) olmasını sağlarız. Ek olarak, kullanacağımız aday sayısını global bir değişkene numOfCandidatesekleyeceğiz App.findNumOfVotes(). JQuery, her onay kutusunu ve aday adını eklemek için kullanılır .candidate-box.

App.vote ()

Bu işlev, hangi onay kutusunun tıklandığına ve idniteliğine göre belirli bir adayı oylayacaktır .

Birincisi, kullanıcının kendi kimliği olan kullanıcı kimliğini girip girmediğini kontrol edeceğiz. Aksi takdirde, bunu yapmalarını söyleyen bir mesaj görüntüleriz.

İkincisi, kullanıcının bir adaya oy verip vermediğini, tıklanan en az bir onay kutusu olup olmadığını kontrol edeceğiz. Onay kutularından hiçbiri tıklanmadıysa, onlara bir adaya oy vermelerini söyleyen bir mesaj da görüntüleriz. Onay kutularından birine tıklanırsa, idaynı zamanda bağlantılı adayın kimliği olan bu onay kutusunun özniteliğini alır ve bunu adaya oy vermek için kullanırız.

İşlem tamamlandığında, iade edilen sözü çözeceğiz ve "Oylandı" mesajı görüntüleyeceğiz.

App.findNumOfVotes ()

Bu son işlev, her aday için Oy sayısını bulacak ve bunları gösterecektir. Adayları gözden geçireceğiz ve iki akıllı sözleşme işlevi arayacağız getCandidateve totalVotes. Bu vaatleri çözeceğiz ve o belirli aday için bir HTML öğesi oluşturacağız.

Şimdi uygulamayı başlatın ve göreceksiniz //localhost:8080/!

npm run dev

Kaynaklar

Biliyorum, çok fazla… Bu uygulamayı yavaş yavaş geliştirirken ve gerçekten neler olup bittiğini anlarken bu makaleyi bir süre açık tutabilirsiniz. Ama bu öğreniyor! Lütfen bu kılavuzu Ethereum, Truffle'dan gelen tüm belgelerle ve aşağıda verdiklerimle tamamlayın. Bu makaledeki kilit noktaların çoğuna ulaşmaya çalıştım, ancak bu sadece kısa bir genel bakış ve bu kaynaklar çok yardımcı olacak.

  • Sağlamlık ve Akıllı Sözleşmeler hakkında her şey - Her Şeyi kastediyorum
  • Truffle hakkında her şey
  • Truffle Sözleşmeleri Belgeleri
  • Web3 Javascript API- bunu bilmek ve başvurmak harika olacaktır, ancak Truffle Contracts bunun birçok bölümünü özetler
  • Kullanışlı DApp kalıpları
  • Ethereum Belgeleri - yan çubuğa bakın ve çok şey var
  • CryptoKitties Kod Açıklaması - Yazar, CryptoKitties'in Akıllı Sözleşmesinin önemli bölümlerinden geçiyor
  • Akıllı Sözleşme En İyi Uygulamaları- okunmalı

Sonuç

Ethereum'da uygulama oluşturmak, arka uç hizmetini arayan normal bir uygulamaya oldukça benzer. En zor kısım, sağlam ve eksiksiz bir akıllı sözleşme yazmaktır. Umarım bu kılavuz, merkezi olmayan uygulamalar ve Ethereum hakkındaki temel bilgileri anlamanıza yardımcı olur ve bunları geliştirmeye olan ilginizi artırmanıza yardımcı olur.

İnşa ettiğimiz şeyi geliştirmek istiyorsanız, işte size bazı fikirler. Aslında akıllı sözleşmeyi, bu kılavuzda size verdiğim her şeyle kolayca uygulanabilecek şekilde yazdım.

  • Her Adayın partisini görüntüleyin. Koştuğumuzda zaten bir adayın partisini alıyoruz getCandidate(id).
  • Kullanıcı tarafından girilen kimliğin benzersiz olup olmadığını kontrol edin.
  • Bir Kullanıcı hakkında doğum tarihi ve ev adresi gibi daha fazla bilgi isteyin ve saklayın .
  • Belirli bir kimliğe sahip bir kişinin oy verip vermediğini görmek için bir seçenek ekleyin. Bir kimliği girmek için yeni bir form oluşturursunuz, daha sonra bu belirli kullanıcıyı blok zincirinde arayacaksınız.
  • BOTH adaylarının oylarını aynı anda sayan yeni bir akıllı sözleşme işlevi yazın. Şu anda, iki aday için iki ayrı çağrı yapmamız gerekiyor ve sözleşmenin tüm Kullanıcılar arasında iki kez döngü yapmasını gerektiriyor.
  • Yeni Adayların eklenmesine izin verin. Bu, Adayları eklemek için yeni bir form eklemek, ancak aynı zamanda ön uçtaki adayları nasıl göstereceğimizi ve oy vereceğimizi biraz değiştirmek anlamına gelir.
  • Kullanıcıların oy vermek için bir Ethereum Adresine sahip olmasını zorunlu kılın. Kullanıcı adreslerini dahil etmeme mantığım, seçmenlerin bu oylama sürecine Ethereum'un katılmasının beklenmemesidir. Bununla birlikte, birçok DApp, kullanıcıların bir Ethereum Adresine sahip olmasını gerektirecektir.

Ayrıca, bazı engellerin oluşmasını önleyebilecek bazı ipuçları aşağıda verilmiştir:

  • Garip bir şey olduğunda akıllı sözleşme işlevlerinizi iki veya üç kez kontrol edin. İşlevlerimden birinde yanlış değeri döndürdüğümü anlamak için bir hataya birkaç saat harcadım.
  • Geliştirme blok zincirinize bağlandığınızda URL'nizin ve bağlantı noktanızın doğru olup olmadığını kontrol edin. Unutmayın: Ganache 7545içindir truffle developve 9545Ganache içindir. Bunlar varsayılanlardır, bu nedenle blok zincirinize bağlanamıyorsanız, onları değiştirmiş olabilirsiniz.
  • Bunun üzerinden geçmedim çünkü bu kılavuz çok uzun olurdu ve muhtemelen bununla ilgili başka bir gönderi yapacağım - ancak sözleşmelerinizi test etmelisiniz! Çok yardımcı olacak.
  • Sözlere aşina değilseniz, nasıl çalıştığını ve nasıl kullanılacağını gözden geçirin. Truffle Contracts vaatleri kullanır ve web3 için beta da vaatleri destekler. Yanlış yaparsanız, aldığınız birçok veriyi karıştırabilirler.

Merkezi olmayan ve güvenli bir internet için çalışmanın şerefine - Web 3.0!

Umarım bu kılavuzu yazmaktan zevk aldığım kadar keyif almışsınızdır! Herhangi bir düşünceniz ve yorumunuz varsa, aşağıya bir yorum bırakmaktan çekinmeyin veya [email protected] adresinden bana e-posta gönderin veya bana tweet atın (yakın zamanda bir tane oluşturdum)! Kodumu kullanmaktan ve arkadaşlarınızla paylaşmaktan çekinmeyin!