Sumber: https://jysperm.me/2016/05/blockchain-slides/
Artikel ini disusun berdasarkan perkongsian teknologi yang saya buat di LeanCloud pada akhir bulan Mac, dengan andaian bahawa pembaca mempunyai pengetahuan asas mengenai kriptografi dan pengetahuan awal mengenai Bitcoin.
Blockchain juga dikenali sebagai blockchain, ia boleh dianggap sebagai HashTree, dan oleh itu ia mempunyai sifat yang sama seperti HashTree:

Gambar diambil dari:<http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html
Iaitu dalam struktur pokok, setiap nod akhir mempunyai nilai buangan, dan nilai buangan nod bukan akhir berasal dari nilai buangan semua nod anak langsungnya, oleh itu setiap nod secara langsung atau tidak langsung mengandungi maklumat mengenai semua nod anak-anaknya. Oleh itu, jika nilai buangan mana-mana nod akhir berubah, nilai buangan semua nod induknya akan berubah, dan nod akar juga mesti berubah.
Saya boleh berikan satu contoh mengenai aplikasi HashTree: “100% bukti simpanan”, yang termasuk dalam kategori “bukti pengetahuan sifar”. Kita boleh mempertimbangkan satu senario di mana pemegang Bitcion perlu menyimpan Bitcoin di bursa untuk berdagang, dan dalam teori, bursa boleh mengambil wang itu (kesemua baki akaun pengguna yang disimpan) untuk menggunakannya, yang tidak diinginkan oleh pengguna, tetapi bursa juga ingin memastikan diri mereka: bursa pertama kali memaparkan alamat Bitcoin yang dipegangnya, dan semua orang mengesahkan bahawa bursa itu benar-benar menyimpan sejumlah Bitcoin sebagai simpanan, tetapi bagaimana untuk membuktikan bahawa wang itu lebih besar daripada jumlah simpanan semua pengguna?

Gambar diambil dari:<http://blog.bifubao.com/2014/03/16/proof-of-reserves
Kita boleh membina HashTree di mana semua nod akhir mewakili pengguna dan mengandungi baki pengguna.Σ) dan ID pengguna (seperti alamat pos)h), dan nod bapa mengandungi jumlah baki nod anak-anaknyasum) dan pengumpulan maklumat semua subnodehashBagi setiap pengguna, ia hanya perlu menunjukkan nod akhir dan saudara-saudaranya, semua nod bapa dan saudara-saudaranya, kerana pengguna itu dapat mengesahkan baki mereka dimasukkan ke dalam nod bapa dan akhirnya dimasukkan ke dalam nod akar.
Dengan cara ini, maklumat yang ditunjukkan kepada setiap pengguna hanya mempunyai maklumat sendiri dan beberapa maklumat yang telah digabungkan, dan setiap pengguna dapat mengesahkan bahawa baki mereka disertakan dalam nod akar tanpa menggunakan baki yang lain.hUntuk apa?e4df9d12Node ini tidak boleh menjadi nod akhir yang mewakili pengguna, tetapi ia harus menjadi nod maklumat yang digabungkan (yang boleh mengandungi pengguna dengan baki 3333, dan pengguna tiruan dengan baki 0) untuk mengelakkan maklumat peribadi pengguna tertentu.
Sekarang kita lihat Git, yang sebenarnya adalah aplikasi blockchain yang sangat tipikal:

Gambar diambil dari:http://gitbook.liuhui998.com/1_2.html (GPL v2)
Dalam Git, sama ada fail (Blob), indeks (Tree) atau komited (Commit), mempunyai Hash yang ditentukan oleh kandungannya, jika dua objek mempunyai kandungan yang sama, maka ia mempunyai Hash yang sama. Dalam Git, sejarah keseluruhan gudang adalah satu Blockchain, setiap Commit bersamaan dengan satu Blok, Commit mengandungi Hash Commit sebelumnya dan Hash Object yang berkaitan dengan pengubahsuaian kali ini, Hash Commit sendiri ditentukan oleh kandungannya dan maklumat ini.
Git menggunakan blockchain untuk menentukan satu sejarah tunggal untuk gudang. Jika satu Commit diubah, semua Hash Commit selepasnya akan berubah.push --force), tetapi perubahan ini akan dikesan oleh semua pengarang bersama.
Satu lagi aplikasi klasik Blockchain ialah Bitcoin, yang mana Bitcoin telah menyebarkan perkataan Blockchain (walaupun konsep ini telah wujud sejak dahulu lagi):

