Asal usul:https://jysperm.me/2016/05/blockchain-slides/
Artikel ini disusun daripada perkongsian teknologi yang saya lakukan di LeanCloud pada akhir Mac, dengan mengandaikan pembaca sudah mempunyai pengetahuan asas mengenai kriptografi dan pemahaman awal mengenai pelaksanaan Bitcoin.
Blockchain juga dikenali sebagai blockchain dan boleh dianggap sebagai sejenis HashTree, yang mana ia mempunyai beberapa sifat yang sama dengan HashTree:
Gambar diambil darihttp://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html
Iaitu dalam struktur pokok, setiap nodus terminal mempunyai satu nilai hash, sedangkan nilai hash nodus bukan terminal berasal dari hash nilai hash semua nodus anak langsungnya, oleh itu setiap nodus secara langsung atau tidak langsung mengandungi maklumat dari semua nodus anaknya. Oleh itu, apabila nilai hash nodus mana-mana nodus terminal berubah, nilai hash semua nodus induknya akan berubah, maka nodus akar juga mesti berubah.
Saya boleh menunjukkan satu aplikasi mengenai HashTree: "Pembuktian Rizab 100%", ia termasuk dalam jenis masalah "Pembuktian Rizab Sifar". Kita boleh mempertimbangkan satu senario di mana pemegang Bitcion perlu menghantar Bitcoin ke bursa untuk melakukan transaksi, dan secara teori pertukaran dapat memindahkan wang itu (saldo akaun semua pengguna yang terdaftar) untuk menggunakannya, yang tidak ingin dilihat oleh pengguna, dan pertukaran juga ingin membersihkan diri: bursa pertama mempublikasikan alamat Bitcoin yang mereka pegang, untuk memastikan bahawa transaksi benar-benar memegang jumlah Bitcoin sebagai rizab, tetapi bagaimana untuk membuktikan bahawa wang itu sebenarnya lebih besar daripada jumlah keseluruhan pengguna?
Gambar diambil darihttp://blog.bifubao.com/2014/03/16/proof-of-reserves
Kita boleh membina sebuah HashTree, di mana semua node akhir mewakili satu pengguna, yang mengandungi baki pengguna.Σ
) dan susunan ID pengguna (seperti alamat e-mel)h
), sedangkan nodus bapa mengandungi jumlah baki nodus anak-anaknya (((sum
) dan sekumpulan semua maklumat sub-nodehash
Untuk setiap pengguna, hanya perlu menunjukkan kepada mereka nod akhir dan nod saudara mereka sendiri, semua nod induk dan nod adik mereka, kerana pengguna ini boleh mengesahkan baki mereka dimasukkan ke dalam nod induk dan akhirnya dimasukkan ke dalam nod akar dengan cara melangkah ke belakang nod induk.
Dengan cara ini, setiap pengguna hanya dapat melihat maklumat sendiri dan beberapa maklumat yang telah digabungkan, dan setiap pengguna boleh mengesahkan bahawa baki mereka terkandung dalam nod akar tanpa mengetahui baki penggunaan lain.h
untuke4df9d12
Benda tidak sepatutnya menjadi titik akhir yang mewakili pengguna, tetapi harus menjadi titik maklumat yang digabungkan (benda ini boleh mengandungi pengguna dengan baki 3333, dan pengguna palsu dengan baki 0) untuk mengelakkan kebocoran maklumat privasi pengguna tertentu.
Sekarang mari kita lihat Git, sebenarnya Git adalah aplikasi blockchain yang sangat tipikal:
Gambar diambil darihttp://gitbook.liuhui998.com/1_2.html(GPL v2)
Dalam Git, sama ada fail (Blob), indeks (Tree) atau komisen (Commit), setiap fail mempunyai Hash yang ditentukan oleh kandungannya, dan jika dua objek mempunyai kandungan yang sama, mereka mempunyai Hash yang sama. Dalam Git, sejarah keseluruhan gudang adalah Blockchain, setiap Komisen adalah sama dengan Blok, Komisen mengandungi Hash dari Komisen sebelumnya dan Hash dari objek yang berkaitan yang diubahsuai, Komisen sendiri Hash ditentukan oleh kandungannya dan maklumat ini.
Git menggunakan Blockchain untuk menentukan sejarah unik untuk gudang. Ya, jika satu Commit diubah, semua Hash Commit selepasnya akan berubah. Sudah tentu, kerana Git hanya alat kawalan versi, itu tidak menghalang anda untuk mengubah sejarah ((dengan itu, anda juga boleh rebase kemudian).push --force
Walau bagaimanapun, perubahan ini akan disedari oleh semua penyokong.
Satu lagi aplikasi klasik Blockchain ialah Bitcoin, yang telah menyebarkan istilah Blockchain (yang sebenarnya telah ada sejak semula):
Gambar diambil darihttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)
Dalam Bitcoin, setiap Blok mengandungi satu siri Transaksi dan Hash Blok sebelumnya, sementara seluruh Blockchain membentuk satu buku ledeng terdesentralisasi. Oleh kerana Blok baru dihasilkan setiap sepuluh minit, dan Blok yang dihasilkan akan kekal di Blockchain selamanya, Blockchain menetapkan urutan transaksi yang berlaku, mengekalkan urutan yang berlaku sebelum transaksi, dan kemudian menentukan sama ada akaun mempunyai baki yang mencukupi untuk memulakan transaksi.
Bahagian pertama dari perkongsian ini adalah untuk mengulas Bitcoin secara ringkas.
Blok dalam Bitcoin dihasilkan melalui "bukti jumlah kerja", iaitu semua "penambang" yang terlibat dalam "perlombongan" perlu melakukan pengiraan hantaran yang berkaitan dengan daya pengiraan, yang bersifat rawak, sehingga bilangan rawak yang memenuhi syarat tertentu dikira, untuk mendapatkan hak untuk mengeluarkan Blok.
Secara lalai, setiap pelombong akan sentiasa mempercayai "rantai terpanjang" dan mengira blok seterusnya berdasarkan rantai terpanjang yang diketahui dan memenuhi peraturan, jika tidak, kuasa pengiraan anda akan sia-sia.
Bitcoin direka untuk menghasilkan satu blok baru setiap 10 minit, yang dicapai dengan melihat selang masa beberapa blok yang lalu untuk menyesuaikan kesukaran penciptaan blok seterusnya. Apabila beberapa blok yang lalu dihasilkan dengan lebih cepat daripada yang dijangkakan, orang akan berpendapat bahawa blok seterusnya harus dihasilkan dengan kesukaran yang lebih tinggi.
Secara normal, setiap nod Bitcoin memerlukan penyimpanan data Blockchain yang lengkap untuk mengesahkan sama ada transaksi adalah sah atau tidak. Tetapi kini terdapat 66G blockchain yang lengkap, dan masih berkembang pada kadar sekitar 0.1G setiap hari. Jika memerlukan setiap pengguna Bitcoin untuk menyimpan blockchain yang lengkap tidak terlalu sukar, maka Bitcoin mempunyai mekanisme "Simplified Verification SPV, Simplified payment verification", yang disebut "Client Lightweight" yang boleh memilih untuk tidak menyimpan blockchain yang lengkap, tetapi hanya menyimpan semua metadata (Hash, bukti transaksi, bukti kerja), dan kemudian mengesahkan jumlah kerja setiap blok Hash, setiap kali diperlukan untuk mengesahkan transaksi yang lengkap di mana transaksi dilakukan.
Gambar diambil darihttps://github.com/ethereum/wiki/wiki/White-Paper
Sebenarnya, kita boleh membayangkan Blockchain Bitcoin sebagai "mesin status", seluruh Blockchain adalah "buku besar" yang mempunyai status, di mana setiap rekod urus niaga disimpan, dan berdasarkan catatan transaksi ini, kita dapat membuat kesimpulan mengenai "status" keseluruhan akaun pada bila-bila masa. Ya, berapa baki setiap akaun dalam rangkaian Bitcoin. Setiap Transaksi adalah perubahan pada status, dan setiap Blok adalah "konsensus" pelombong keseluruhan rangkaian Bitcoin mengenai keadaan semasa, kerana Bitcoin menghasilkan Blok baru setiap 10 minit, bersamaan dengan setiap 10 minit semua orang mencapai persetujuan mengenai baki semua akaun, dan dalam tempoh sepuluh minit, keadaan akaun sebenarnya adalah keadaan "kaos".
Banyak mata wang kripto lain yang juga berasal dari Bitcoin, yang biasanya dikenali sebagai "Alt Coin", biasanya mempunyai dua pelaksanaan:
Yang pertama adalah menggunakan rangkaian sendiri, yang agak bebas daripada Bitcoin, yang memberi manfaat kepada Bitcoin untuk merancang protokol dan peraturan sendiri dengan sangat fleksibel, tetapi kerana jumlah pengguna sukar untuk mencapai tahap yang setara dengan Bitcoin, pertahanan terhadap serangan jahat akan sangat lemah.
Kaedah kedua adalah menggunakan rangkaian Bitcoin untuk melaksanakan "metaprotokol", yang mempunyai maklumat tersuai di atas Transaction Bitcoin untuk mewujudkan logiknya sendiri. Manfaatnya adalah dapat menggunakan skala daya pengkomputeran Bitcoin untuk melawan serangan, tetapi juga kerana tidak semua pelombong yang melekat pada rangkaian Bitcoin mematuhi peraturan Bitcoin, sehingga tidak dapat mencegah Blok yang tidak mematuhi peraturan memasuki Blockchain, hanya dapat menapis transaksi yang tidak mematuhi peraturan di klien, atau tidak dapat menggunakan fungsi pengesahan yang disederhanakan yang disediakan oleh Bitcoin yang disebutkan di atas.
Untuk syiling ini, Bitcoin boleh menyediakan Blockchain yang mempunyai banyak penggali yang terlibat, yang dapat menahan serangan jahat yang besar, dan juga data yang disesuaikan pada Transaksi Bitcoin, yang memberi ruang kepada pelaksanaan syiling.
Bitocin juga menyediakanBitcoin ScriptIa digunakan untuk mencapai transaksi yang lebih kompleks. Tetapi kerana ini bukan fungsi teras Bitcoin, ia hanya dapat melakukan operasi yang lebih mudah, hanya membaca data yang sangat terhad di Blockchain, dan sukar untuk menulis logik Turing yang komprehensif kerana kekurangan mekanisme lingkaran.
Gambar diambil darihttps://www.ethereum.org/assets(CC 3.0)
Ethereum (Ethereum) adalah platform aplikasi terdesentralisasi berasaskan blockchain yang membina infrastruktur Bitcoin dan teknologi blockchain berasaskan kriptografi untuk platform umum dan menambah beberapa fungsi yang hilang dalam rangkaian Bitcoin supaya pemaju dapat menjalankan aplikasi terdesentralisasi mereka sendiri di atas Blockchain.
Sebelum saya membincangkan Ethereum secara terperinci, saya akan membincangkan dua asas utama (yang saya anggap) rangkaian terdesentralisasi, iaitu kriptografi dan permainan. Secara semula jadi, kriptografi tidak memerlukan banyak kata untuk memastikan keselamatan secara matematik melalui enkripsi kunci awam, tandatangan digital, susunan dan algoritma pengutipan; sedangkan permainan adalah bahawa dalam rangkaian terdesentralisasi, sesiapa sahaja, termasuk mereka yang ingin menyerang rangkaian dengan niat jahat, boleh mengambil bahagian dan perlu memikirkan hubungan kepentingan setiap peserta dalam merancang rangkaian terdesentralisasi, memastikan kepentingan maksimum apabila mematuhi peraturan, dan kerugian atau risiko apabila melanggar peraturan.
Walau bagaimanapun, dalam dunia digital, penerbitan data tidak ada kos, tidak ada "manfaat" dan "kerugian", jadi perlu membuat hubungan dengan dunia fizikal untuk menentukan "manfaat". Sebagai contoh, dalam rangkaian Bitcoin, jika penyerang ingin mengubah arah Blcokchain secara buatan, ia memerlukan daya pengkomputeran yang lebih tinggi daripada semua pelombong lain, sedangkan dalam dunia fizikal, daya pengkomputeran diperlukan oleh peralatan pengkomputeran, dan peralatan pengkomputeran diperlukan untuk dibeli dari dunia fizikal.
Oleh itu, dalam rangkaian terdesentralisasi, tidak semua masalah diselesaikan oleh "teknologi", di mana bahagian yang tidak dapat dicapai oleh teknologi harus diselesaikan melalui keuntungan, melalui insentif ekonomi. Juga kerana keperluan "insentif ekonomi", Ethereum juga mempunyai sistem dompet (unit mata wang dipanggil "Ether") di mana setiap pengguna mempunyai alamat dompet sebagai identiti uniknya, yang agak serupa dengan Bitcion dalam hal ini.
"Kontrak" adalah konsep yang paling penting yang diperkenalkan oleh Ethereum. Dalam Bitcoin, semua alamat adalah milik pengguna. Apabila kita berkata "pengguna", sebenarnya kita bermaksud sepasang kunci awam dan kunci peribadi. Tetapi dalam Ethereum, selain alamat yang dimiliki oleh kunci, terdapat alamat yang dimiliki oleh "kod", iaitu Kontrak. Kontrak dikeluarkan oleh pengguna, yang pada hakikatnya adalah kod yang tidak dapat diubah setelah dikeluarkan, Kontrak juga mempunyai alamat dompet seperti akaun biasa, setiap kali alamat ini diterima, kod yang berkaitan dengan transaksi akan dilaksanakan, kod ini:
Sebagai contoh pertama, wallet yang dikongsi bersama mempunyai ciri untuk mencipta wallet yang dikongsi bersama di dalam pelanggan rasmi Ethereum:
Gambar ini menunjukkan bahawa dengan ciri ini, anda boleh membuat alamat dompet yang dikongsi bersama dengan dua orang lain, dengan setiap orang menggunakan maksimum 100 Ether setiap hari, dan jika melebihi had ini, anda mesti mendapatkan persetujuan orang lain.
Fungsi ini sebenarnya akan mencipta Kontrak, dan logik di atas diterangkan oleh kod dalam Kontrak. Apabila anda ingin mengeluarkan wang dari dompet bersama ini, anda perlu menghantar mesej ke dompet bersama ini (transaksi adalah mesej, jumlah transaksi boleh menjadi sifar, hanya membawa data), dan kod dalam dompet bersama akan dilaksanakan, jika permintaan perbelanjaan ini sesuai dengan logik di atas, memulakan transaksi perbelanjaan sebenar, jika tidak permintaan perbelanjaan ini akan ditolak tanpa item perbelanjaan sebenar).
Satu lagi contoh adalah "kontrak lindung nilai", yang telah sering dikatakan Bitcoin sebagai mata wang digital yang nilai mata wangnya (dan kadar pertukaran mata wang sah) tidak stabil, sering berlaku dalam keadaan mata wang naik dua kali ganda atau jatuh dua kali ganda dalam sehari, tetapi masalah ini dapat diselesaikan kepada tahap tertentu jika kontrak lindung nilai dilaksanakan.
Kita akan memanggil orang yang ingin mengekalkan nilai mata wang yang tidak berubah sebagai "penjaga risiko", dan orang lain yang bersedia untuk mengambil risiko dari turun naik nilai mata wang dan mendapat keuntungan daripadanya sebagai "pengambil risiko", jadi mereka boleh bersetuju dengan jumlah (misalnya 1000 CNY) dan tingkap masa (misalnya sebulan) dan membuat kontrak yang menjalankan logik berikut:
Jika nilai Ether meningkat, pemegang risiko akan mendapat keuntungan, jika nilai Ether menurun, pemegang risiko akan rugi, tetapi pemegang risiko tidak akan rugi. Sudah tentu, pemegang risiko dan pemegang risiko boleh bersetuju terlebih dahulu tentang "pembiayaan" yang perlu dibayar oleh pemegang risiko, atau pemegang risiko perlu memberikan jaminan beberapa kali ganda daripada 1000 CNY ("lebih tinggi perkalian, lebih besar risiko yang dapat diambil").
Dalam contoh di atas, terdapat satu lagi masalah yang tidak dapat diselesaikan dengan baik, iaitu bagaimana untuk menentukan kadar pertukaran antara Ether dan mata wang sah, seperti yang telah kami nyatakan sebelumnya, Kontrak hanya dapat mengakses data di blockchain, dan mata wang sah adalah data yang terdapat di dunia fizikal dan bukan dunia kriptografi, dan kita perlu memasukkan "data dari dunia bukan kriptografi" ke dalam blockchain melalui beberapa mekanisme.
Kita boleh merancang kontrak lain untuk menetapkan logik seperti ini untuk mendapatkan pertukaran antara Ether dan mata wang sah dari dunia nyata, dalam setiap tetingkap masa (seperti satu jam):
Bagi mana-mana peserta, kerana tidak mengetahui tawaran orang lain, mengemukakan pertukaran yang sebenar mempunyai peluang yang lebih besar untuk mendapat ganjaran, sedangkan mengemukakan pertukaran yang sangat luar biasa akan mempunyai peluang yang besar untuk kehilangan jaminan.
Sudah tentu, peraturan ini mempunyai beberapa kelemahan, seperti jika seseorang mempunyai wang jaminan yang sangat banyak, maka dia boleh menarik purata kepada harga yang lebih tinggi atau lebih rendah daripada kadar pertukaran sebenar sambil mendapat ganjaran, dan menyebabkan beberapa orang lain yang menawarkan kadar pertukaran yang tepat kehilangan jaminan. Tetapi pada hakikatnya, jika anda mempunyai wang yang sangat banyak, anda juga boleh menaikkan atau menekan harga barang, tetapi jika anda mempunyai wang jaminan yang sangat banyak, anda akan kehilangan semua jaminan jika anda gagal.
Satu lagi kelemahan ialah "semua orang boleh menyumbang kepada Kontrak dan menyediakan mata wang". Langkah ini dilakukan dengan membuat transaksi, dan semua transaksi akan ditulis di Blockchain, jadi mata wang yang anda hantar sebenarnya dapat dilihat oleh orang lain, yang seterusnya memberi peluang kepada penyerang jahat.
Sebelum ini, kita telah menyebut bahawa kontrak dapat membaca data di blockchain, tetapi data di blockchain adalah pasti, jika kita ingin mewujudkan aplikasi yang serupa dengan perjudian, di mana kita akan mendapatkan nombor rawak?
Satu sumber nombor rawak yang boleh dibayangkan adalah Hash Blok seterusnya, dan dalam kebanyakan kes, tahap rawak ini cukup. Tetapi sebenarnya, pelombong dapat memanipulasi nombor rawak ini hingga tahap tertentu, dengan anggapan bahawa seorang pelombong terlibat dalam pertaruhan, dan keuntungan pertaruhan lebih besar daripada keuntungan dari menggali satu blok, maka jika pelombong ini menggali satu blok yang akan menyebabkan dia kehilangan taruhannya, maka jelas pelombong ini akan memilih untuk tidak mempublikasikan blok baru ini, yang semakin jelas dalam keadaan pengiraan yang kuat oleh pelombong individu.
Oleh itu, kita perlu memperkenalkan mekanisme yang serupa dengan pengambilan pertukaran untuk mengumpul bilangan benih secara rawak, dan kemudian menggunakan benih tersebut untuk mengira bilangan benih secara rawak pada akhir setiap tetingkap masa. Tetapi seperti pengambilan pertukaran, kerana peserta mewujudkan kadar penyerahan dengan membuat urus niaga, oleh itu, antara satu tetingkap masa, bilangan benih rawak yang diserahkan oleh setiap orang adalah kelihatan kepada orang lain, jadi seseorang yang telah mengambil bahagian dalam perjudian tertentu dapat memilih secara teliti bilangan benih rawak supaya jumlah benih yang telah diserahkan oleh orang lain ditambah dengan jumlah benih baru yang dihasilkan secara rawak sesuai dengan jangkaannya.
Oleh itu, kita perlu membahagikan tetingkap pengumpulan benih menjadi dua bahagian untuk mendapatkan bilangan rawak yang tidak dapat diramalkan dan diganggu oleh sesiapa:
Pada peringkat pertama, anda hanya tahu nilai seri benih yang dikemukakan oleh orang lain, tetapi tidak tahu benih sebenar, dan oleh itu tidak dapat membina benih dengan teliti untuk campur tangan dengan hasilnya; pada peringkat kedua, semua orang hanya mengesahkan benih yang dikemukakan pada peringkat pertama, tidak boleh mengemukakan benih baru, dan tidak dapat menghalang orang lain daripada mengemukakan benih.
Sebelum ini, kita telah menyebut bahawa Bitcoin Script tidak menawarkan keupayaan untuk berputar, melompat, atau lain-lain, mungkin Bitcoin adalah untuk mengawal masa pelaksanaan Bitcoin Script, kerana menurut "teorema penghentian" Turing, program yang ditulis oleh bahasa pengaturcaraan yang lengkap dengan Turing tidak dapat selalu menilai dari segi analisis statik sahaja sama ada ia akan berakhir selepas langkah terhad, sehingga penggodam yang tidak baik dapat membina Transaction yang akan menyebabkan lingkaran mati untuk mengganggu kerja normal pelombong.
Sementara Ethereum sekali lagi mengelilingi masalah ini dengan "insentif ekonomi", kontrak berjalan dalam bentuk kod operasi pada mesin maya yang dipanggil EVM (Ethereum Virtual Machine), sebuah mesin maya yang mempunyai "pembayaran" sendiri, di mana standard EVM menentukan jumlah Gas yang digunakan oleh setiap kod operasi berdasarkan memori dan masa CPU yang diperlukan untuk operasi, yang merupakan sumber pengiraan yang dibeli oleh Ether. Seperti yang dinyatakan di atas, apabila sasaran transaksi adalah kontrak, kod kontrak akan dilaksanakan, pengasas urus niaga memerlukan bayaran untuk Gas Gas yang digunakan dalam proses pelaksanaan kontrak, sambil menyatakan "jumlah maksimum Gas Gas yang bersedia dibayar" dan kontrak akan dihentikan jika jalan tengah habis.
Kemudian kita akan kembali kepada isu "interval persetujuan", yang telah disebutkan di atas Bitcoin setiap 10 minit terdapat satu blok baru, iaitu seluruh rangkaian mencapai satu "konsensus" setiap 10 minit, jadi transaksi Bitcoin biasa akan menunggu beberapa minit untuk disahkan, mungkin menunggu satu jam sebelum transaksi dianggap boleh dipercayai.
Ini kerana selang konsensus yang lebih cepat akan meningkatkan kelebihan "kuil terpusat". Yang disebut "kuil" bermaksud pelombong Bitcoin berkumpul untuk melombong, pelombong mematuhi arahan kuil tanpa syarat, dan akhirnya bersetuju dengan kuil untuk membahagikan keuntungan, jelas Bitcoin sebagai sistem terpusat, tidak mahu kuil terpusat ini mempunyai kelebihan tambahan.
Apabila seorang pelombong A menggali sebuah blok baru, dia akan menghirup blok itu, dan orang lain akan segera mula bekerja berdasarkan blok baru itu sebaik sahaja mereka menerima mesej ini; sementara orang lain mengira bahawa masa antara "A menggali blok baru" dan "menerima mesej dari A" sebenarnya terbuang, sementara pelombong lain di kolam pusat tidak akan mengalami masalah ini, kerana mereka boleh mendapatkan maklumat mengenai blok baru yang dihasilkan dengan lebih cepat dan mula bekerja berdasarkan blok baru dengan segera.
Tempoh penyiaran ini mungkin mengambil masa beberapa puluh saat, yang tidak begitu penting untuk 10 minit, tetapi jika kita memendekkan selang konsensus, kelebihan kumpulan tambang terpusat akan menjadi semakin jelas. Tetapi Ethereum menyelesaikan masalah ini dengan memperkenalkan konsep "Uncle Block", mengurangkan selang konsensus menjadi 15 saat, peningkatan yang besar berbanding Bitcoin dalam kelajuan pengesahan pembayaran.
Dalam blockchain Bitcoin, satu blok hanya boleh mempunyai satu blok induk dan satu blok anak. Tetapi dalam Ethereum, blok yang baru dihasilkan boleh mempunyai satu blok induk dan beberapa blok anak. Kembali ke contoh di atas, jika seseorang menggali blok baru pada A tetapi orang lain belum menerima siaran, jika seseorang menggali blok baru pada masa itu tetapi tidak diterima oleh semua orang kerana siaran lewat, maka blok ini mungkin menjadi "blok anak" blok berikutnya.
Gambar diambil darihttps://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time
Di bahagian seterusnya, saya akan membincangkan beberapa masalah yang belum diselesaikan oleh Ethereum.
Pertama adalah bahawa Ethereum kini mencapai konsensus bahawa ia masih dijamin melalui POW (Proof of Work) seperti Bitcoin, hanya nodes yang menyelesaikan jumlah kerja tertentu yang dapat mengambil bahagian dalam pembuatan Blok. Masalah dengan bukti kerja adalah bahawa ia akan membuang banyak tenaga pengkomputeran untuk memastikan keselamatan rangkaian, walaupun ini juga berdasarkan idea "insentif ekonomi" yang disebutkan sebelumnya, tetapi sebenarnya dapat diperbaiki. Ehtereum berpendapat bahawa cara yang lebih baik adalah dengan POS (Proof of Ownership) untuk menggantikan bukti kerja, yang dapat meningkatkan kecekapan rangkaian ini dengan besar.
Jika Ether itu sendiri mempunyai nilai, mengapa tidak menggunakan insentif ekonomi? POS bermaksud bahawa semua orang menggunakan Ether yang mereka miliki untuk memberi jaminan bahawa setiap nod yang ingin mengambil bahagian dalam pembentukan Blok (dalam penggalian tradisional) (disebut pengesahan) memerlukan sistem untuk membuat perjanjian dengan semua nod yang menganggap bahawa wang jaminan itu "didepankan") membayar sejumlah wang jaminan, dan kemudian semua orang menggunakan wang jaminan mereka sendiri untuk menjadi Blok yang mungkin menjadi Blok berikutnya.
Model ini sebenarnya sangat serupa dengan POW, di mana para pelombong menggunakan kuasa pengiraan mereka sendiri untuk "menaruh", dan jika ada rantaian yang lebih panjang, adalah perlu untuk beralih ke rantaian ini untuk terus melombong.
POS pasti akan meningkatkan kelajuan keseluruhan rangkaian. Tidak perlu lagi untuk mencapai konsensus dengan melakukan banyak pengiraan yang tidak bermakna, jumlah operasi setiap nod akan mendekati jumlah pengiraan untuk menjalankan kod dalam kontrak dan melakukan pengesahan data.
Sudah tentu, POS masih belum digunakan kerana masih ada beberapa masalah yang belum diselesaikan, salah satunya adalah masalah serangan 51% seperti POW, di mana kuasa pengkomputeran 51% seluruh rangkaian di POW terpusat adalah terhad secara fizikal, kerana kuasa pengkomputeran diperlukan untuk menyediakan peralatan pengkomputeran; berbanding dengan itu, pengumpulan Ether 51% seluruh rangkaian di POS agak mudah, asalkan anda mempunyai wang yang mencukupi. POS secara semula jadi tidak lebih rumit daripada POW, untuk mencapai logik kerja di atas, yang memerlukan pengendalian seperti mengekalkan senarai pengesahan yang berkesan, pembatalan denda, tidak membayar balik, blok cadangan dan blok pertaruhan, mencegah serangan aliansi antara pengesahan, pemulihan selepas pemisahan rangkaian, dan sebagainya.
Satu lagi topik adalah "sliming", sama ada Bitcoin atau Ethereum, semua transaksi kini dilakukan pada satu blockchain yang sama, yang sangat mengehadkan keupayaan pengkomputeran rangkaian terdistribusi.
Oleh itu, Ethereum berharap untuk memperkenalkan mekanisme "fragmen" pada masa akan datang untuk membahagikan seluruh rangkaian kepada beberapa bahagian, untuk mengesahkan transaksi secara bebas di antara mereka. Tetapi antara fragmen akan menggunakan struktur penunjuk untuk merujuk data fragmen lain, dengan cara panggilan asynchronous untuk mempengaruhi fragmen lain, jadi keseluruhan rangkaian tetap sama di mata pengguna, tetapi kapasiti pemprosesan keseluruhan rangkaian akan mempunyai skalabiliti yang sangat kuat.
Dalam bahagian ini, saya akan menunjukkan beberapa kod kontrak yang sebenarnya berfungsi. Kontrak boleh ditulis oleh banyak bahasa paradigma yang berbeza dan akhirnya dikompilasi ke dalam opcode yang dijalankan di EVM, hari ini kami mengambil contoh bahasa JavaScript jenis Solidity, yang merupakan salah satu bahasa EVM yang paling baik dikekalkan.
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");
}
}
Berikut adalah beberapa demonstrasi tatabahasa teras yang anda boleh nyatakan pembolehubah keadaan di Solidity.uint storedData;
Nilai-nilai pembolehubah akan disimpan di Blockchain untuk selama-lamanya.struct
Untuk mengisytiharkan struktur data yang kompleks; fungsi juga boleh ditakrifkan, yang akan dilaksanakan apabila menerima urus niaga, dan pembawa urus niaga boleh memilih fungsi mana yang akan dilaksanakan, jadi kontrak boleh menyediakan beberapa fungsi, yang boleh membuat keputusan logik, memutar, mengubah nilai dalam fungsi.
Bahasa ini mempunyai beberapa ciri kecil yang sangat berguna, seperti algoritma kriptografi yang biasa digunakan.sha256
) ◄ Pengubahsuaian unit10 finney
0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2
Saya tidak tahu apa yang berlaku.msg
adalah pembolehubah global terbina dalam yang dapat membaca maklumat yang berkaitan dengan transaksi ini, seperti pengasas, jumlah, dan lain-lain. Kontrak boleh memanggil kod kontrak lain dalam dua cara,delegatecall
Ini adalah sama dengan meletakkan kod kontrak lain ke dalam konteks semasa untuk dilaksanakan, seolah-olah memperkenalkan fungsi perpustakaan;call
Logiknya adalah memulakan satu urus niaga baru untuk mencetuskan kontrak lain.
Jadi bagaimana kontrak membaca dan menulis data dari blockchain? Pekerjaan yang rumit ini adalah abstrak untuk "variabel keadaan", yang disimpan di atasnya. Data yang disimpan adalah pembolehubah keadaan. Sebenarnya, perubahan kepada pembolehubah keadaan semasa pelaksanaan kontrak tidak disimpan ke dalam blockchain kerana kontrak yang dijalankan adalah pengiraan kepastian. Pelaksanaan kontrak yang dipicu oleh transaksi, hanya membaca data yang ada di blockchain semasa pelaksanaan, jadi selagi kita tahu setiap transaksi yang berkaitan dengan kontrak dalam sejarah, kita boleh membuat deduksi kontrak pada setiap titik masa.
Berikut saya akan menunjukkan satu token kontrak yang benar-benar boleh digunakan untuk mengeluarkan token tersendiri berdasarkan rangkaian Ethereum:
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);
}
}
Kod ini berasal darihttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example(MIT)
Kontrak yang dikenali sebagai Coin menyatakan dua pembolehubah keadaan, yang mana kedua-dua pembolehubah tersebut mempunyai ciri-ciri yang berbeza.minter
Pencipta token yang digunakan untuk menyimpan token ini, menggunakan fungsi pembina ((((function Coin()
) yang memberi nilai kepada pemula transaksi pertama yang digunakan untuk mencipta Kontrak; juga menyatakan peta alamat dompet ke nomborbalances
, yang digunakan untuk menunjukkan baki setiap alamat yang memegang token tersebut.
mint
Fungsi ini menentukan terlebih dahulu sama ada pengasas urus niaga adalah pencipta token tersebut, dan jika ya, jumlah token tertentu akan ditambahkan ke alamat yang ditentukan mengikut parameter fungsi.send
Fungsi ini boleh dipanggil oleh semua orang dan akan mengurangkan jumlah baki tertentu dari alamat pengasas transaksi (jika terdapat baki yang mencukupi) ditambah kepada alamat sasaran, bersamaan dengan fungsi pemindahan.
Kami juga mengisytiharkan sebuah rancangan yang dipanggilSent
Kejadian yang sebenarnya tidak mempunyai apa-apa peranan yang praktikal, hanya untuk memudahkan pencetakan peristiwa penting semasa penyusunan semula, dan pada masa akan datang akan memudahkan pelaksanaan klien ringan (klien ringan hanya menerima peristiwa dan tidak mengeksekusi kontrak).
Ethereum menyediakan IDE yang dipanggil Mix untuk menyalin kod ini, di sebelah kanan Mix anda boleh membuat beberapa blok dan akaun untuk menguji Kontrak anda, dan juga melihat perubahan nilai setiap pembolehubah status semasa pelaksanaan. Perlu disebutkan bahawa Kontrak tidak dapat diubah apabila dikeluarkan, dan operasi seterusnya hanya dipicu oleh transaksi orang lain, yang sangat menjengkelkan untuk pemrogram yang menulis Bug setiap hari, tetapi makna Kontrak adalah "kontrak", yang mana siapa lagi yang akan mempercayai kontrak anda jika anda mengeluarkan kontrak yang tidak dapat diubah secara semula jadi.
Selepas penulisan selesai, kita boleh menggunakan dompet Ethereum untuk mengeluarkan kontrak ini ke web:
Anda boleh mengikuti kontrak ini selepas ia dikeluarkan dan lihat pautan ke antara muka terperinci kontrak:
Di sebelah kiri, anda boleh melihat nilai dua pembolehubah keadaan.minter
Di sini, saya akan berkongsi dengan anda semua tentang apa yang saya lakukan di sini.balances
Oleh kerana ia adalah jadual pemetaan, anda boleh memasukkan alamat untuk mendapatkan imbangan. Di sebelah kanan anda boleh memulakan urus niaga baru untuk kontrak ini, dan terdapat menu turun untuk dipilih.send
ataumint
Fungsi, anda boleh mengisi parameter untuk menyampaikan kepada Kontrak. Oleh kerana di sini kita menghantar transaksi untuk menyampaikan mesej, bukan untuk menyampaikan Ether, kita tidak perlu menetapkan jumlah urus niaga.
Saya akan memperkenalkan kontrak yang sangat menarik, kontrak yang mewujudkan kesan penipuan Ponzi, iaitu anda boleh membayar 1 Ether untuk menyertai kontrak ini, dan selepas itu setiap tiga orang yang menyertai, mereka akan dibayar 3 Ether kepada orang pertama yang menyertai:
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;
}
}
Kod disederhanakan darihttps://ethereumpyramid.com/contract.html
Dengan kod yang mudah, kontrak ini menyatakan satu perkara.participants
Set digunakan untuk menyimpan alamat dompet semua peserta mengikut urutan atau menyatakan satupayoutIdx
Ia digunakan untuk mencatatkan berapa ramai peserta yang telah menerima pulangan 3 Ether sebelum ini.enter
Fungsi utama yang dilaksanakan oleh Kontrak ini ialah terlebih dahulu memeriksa beberapa parameter, memastikan setiap peserta dibayar 1 Ether, dan kemudian meletakkan peserta baru ke dalam akaun.participants
Pada akhir set, jika nombor permulaan peserta sekarang adalah kelipatan 3, 3 Ether dihantar ke nombor pertama.payoutIdx
Perkhidmatan ini akan membantu anda mendapatkan maklumat yang diperlukan.payoutIdx
Mereka akan menunjukkan kepada peserta yang akan datang.
HashTree:
Bitcoin:
Masalah hentian:
Ethereum:
Rangkaian Ethereum:
Seterusnya Ethereum:
Kontrak:
Kontrak IDE:
Pencipta Kuantiti - Impian KecilSaya tidak tahu apa-apa, saya hanya faham sedikit, saya hanya faham sedikit.
xuanxuanDia pergi untuk mengkaji BTC dan ETH.
momoxTidak faham.