Gambar diambil dari:https://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)
Dalam Bitcoin, setiap blok mengandungi satu siri transaksi dan hash dari blok sebelumnya, dan seluruh blockchain membentuk satu akaun yang terdesentralisasi. Oleh kerana blok baru dihasilkan setiap sepuluh minit, dan blok yang dihasilkan akan kekal di blockchain, blockchain menetapkan urutan transaksi yang berlaku, mengekalkan urutan transaksi yang berlaku, dan menentukan sama ada akaun mempunyai baki yang cukup untuk melancarkan transaksi.
Bahagian pertama perkongsian ini adalah untuk melihat semula Bitcoin secara ringkas.
Penciptaan blok dalam Bitcoin dilakukan melalui “bukti kuantiti kerja”, iaitu semua “penambang” yang terlibat dalam “pertambangan” perlu melakukan pengiraan serentak yang berkaitan dengan kuasa pengiraan, yang bersifat rawak, sehingga jumlah rawak yang memenuhi syarat tertentu dihitung, sebelum mendapat hak untuk mengeluarkan blok.
Secara default, setiap pelombong akan sentiasa mempercayai ‘rantai terpanjang’ dan mengira blok seterusnya berdasarkan rantaian terpanjang yang diketahui dan memenuhi peraturan, jika tidak, tenaga pengiraan anda akan terbuang sia-sia kerana pelombong lain akan sentiasa mengakui rantaian terpanjang, dan jika anda tidak memulakan kerja berdasarkan rantaian terpanjang, maka anda akan bersaing dengan tenaga pengiraan semua pelombong lain.
Bitcoin direka untuk menghasilkan satu blok baru setiap 10 minit, masa ini dicapai oleh semua orang dengan melihat selang beberapa blok yang lalu, untuk menyesuaikan kesukaran pembentukan blok seterusnya. Apabila beberapa blok yang lalu dihasilkan lebih cepat daripada yang diharapkan, orang akan menganggap pembentukan blok seterusnya harus mempunyai kesukaran yang lebih tinggi.
Biasanya, setiap nod Bitcoin perlu menyimpan data Blockchain yang lengkap untuk mengesahkan sama ada transaksi itu sah atau tidak. Tetapi sekarang blockchain lengkap sudah 66G, dan masih berkembang pada kadar sekitar 0.1G setiap hari. Bitcoin mempunyai mekanisme “Simplified payment verification (SPV) ” yang disebut “pelanggan ringan” yang boleh memilih untuk tidak menyimpan blockchain yang lengkap, tetapi hanya menyimpan semua elemen blok, yang melekat pada satu atau beberapa nod lengkap, dan kemudian mengesahkan jumlah kerja setiap blok, setiap kali transaksi perlu disahkan.

Gambar diambil dari:<https://github.com/ethereum/wiki/wiki/White-Paper
Sebenarnya kita boleh membayangkan Blockchain Bitcoin sebagai “mesin status”, keseluruhan Blockchain adalah “buku” yang mempunyai status, di mana setiap rekod urus niaga disimpan, berdasarkan rekod urus niaga ini dapat dikira “status” keseluruhan buku pada bila-bila masa, iaitu berapa banyak baki setiap akaun dalam rangkaian Bitcoin. Setiap Transaksi adalah perubahan keadaan, dan setiap Blok adalah “konsensus” terhadap keadaan semasa pelombong seluruh rangkaian Bitcoin, kerana Bitcoin menghasilkan satu Blok baru setiap 10 minit, bersamaan dengan setiap 10 minit kita akan mencapai satu konsensus mengenai baki semua akaun, dan dalam tempoh sepuluh minit, keadaan buku tersebut adalah “keadaan huru-hara”.
Terdapat banyak mata wang kripto yang berasal dari Bitcoin, yang sering disebut sebagai “mata wang alt”, yang biasanya mempunyai dua jenis pelaksanaan:
Yang pertama adalah menggunakan rangkaian sendiri, yang berasingan dari Bitcoin, dengan kelebihan bahawa crypto dapat merancang protokol dan peraturan sendiri dengan sangat fleksibel, tetapi kerana jumlah pengguna sukar untuk mencapai jumlah yang setara dengan Bitcoin, pertahanan terhadap serangan berniat jahat akan sangat lemah.
Kaedah kedua adalah menggunakan rangkaian Bitcoin untuk melaksanakan “protocol meta” dan menambahkan maklumat tersuai di atas Transaksi Bitocin untuk melaksanakan logiknya sendiri. Manfaatnya ialah anda boleh menggunakan skala perhitungan Bitcoin untuk melawan serangan, tetapi juga kerana bergantung pada rangkaian Bitcoin, tidak semua pelombong akan mematuhi peraturan koin tiruan, oleh itu tidak dapat mencegah masuknya Block Blockchain yang tidak mematuhi peraturan, hanya dapat menyaring transaksi yang tidak mematuhi peraturan pada pelanggan, dan tidak dapat menggunakan fungsi pengesahan yang disederhanakan yang disediakan oleh Bitcoin yang disebutkan di atas.
Untuk mata wang tiruan ini, Bitcoin boleh menyediakan Blockchain yang melibatkan banyak pelombong yang dapat menahan serangan berniat jahat pada skala besar, sementara Bitcoin juga boleh memuatkan data tersuai pada Transaksi, meninggalkan ruang untuk pelaksanaan mata wang tiruan.
Bitocin juga menyediakan satu.Bitcoin ScriptTetapi kerana ini bukan fungsi teras Bitcoin, hanya operasi yang lebih mudah boleh dilakukan, hanya data yang sangat terhad dapat dibaca di Blockchain, dan kerana kekurangan mekanisme kitaran, sukar untuk menulis logik Turing yang lengkap.

Gambar diambil dari:https://www.ethereum.org/assets (CC 3.0)
“Ethereum” adalah platform aplikasi terdesentralisasi berasaskan blockchain yang membina infrastruktur Bitcoin berdasarkan teknologi blockchain kriptografi sebagai platform umum, dan melengkapkan beberapa fungsi yang hilang dalam rangkaian Bitcoin supaya pemaju dapat menjalankan aplikasi terdesentralisasi mereka sendiri di atas Blockchain.
Sebelum saya menerangkan Ethereum secara terperinci, saya ingin memperkenalkan dua asas utama rangkaian terdesentralisasi: kriptografi dan perjudian. Secara semula jadi, kriptografi hanya menjamin keselamatan matematik melalui enkripsi kunci awam, tandatangan digital, hashing dan algoritma ringkasan; dan perjudian adalah bahawa dalam rangkaian terdesentralisasi, sesiapa sahaja, termasuk orang yang berniat untuk menyerang rangkaian ini, boleh mengambil bahagian.
Walau bagaimanapun, dalam dunia digital, mengeluarkan sepotong data tidak mempunyai kos, tidak ada “faedah” dan “kerugian”, dan oleh itu anda mesti menjalin hubungan dengan dunia fizikal untuk menentukan “faedah”. Sebagai contoh, dalam rangkaian Bitocin, jika penyerang ingin mengubah arah Blcokchain secara buatan, anda perlu mempunyai kekuatan pengkomputeran yang lebih tinggi daripada semua penambang lain, dan dalam dunia fizikal, kekuatan pengkomputeran diperlukan untuk menyediakan peralatan pengkomputeran, dan peralatan pengkomputeran perlu dibeli dari dunia fizikal.
Jadi dalam rangkaian yang terdesentralisasi, tidak semua masalah dapat diselesaikan oleh “teknologi”, di mana teknologi tidak dapat dicapai, ia mesti diselesaikan melalui faedah, melalui insentif ekonomi. Juga kerana keperluan “insentif ekonomi”, Ethereum juga mempunyai sistem dompet (unit mata wang disebut “Ether”) dan setiap pengguna mempunyai alamat dompet sebagai satu-satunya identiti, dalam hal ini sama dengan Bitcion.
“Kontrak” adalah konsep terpenting yang diperkenalkan oleh Ethereum. Dalam Bitcoin, semua alamat dimiliki oleh satu pengguna. Apabila kita mengatakan “pengguna”, kita sebenarnya bermaksud satu pasangan kunci awam dan peribadi. Tetapi dalam Ethereum, selain alamat yang dimiliki oleh sepasang kunci, ada juga alamat yang dimiliki oleh “kod”, iaitu Kontrak.
Sebagai contoh pertama, “dompet bersama berbilang orang”, terdapat satu ciri untuk mencipta dompet berbilang orang di dalam klien rasmi Ethereum:

Seperti yang ditunjukkan di bawah, satu alamat dompet boleh dicipta dengan 2 orang yang lain, dan setiap orang boleh menggunakan 100 Ether setiap hari, jika melebihi had ini, ia perlu mendapat persetujuan daripada orang lain.
Fungsi ini sebenarnya akan membuat Kontrak, dan logik di atas diterangkan melalui kod dalam Kontrak. Apabila anda ingin mengeluarkan dana 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, transaksi perbelanjaan sebenar akan dilancarkan, jika tidak, permintaan perbelanjaan ini akan ditolak ((tidak ada perbelanjaan sebenar).
Contoh lain ialah “kontrak perlindungan”, yang selalu dikatakan Bitcoin sebagai mata wang digital yang tidak stabil dalam nilai wangnya (dan nilai pertukaran mata wang yang sah), yang sering berlaku dalam satu hari apabila nilai mata wang naik dua kali ganda atau jatuh dua kali ganda, tetapi dengan bantuan Kontrak, kontrak perlindungan dapat diselesaikan.
Kita akan memanggil seseorang yang ingin mengekalkan nilai mata wang tidak berubah sebagai “penghindar risiko”, dan orang lain yang bersedia mengambil risiko turun naik nilai mata wang dan mendapat keuntungan daripadanya sebagai “pengambil risiko”, jadi mereka boleh membuat perjanjian dengan jumlah (contohnya 1000 CNY) dan satu tetingkap masa (contohnya sebulan), dan membuat Kontrak yang menjalankan logik berikut:
Jika nilai Ether meningkat, pemegang risiko mendapat keuntungan, jika nilai Ether menurun, pemegang risiko rugi, tetapi penyingkir risiko selalu tidak rugi. Sudah tentu, penyingkir risiko dan pemegang risiko boleh bersetuju terlebih dahulu tentang “insurans” yang perlu dibayar oleh penyingkir risiko, dan juga boleh bersetuju bahawa pemegang risiko perlu memberikan jaminan beberapa kali ganda daripada 1000 CNY (lebih tinggi dua kali ganda, lebih besar risiko yang dapat ditanggung).
Dalam contoh di atas sebenarnya terdapat satu masalah yang tidak diselesaikan dengan baik, iaitu bagaimana untuk menentukan kadar pertukaran antara Ether dan mata wang kripto, seperti yang kita sebutkan di atas, Kontrak hanya dapat mengakses data di blockchain, dan mata wang kripto adalah data yang wujud di dunia nyata dan bukan dunia kriptografi, kita perlu memasukkan “data dari dunia bukan kriptografi” ke dalam blockchain melalui mekanisme tertentu.
Kita boleh merancang satu lagi kontrak untuk menetapkan logik untuk mendapatkan kadar pertukaran antara Ether dan mata wang fiat dari dunia nyata, dalam setiap tetingkap masa (seperti satu jam):
Bagi mana-mana peserta, kerana tidak mengetahui tawaran orang lain, penyampaian kadar pertukaran yang benar mempunyai peluang lebih besar untuk mendapat ganjaran, dan penyampaian kadar pertukaran yang sangat aneh akan mempunyai peluang besar untuk kehilangan wang jaminan.
Sudah tentu peraturan ini mempunyai beberapa kelemahan, contohnya jika seseorang mempunyai banyak wang jaminan, maka dia boleh menarik nilai purata ke harga yang lebih tinggi atau lebih rendah daripada nilai pertukaran sebenar dan mendapat ganjaran, dan membuat orang lain yang memberikan nilai pertukaran yang tepat kehilangan jaminan. Tetapi sebenarnya sama juga di dunia nyata, jika anda mempunyai banyak wang anda juga dapat menaikkan atau menekan harga komoditi, hanya jika dibandingkan dengan dunia nyata, jumlah mata wang elektronik masih sangat kecil dan tidak memerlukan banyak wang untuk melakukannya; tetapi sebenarnya kenaikan atau tekanan kadar ini sangat berisiko, kerana anda tidak pasti berapa banyak wang jaminan yang anda bayar, dan jika gagal, anda akan kehilangan semua jaminan.
Kelemahan lain ialah langkah “semua orang boleh membayar deposit kepada Kontrak dan memberikan nilai tukar” yang dilakukan dengan membuat transaksi dan semua transaksi akan ditulis di atas Blockchain, jadi nilai tukar yang anda serahkan sebenarnya dapat dilihat oleh orang lain, dan seterusnya memberi peluang kepada penyerang yang berniat jahat.
Sebelum ini kita telah bercakap mengenai Contract yang boleh membaca data dari blockchain, tetapi data dari blockchain adalah pasti, jadi jika kita ingin mewujudkan aplikasi yang serupa dengan perjudian, dari mana kita boleh mendapatkan nombor rawak?
Satu sumber nombor rawak yang boleh difikirkan adalah Hash dari Blok seterusnya, dalam kebanyakan kes, tahap keacakan ini cukup. Tetapi sebenarnya pelombong dapat memanipulasi nombor rawak ini hingga tahap tertentu, dengan mengandaikan bahawa seorang pelombong mengambil bahagian dalam pertaruhan, dan keuntungan pertaruhan lebih besar daripada keuntungan dari menggali satu blok, maka jika pelombong menggali blok yang akan menyebabkan dirinya kehilangan pertaruhan, maka jelas bahawa pelombong akan memilih untuk tidak menerbitkan blok baru ini, yang lebih jelas dengan kekuatan perhitungan pelombong tunggal.
Oleh itu, kita perlu memperkenalkan mekanisme yang serupa dengan penarikan nilai tukar untuk mengumpulkan bilangan yang tidak terkawal, dan kemudian menggunakan biji-bijian tersebut untuk mengira bilangan yang tidak terkawal pada akhir setiap tetingkap masa. Tetapi seperti penarikan nilai tukar, kerana peserta membuat penyerahan nilai tukar dengan membuat transaksi, setiap nombor yang diberikan oleh setiap orang dapat dilihat oleh orang lain di antara tetingkap masa, jadi seseorang yang telah mengambil bahagian dalam pertaruhan tertentu dapat memilih dengan teliti satu bilangan yang tidak terkawal untuk membuat bilangan yang dihasilkan oleh biji-bijian yang telah diserahkan oleh orang lain ditambah dengan biji-bijian baru yang sesuai dengan apa yang diharapkannya.
Oleh itu, kita perlu membahagikan tetingkap pengambilan benih kepada dua bahagian untuk mendapatkan bilangan rawak yang tidak dapat diramalkan dan diintervensi oleh sesiapa:
Pada peringkat pertama, anda hanya tahu nilai serentak benih yang diserahkan oleh orang lain, dan tidak tahu benih sebenar, oleh itu anda tidak dapat membina benih dengan teliti untuk campur tangan; dan pada peringkat kedua, semua orang hanya mengesahkan benih yang diserahkan pada peringkat pertama, dan tidak dapat menghantar yang baru, dan juga tidak dapat menghalang orang lain untuk menghantar benih.
Sebelum ini kita telah menyebut bahawa Bitcoin Script tidak mempunyai keupayaan untuk menyediakan kitaran, berulang, melompat, dan lain-lain, mungkin Bitcoin adalah untuk mengawal masa pelaksanaan Bitcoin Script, kerana program yang ditulis oleh bahasa pengaturcaraan Turing yang lengkap, menurut “teorema berhenti” Turing, tidak boleh selalu hanya dari sudut analisis statik untuk menentukan sama ada ia akan berakhir setelah langkah terhad, sehingga penyerang yang berniat jahat dapat membuat Transaksi yang menyebabkan kitaran mati untuk mengganggu kerja normal pelombong.
Ethereum sekali lagi mengelilingi masalah ini dengan “insentif ekonomi”. Kontrak berjalan dalam bentuk opcode (kod operasi) pada mesin maya yang dikenali sebagai EVM (Ethereum Virtual Machine). EVM adalah mesin maya yang mempunyai “biaya” sendiri, di dalam standard EVM, setiap Gas yang digunakan oleh opcode ditakrifkan berdasarkan memori dan masa CPU yang diperlukan untuk operasi, yang merupakan sumber pengiraan yang dibeli oleh Ether.
Kemudian kita kembali kepada isu “selang persetujuan”, yang disebutkan di atas, Bitcoin mempunyai satu blok baru setiap 10 minit, yang bermaksud bahawa rangkaian keseluruhan mencapai satu “kesesuaian” setiap 10 minit, jadi transaksi Bitcoin biasa perlu menunggu beberapa puluh minit sebelum disahkan, mungkin menunggu satu jam (enam blok) sebelum orang menganggap transaksi itu boleh dipercayai.
Ini kerana selang persetujuan yang lebih cepat akan meningkatkan kelebihan “kubah terpusat”. “Kubah” bermaksud penambang Bitcoin berkumpul untuk menambang, penambang mematuhi arahan kubah tanpa syarat, dan akhirnya membahagikan hasil dengan kubah, jelas Bitcoin sebagai sistem terdesentralisasi tidak mengharapkan kubah terpusat ini mempunyai kelebihan tambahan.
Apabila seorang pelombong A menggali blok baru, dia akan menyiarkan blok itu, dan orang lain akan segera bekerja berdasarkan blok baru itu sebaik sahaja menerima berita itu. Perkiraan masa antara “A menggali blok baru” dan “menerima berita yang disiarkan oleh A” pada orang lain sebenarnya terbuang sia-sia, dan pelombong lain di kolam penambangan terpusat tidak akan mempunyai masalah ini, kerana mereka boleh mendapatkan maklumat lebih cepat mengenai blok baru yang dihasilkan dan segera bekerja berdasarkan blok baru.

Tempoh siaran ini mungkin mengambil masa beberapa saat, yang tidak begitu penting untuk 10 minit, tetapi kelebihan tambang terpusat akan menjadi lebih jelas jika kita mengurangkan selang persetujuan. Tetapi Ethereum menyelesaikan masalah ini dengan memperkenalkan konsep “Uncle Block”, yang mengurangkan selang persetujuan kepada 15 saat, dan Bitcoin mempunyai peningkatan besar dalam kelajuan pengesahan pembayaran.
Dalam Blockchain Bitcoin, satu blok hanya boleh mempunyai satu blok bapa dan satu blok anak. Tetapi dalam Ethereum, satu blok yang baru dihasilkan boleh mempunyai satu blok bapa dan beberapa blok bapa. Kembali kepada contoh di atas, jika seseorang menggali blok baru di A tetapi orang lain belum menerima masa siaran, jika seseorang menggali blok baru, tetapi kerana siaran lebih lewat tidak diterima oleh semua orang, maka blok ini berpotensi menjadi “bapa blok” untuk blok seterusnya.

Gambar diambil dari:<https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time
Di bahagian seterusnya, saya akan memperkenalkan kepada anda beberapa masalah yang belum diselesaikan oleh Ethereum.
Pertama, Ethereum masih mencapai persetujuan seperti Bitcoin melalui POW (bukti kuantiti kerja), dan hanya nod yang menyelesaikan jumlah kerja tertentu yang dapat mengambil bahagian dalam kerja yang dihasilkan oleh blok. Masalah dengan bukti kuantiti kerja adalah bahawa ia akan membazirkan banyak tenaga pengkomputeran untuk memastikan keselamatan rangkaian, walaupun ia berdasarkan idea “insentif ekonomi” yang kami sebutkan di atas, tetapi sebenarnya dapat diperbaiki. Ehtereum berpendapat bahawa cara yang lebih baik adalah menggunakan POS (bukti pemilikan) untuk menggantikan bukti kuantiti kerja, yang dapat meningkatkan kecekapan rangkaian ini.
Oleh kerana Ether itu sendiri bernilai, mengapa tidak menggunakan insentif ekonomi itu sendiri? POS bermaksud bahawa setiap node yang ingin mengambil bahagian dalam block generation (dalam penggalian dalam erti kata tradisional) (disebut verifikator) perlu membayar jaminan kepada sistem (di sini sistem merujuk kepada peraturan dalam protokol, dan semua node menganggap jaminan itu “dingin”) membayar jaminan, dan kemudian menggunakan jaminan mereka sendiri untuk kemungkinan menjadi blok yang akan datang (yang disebut “mungkin” merupakan prasyarat penting bahawa blok itu mestilah sesuai dengan perjanjian), jika blok itu benar-benar menjadi blok yang akan datang, maka semua node yang telah dicatatkan akan diberi ganjaran, atau jaminan akan ditolak.
Model ini sebenarnya sangat serupa dengan POW, di POW, pelombong menggunakan kekuatan perhitungan mereka sendiri untuk “bertaruh”, dan jika terdapat satu rantaian yang lebih panjang, perlu untuk beralih ke rantaian ini untuk terus menambang Kerana semakin banyak rantaian yang terlibat, semakin besar kemungkinan menjadi rantaian yang betul, akhirnya kita mencapai persetujuan. Dan di POS, kita menggunakan jaminan kita sendiri untuk bertaruh, kita juga cenderung untuk memilih blok yang telah dipertaruhkan oleh banyak orang lain (jika ia adalah undang-undang), dan akhirnya mencapai persetujuan.
POS pasti akan meningkatkan jumlah keseluruhan rangkaian Kita tidak perlu lagi mencapai konsensus dengan melakukan banyak pengiraan yang tidak masuk akal, jumlah operasi setiap nod akan mendekati jumlah pengiraan yang dijalankan dalam kod Kontrak dan melakukan pengesahan data
Sudah tentu, POS belum digunakan kerana masih ada beberapa masalah yang belum diselesaikan, salah satunya adalah masalah serangan 51% seperti POW, di mana pengumpulan 51% kekuatan perhitungan di POW mempunyai batasan fizikal tertentu kerana kekuatan perhitungan diperlukan untuk menyediakan peranti perhitungan; dan Ether yang mengumpulkan 51% kekuatan perhitungan di POS adalah lebih mudah untuk mendapatkannya jika anda mempunyai wang yang mencukupi.
Satu lagi topik yang dibincangkan ialah “pemisahan”, sama ada Bitcoin atau Ethereum, kini semua pengesahan urus niaga dilakukan pada Blockchain yang sama, yang sangat mengehadkan keupayaan pengiraan rangkaian yang diedarkan. Ya, setiap nod perlu menerima, menyimpan, dan mengesahkan setiap urus niaga, dan kapasiti pemprosesan keseluruhan rangkaian sebenarnya sama dengan kapasiti pemprosesan satu nod.
Oleh itu, Ethereum berharap untuk memperkenalkan mekanisme “pemisahan” pada masa akan datang, untuk membahagikan seluruh rangkaian menjadi beberapa bahagian, dan melakukan pengesahan transaksi secara bebas di antara mereka. Tetapi, pemisahan antara mereka akan menggunakan struktur penunjuk untuk merujuk data pecahan lain, dengan cara memanggil asynchronous untuk mempengaruhi pecahan lain, jadi seluruh rangkaian akan tetap menjadi satu bagi pengguna, tetapi keupayaan pemprosesan keseluruhan rangkaian akan mempunyai keluasan yang sangat kuat.
Saya akan tunjukkan kepada anda beberapa kod yang boleh digunakan untuk Contract. Contract boleh ditulis dalam pelbagai bahasa yang berbeza dan akhirnya dikompilasi menjadi opcode yang dijalankan di EVM. Hari ini, kami akan menggunakan bahasa JavaScript Solidity, yang merupakan salah satu bahasa EVM yang paling baik dijaga.
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");
}
}
Di bawah ini adalah beberapa contoh sintaks teras yang anda boleh gunakan untuk menyatakan pembolehubah status dalam Solidity:uint storedData;), nilai-nilai pembolehubah ini akan disimpan di blockchain untuk selama-lamanya;structUntuk mendeklarasikan struktur data yang rumit; juga boleh menentukan fungsi, fungsi ini akan dilaksanakan apabila menerima urus niaga, pencetus urus niaga boleh memilih fungsi yang akan dilaksanakan, jadi satu Kontrak boleh menyediakan beberapa fungsi, di dalam fungsi boleh membuat keputusan logik, berputar, mengubah nilai kuantiti.
Bahasa ini mempunyai ciri-ciri kecil yang mudah digunakan, seperti algoritma kriptografi yang biasa digunakan.sha256Unit penukaran10 finney“Saya tidak tahu apa-apa, saya hanya mahu tahu alamat dompet saya”, katanya.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2) dan sebagainya.msgIa adalah pembolehubah global yang terbina dalam yang boleh membaca maklumat berkaitan dengan transaksi ini, seperti pencetus, jumlah, dan sebagainya. Kontrak boleh memanggil kod kontrak lain dengan dua cara,delegatecallIa sama dengan meletakkan kod dari kontrak lain ke dalam konteks yang sedang dijalankan, seolah-olah memperkenalkan fungsi perpustakaan; dancallIa adalah logik untuk memulakan satu transaksi baru untuk mencetuskan satu lagi kontrak.
Jadi bagaimana Contract membaca dan menulis data dari blockchain? Pekerjaan rumit ini diabstrak untuk “variabel keadaan”, di mana storedData adalah pembolehubah keadaan. Sebenarnya, perubahan pada pembolehubah keadaan semasa pelaksanaan Contract tidak disimpan ke dalam blockchain, kerana pelaksanaan Contract adalah pengiraan pasti.
Berikut adalah contoh yang benar-benar boleh digunakan untuk mengeluarkan token anda sendiri 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 diambil daripadahttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example (MIT)
Kontrak ini, yang dinamakan Coin, menyatakan dua pembolehubah keadaan, iaitu:minterPencipta untuk menyimpan token ini, dalam membina fungsi ((function Coin()), yang memberikan pencipta kepada pelaku transaksi pertama yang digunakan untuk mencipta Contract; juga menyatakan alamat dompet ke dalam jadual pemetaan digital balances, digunakan untuk menunjukkan baki setiap alamat pemegang token tersebut.
mintFungsi ini menilai sama ada pencetus transaksi adalah pencipta token tersebut, dan jika ya, tambahkan sejumlah token ke alamat yang ditetapkan mengikut parameter fungsi.sendFungsi ini boleh dipanggil oleh semua orang dan akan mengurangkan baki tertentu dari alamat pencetus urus niaga (jika terdapat baki yang mencukupi), ditambah kepada alamat sasaran, bersamaan dengan fungsi perpindahan.
Kami juga telah mengumumkan sebuah nama,SentPeristiwa, peristiwa sebenarnya tidak akan mempunyai apa-apa peranan yang praktikal, hanya untuk memudahkan pencetakan peristiwa kritikal semasa debug, masa depan juga akan memudahkan pelaksanaan klien ringan ((klien ringan hanya menerima peristiwa dan tidak melaksanakan Kontrak secara sebenar).

Ethereum menyediakan sebuah IDE yang dipanggil Mix untuk melakukan debug kod ini, di sebelah kanan Mix anda boleh membuat beberapa blok dan akaun untuk menguji kontrak anda, dan anda juga boleh melihat perubahan nilai setiap pembolehubah keadaan semasa pelaksanaan. Perlu diingat bahawa kontrak tidak dapat diubah sebaik sahaja ia dikeluarkan, dan kemudian ia dijalankan sepenuhnya oleh transaksi orang lain, yang boleh menjadi sangat menjengkelkan bagi pengaturcara yang menulis bug setiap hari, tetapi terminologi kontrak adalah “kontrak”.
Setelah selesai, kita boleh menggunakan dompet Ethereum untuk menerbitkan kontrak ini di internet:

Selepas ia dilancarkan, anda boleh mengikuti kontrak ini dengan mengunjungi laman web Contract:

Di sebelah kiri anda boleh lihat nilai dua pembolehubah keadaan,minter“Saya tidak tahu di mana saya boleh mendapatkannya.balancesKerana ia adalah jadual pemetaan, anda boleh masukkan alamat untuk melihat baki. Di sebelah kanan anda boleh memulakan transaksi baru dengan kontrak ini, dan terdapat menu turun ke bawah untuk memilih.sendAtau mungkin.mintFungsi, anda boleh mengisi parameter yang dihantar ke Contract. Kerana di sini kita menghantar urus niaga untuk menyampaikan mesej, bukan untuk menyampaikan Ether, jadi kita tidak perlu menetapkan jumlah urus niaga.
Saya akan memperkenalkan satu Contract yang sangat menarik, iaitu Contract yang mempunyai kesan seperti penipuan ponzi iaitu anda boleh membayar 1 Ether kepada Contract untuk menyertai permainan ini, dan 3 Ether akan dibayar kepada setiap 3 orang yang menyertai, mengikut urutan:
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;
}
}
Kodnya agak mudah, dan kontrak ini menyatakan bahawaparticipantsArray digunakan untuk menyimpan alamat dompet semua peserta mengikut urutan, atau menyatakan satupayoutIdxIa digunakan untuk mencatatkan jumlah peserta yang telah menerima 3 Ether.enterUntuk melaksanakan fungsi utama kontrak ini, pertama-tama, periksa parameter untuk memastikan setiap peserta membayar 1 Ether, dan kemudian masukkan peserta baru ke dalam kontrak.participantsPada akhir arisan, jika nombor siri peserta semasa adalah 3 maka 3 Ether akan dihantar kepada peserta yang kedua.payoutIdxSeorang peserta, dan akanpayoutIdxMenunjuk kepada peserta seterusnya.
HashTree:
Bitcoin:
Halting Problem:
Ethereum:
Ethereum Network:
Next of Ethereum:
Contract:
Contract IDE: