Perkenalan Blockchain dan Ethereum

Penulis:Tidak ada, Dibuat: 2016-05-05 17:31:57, Diperbarui: 2016-05-05 17:32:31

Dari mana:https://jysperm.me/2016/05/blockchain-slides/

Artikel ini adalah hasil dari berbagi teknologi yang saya lakukan di LeanCloud pada akhir Maret, dengan asumsi pembaca sudah memiliki pengetahuan dasar tentang kriptografi dan pemahaman awal tentang implementasi Bitcoin.

Blockchain juga disebut blockchain, dan dapat dianggap sebagai jenis HashTree, karena itu ia memiliki beberapa sifat yang sama dengan HashTree:

blockchain-hash-tree

Gambar diambil darihttp://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

Dalam sebuah struktur pohon, setiap node terminal memiliki sebuah hash, sedangkan hash dari node non-terminal berasal dari hash dari semua sub-node langsungnya, sehingga setiap node secara langsung atau tidak langsung berisi informasi dari semua sub-node nya.

Saya dapat menyebutkan aplikasi tentang HashTree: "100% bukti cadangan", yang termasuk dalam masalah "bukti pengetahuan nol". Kita dapat mempertimbangkan skenario di mana pemegang Bitcion perlu mengirim Bitcoin ke pertukaran untuk melakukan transaksi, dan secara teori pertukaran dapat memindahkan uang itu (saldo akun yang terdaftar oleh semua pengguna) untuk menggunakannya, yang tidak ingin dilihat oleh pengguna, dan pertukaran juga ingin membersihkan diri: pertukaran pertama mempublikasikan alamat Bitcoin yang mereka miliki, untuk memastikan bahwa transaksi benar-benar memiliki banyak Bitcoin sebagai cadangan, tetapi bagaimana membuktikan bahwa uang itu sebenarnya lebih besar dari jumlah total pengguna?

blockchain-proof-of-reserves

Gambar diambil darihttp://blog.bifubao.com/2014/03/16/proof-of-reserves

Kita bisa membuat sebuah HashTree, dimana semua node terminal mewakili satu pengguna, yang berisi saldo pengguna.Σ) dan serangkaian ID pengguna (misalnya alamat email)h), sedangkan node induk berisi jumlah saldo dari node anak-anaknya.sum), dan serangkaian informasi dari semua sub-node.hashUntuk setiap pengguna, hanya perlu menunjukkan pada mereka node terminal dan saudara mereka sendiri, semua node induk dan saudara mereka, karena pengguna dapat mengkonfirmasi bahwa keseimbangan mereka tercakup dalam node induk dan akhirnya tercakup dalam node akar dengan cara melangkah mundur dari node induk.

Dengan cara ini, informasi yang ditampilkan kepada setiap pengguna hanya informasi sendiri dan beberapa informasi yang telah digabungkan, dan setiap pengguna dapat mengkonfirmasi bahwa saldo mereka tercakup dalam root node tanpa mengetahui saldo penggunaan lainnya.hUntuke4df9d12Sebuah node harus tidak menjadi node akhir yang mewakili pengguna, tetapi harus menjadi node informasi yang digabungkan (nodus ini dapat berisi pengguna dengan saldo 3333, dan pengguna palsu dengan saldo 0) untuk menghindari pelepasan informasi privasi pengguna tertentu.

Sekarang kita akan melihat Git, yang sebenarnya adalah aplikasi blockchain yang sangat khas:

blockchain-git-objects-example

Gambar diambil darihttp://gitbook.liuhui998.com/1_2.html(GPL v2)

Di Git, baik file (Blob), indeks (Tree) atau commit (Commit), setiap file memiliki Hash yang ditentukan oleh isinya, jika dua objek memiliki konten yang sama, maka mereka memiliki Hash yang sama. Di Git, sejarah seluruh repository adalah Blockchain, setiap Commit setara dengan sebuah Block, Commit berisi Hash dari Commit sebelumnya dan Hash dari objek terkait yang dimodifikasi ini, Commit sendiri Hash ditentukan oleh isinya dan informasi ini.

Git menggunakan Blockchain untuk menentukan riwayat unik untuk repository. Ya, jika sebuah Commit diubah, semua Hash dari Commit setelahnya berubah. Tentu saja, karena Git hanyalah alat pengendalian versi, itu tidak mencegah Anda untuk mengubah riwayat (setelah semua, Anda juga dapat rebase).push --forceTapi perubahan ini akan dirasakan oleh semua rekan penulis.

Aplikasi klasik lain dari Blockchain adalah Bitcoin, yang juga menyebarkan kata Blockchain (yang sebenarnya sudah ada sejak awal):

blockchain-bitcoin-block-data

Gambar diambil darihttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

Dalam Bitcoin, setiap Blok berisi serangkaian Transaksi dan Hash dari Blok sebelumnya, sementara seluruh Blockchain membentuk satu buku catatan terdesentralisasi. Karena hanya setiap sepuluh menit Blok baru dihasilkan, dan Blok yang dihasilkan akan tetap di Blockchain selamanya, Blockchain menetapkan urutan transaksi yang terjadi, mempertahankan urutan yang terjadi sebelumnya, dan kemudian menentukan apakah sebuah akun memiliki cukup saldo untuk memulai transaksi.

Bitcoin

Bagian pertama dari berbagi ini adalah dengan mengulas Bitcoin secara sederhana.

Blok di Bitcoin dihasilkan melalui "bukti volume kerja", yang berarti bahwa semua "penambang" yang terlibat dalam "penambangan" harus melakukan perhitungan acak yang terkait dengan kekuatan komputasi, yang bersifat acak, sampai jumlah acak yang memenuhi kondisi tertentu dihitung, untuk mendapatkan hak untuk menerbitkan Blok.

Secara default, setiap penambang akan selalu mempercayai "rantai terpanjang" dan menghitung blok berikutnya berdasarkan rantai terpanjang yang diketahui dan memenuhi aturan, jika tidak, maka daya komputasi Anda akan sia-sia.

Bitcoin dirancang untuk menghasilkan satu blok baru setiap 10 menit, yang dilakukan oleh semua orang bersama-sama dengan melihat interval waktu beberapa blok sebelumnya untuk menyesuaikan kesulitan pembentukan blok berikutnya. Ketika beberapa blok sebelumnya dihasilkan lebih cepat dari yang diharapkan, orang akan menganggap bahwa pembentukan blok berikutnya harus memiliki kesulitan yang lebih tinggi.

Biasanya, setiap node Bitcoin perlu menyimpan data Blockchain lengkap untuk memastikan apakah transaksi itu sah atau tidak. Namun sekarang blockchain lengkap sudah ada 66G, dan masih tumbuh dengan kecepatan sekitar 0.1G per hari. Jika meminta setiap pengguna Bitcoin untuk menyimpan blockchain lengkap tidak terlalu sulit, maka Bitcoin memiliki mekanisme "Simplified Confirmation SPV, Simplified payment verification" yang disebut "Klien tingkat ringan" yang dapat memilih untuk tidak menyimpan seluruh blockchain, tetapi hanya menyimpan semua informasi (Hash, berisi bukti transaksi, dan pekerjaan) pada satu atau beberapa node lengkap, dan kemudian memverifikasi volume kerja setiap blok Hash, setiap kali diperlukan untuk memverifikasi bahwa transaksi dilakukan di mana pun.

blockchain-bitcoin-state-machine

Gambar diambil darihttps://github.com/ethereum/wiki/wiki/White-Paper

  • Pendahuluan, Pendahuluan, Pendahuluan, Pendahuluan
  • Transaction Tangga Tangga Satu kali perubahan status
  • BLOCK PEAK adalah "konsensus" tentang status quo.

Pada kenyataannya, kita dapat membayangkan Blockchain Bitcoin sebagai "mesin status", dimana seluruh Blockchain adalah "buku besar" yang memiliki status, yang menyimpan catatan setiap transaksi, dan berdasarkan catatan transaksi ini, kita dapat menyimpulkan "status" dari seluruh rekening pada setiap saat. Ya, berapa jumlah saldo setiap akun di jaringan Bitcoin. Setiap Transaction adalah perubahan status, dan setiap Block adalah "konsensus" para penambang dari seluruh jaringan Bitcoin tentang status saat ini, karena Bitcoin menghasilkan sebuah Block baru setiap 10 menit, yang setara dengan setiap 10 menit orang mencapai konsensus tentang saldo semua akun, dan dalam sepuluh menit, status rekening sebenarnya adalah keadaan "kaos".

Alt Coin

Banyak mata uang kripto lainnya juga berasal dari Bitcoin, yang biasanya disebut "Alt Coin", yang biasanya memiliki dua implementasi:

Yang pertama adalah menggunakan jaringan sendiri, yang relatif independen dari Bitcoin. Manfaatnya adalah bahwa Bitcoin dapat sangat fleksibel merancang protokol dan aturannya sendiri, tetapi karena jumlah pengguna yang sulit untuk mencapai tingkat yang sama dengan Bitcoin, pertahanan terhadap serangan jahat akan sangat lemah.

Yang kedua adalah menggunakan jaringan Bitcoin untuk mengimplementasikan "metaprotocol", yang dilengkapi dengan informasi khusus di atas Transaction Bitcoin untuk mengimplementasikan logika mereka sendiri. Manfaatnya adalah dapat memanfaatkan skala daya komputasi Bitcoin untuk melawan serangan, tetapi juga karena terikat pada jaringan Bitcoin, tidak semua penambang akan mematuhi aturan Bitcoin, sehingga tidak dapat mencegah blok yang tidak sesuai dengan aturan masuk ke Blockchain, hanya dapat menyaring transaksi yang tidak sesuai dengan aturan di klien, atau tidak dapat memanfaatkan fungsi konfirmasi sederhana yang disediakan oleh Bitcoin yang disebutkan sebelumnya.

Untuk koin-koin ini, Bitcoin dapat menyediakan Blockchain dengan keterlibatan banyak penambang, yang dapat bertahan dari serangan jahat besar-besaran, sementara Bitcoin juga dapat membawa data kustom pada Transaction, yang memberikan ruang untuk implementasi koin-koin.

Bitocin juga menyediakanBitcoin ScriptNamun karena ini bukan fungsi inti Bitcoin, maka hanya operasi yang relatif sederhana yang dapat dilakukan, hanya data yang sangat terbatas yang dapat dibaca di Blockchain, dan sulit untuk menulis logika Turing yang lengkap karena tidak ada mekanisme loop.

Ethereum

blockchain-ethereum

Gambar diambil darihttps://www.ethereum.org/assets(CC 3.0)

Ethereum (Ethereum) adalah platform aplikasi terdesentralisasi berbasis blockchain yang membangun infrastruktur Bitcoin dan teknologi blockchain berbasis kriptografi untuk menjadi platform universal dan mengisi beberapa fungsi yang hilang dari jaringan Bitcoin sehingga pengembang dapat menjalankan aplikasi terdesentralisasi mereka sendiri di Blockchain.

Sebelum membahas Ethereum secara detail, saya akan menjelaskan dua dasar utama dari jaringan desentralisasi: cryptography dan game. Tentu saja, cryptography tidak perlu dikatakan terlalu banyak, karena hanya menjamin keamanan secara matematis melalui enkripsi kunci publik, tanda tangan digital, sekresi dan algoritma pengumpulan; sedangkan game adalah bahwa dalam jaringan desentralisasi, siapa pun, termasuk orang yang ingin menyerang jaringan dengan niat jahat, dapat berpartisipasi, dan dalam merancang jaringan desentralisasi, perlu mempertimbangkan hubungan kepentingan dari sudut pandang setiap peserta, memastikan bahwa kepentingan yang paling besar dipenuhi ketika mematuhi aturan, dan bahwa pelanggaran aturan dapat menyebabkan kerugian atau risiko.

Namun, dalam dunia digital, merilis data tidak ada biaya, tidak ada "keuntungan" dan "kerugian", sehingga harus ada hubungan dengan dunia fisik untuk mendefinisikan "keuntungan". Misalnya, dalam jaringan Bitcoin, jika penyerang ingin mengubah arah Blcokchain secara artifisial, maka mereka perlu memiliki kekuatan komputasi yang lebih tinggi daripada semua penambang lainnya, sedangkan di dunia fisik, kekuatan komputasi diperlukan oleh perangkat komputasi yang harus dibeli dari dunia fisik.

Jadi dalam jaringan terdesentralisasi, tidak semua masalah diselesaikan oleh "teknologi", di mana hal-hal yang tidak dapat dicapai oleh teknologi harus diselesaikan melalui keuntungan, melalui insentif ekonomi. Juga karena kebutuhan "insentif ekonomi", Ethereum juga memiliki sistem dompet (unit mata uang disebut "Ether") di mana setiap pengguna memiliki alamat dompet sebagai identitas uniknya, yang pada titik ini mirip dengan Bitcion.

"Kontrak" adalah konsep yang paling penting yang diperkenalkan oleh Ethereum. Dalam Bitcoin, semua alamat adalah milik pengguna. Saat kita mengatakan "pengguna", sebenarnya kita berbicara tentang sepasang kunci publik dan kunci pribadi. Tetapi dalam Ethereum, selain alamat yang dimiliki oleh kunci, ada alamat yang dimiliki oleh "kode", yaitu Kontrak. Kontrak dikeluarkan oleh pengguna, yang pada dasarnya adalah kode yang tidak dapat dimodifikasi setelah dirilis, Kontrak seperti akun biasa juga memiliki alamat dompet, setiap kali alamat ini diterima, kode yang terkait akan dijalankan, kode-kode ini:

  • Hasil perhitungan yang sebenarnya tidak perlu disimpan ke blockchain, karena perhitungan dapat dilakukan kembali kapan saja.
  • Fungsi dalam kontrak lain dapat dipanggil (kode dan data kontrak lain juga ada di blockchain).
  • Dalam proses pelaksanaan, transaksi baru dapat dibuat (menggunakan saldo dompet Anda sendiri), yang mungkin akan dijalankan oleh kontrak lain.

Pertama, contoh dari "dompet bersama", di mana klien resmi Ethereum memiliki fitur untuk membuat dompet bersama:

blockchain-ethereum-multi-sig-wallet

Fitur ini memungkinkan untuk membuat alamat dompet yang dimiliki bersama dengan dua orang lainnya, sehingga masing-masing dapat menggunakan maksimum 100 Ether per hari, dan jika batas ini melebihi, maka harus disetujui oleh orang lain.

Fungsi ini sebenarnya akan membuat kontrak, dan logika di atas dijelaskan oleh kode dalam kontrak. Ketika Anda ingin mengeluarkan uang dari dompet bersama ini, Anda perlu mengirim pesan ke dompet bersama ini (transaksi adalah pesan, jumlah transaksi dapat menjadi nol, hanya membawa data), dan kemudian kode di dompet bersama akan dijalankan, dan jika permintaan pengeluaran sesuai dengan logika di atas, maka transaksi pengeluaran yang sebenarnya akan dimulai, jika tidak, permintaan pengeluaran akan ditolak tanpa item pengeluaran yang sebenarnya.

Contoh lain adalah "kontrak hedging", yang selalu diucapkan Bitcoin sebagai mata uang digital yang nilai mata uangnya (dan nilai tukar mata uang hukum) tidak stabil, sering terjadi bahwa nilai mata uang naik dua kali lipat atau turun dua kali lipat dalam sehari, tetapi masalah ini dapat sampai batas tertentu diselesaikan jika kontrak hedging dilakukan.

Kita akan menyebut orang yang ingin mempertahankan nilai mata uang yang tidak berubah sebagai "penjaga risiko", dan orang lain yang bersedia mengambil risiko dari fluktuasi mata uang dan mendapatkan keuntungan dari itu sebagai "pengambil risiko", sehingga mereka dapat menyetujui jumlah (misalnya 1000 CNY) dan jendela waktu (misalnya satu bulan) dan membuat kontrak yang menjalankan logika berikut:

  • Penjaga risiko mengirim Ether senilai 1000 CNY ke alamat dompet Kontrak, dan pemegang risiko juga mengirim Ether senilai 1000 CNY (atau lebih) ke Kontrak untuk membayar (jika tidak ada yang membayar, penjaga risiko dapat mendapatkan kembali Ether mereka).
  • Setelah satu bulan, penghindar risiko dapat mengambil kembali Ether yang saat itu bernilai 1000 CNY dari Kontrak, sementara sisa Ether diambil kembali oleh pemegang risiko, terlepas dari nilai tukar antara Ether dan CNY.

Jika nilai Ether naik, pemegang risiko mendapatkan keuntungan, jika nilai Ether turun, pemegang risiko kehilangan, tetapi penghindar risiko selalu tidak rugi. Tentu saja, penghindar risiko dan pemegang risiko dapat menyetujui terlebih dahulu "biaya asuransi" yang harus dibayarkan oleh penghindar risiko, atau pemegang risiko dapat menyetujui bahwa pemegang risiko harus memberikan jaminan beberapa kali lipat dari 1000 CNY ("peningkatan yang lebih tinggi adalah risiko yang lebih besar yang dapat ditanggung").

Dalam contoh di atas, ada juga masalah yang tidak dapat diselesaikan dengan baik, yaitu bagaimana untuk menentukan nilai tukar antara Ether dan mata uang hukum, seperti yang telah kami sebutkan sebelumnya, Kontrak hanya dapat mengakses data di blockchain, sementara mata uang hukum adalah data yang ada di dunia fisik dan bukan dunia kriptografi, dan kita perlu memasukkan "data dari dunia non-kripto" ke blockchain melalui mekanisme tertentu.

Kita dapat merancang kontrak lain untuk menentukan logika untuk mengumpulkan nilai tukar antara Ether dan mata uang hukum dari dunia nyata, dalam setiap jendela waktu (misalnya satu jam):

  • Semua orang dapat menyetorkan uang jaminan ke Contract dan memberikan nilai tukar.
  • Pada akhir jendela waktu, Contract menghitung rata-rata nilai tukar yang ditawarkan oleh semua orang (berimbang dengan uang jaminan) dan mempublikasikannya.
  • Dan uang jaminan yang dikumpulkan akan dibagikan kepada orang-orang yang paling dekat dengan rata-rata 25% (menurut nilai yang ditimbang dengan uang jaminan).

Bagi salah satu peserta, karena tidak mengetahui penawaran orang lain, mengirimkan nilai tukar yang benar memiliki peluang yang lebih besar untuk mendapatkan hadiah, sedangkan mengirimkan nilai tukar yang sangat luar biasa akan memiliki peluang yang lebih besar untuk kehilangan uang jaminan.

Tentu saja, ada beberapa kelemahan dalam aturan ini, seperti jika seseorang memiliki uang jaminan yang sangat besar, maka dia dapat menarik rata-rata ke harga yang lebih tinggi atau lebih rendah dari nilai tukar yang sebenarnya, sekaligus mendapatkan hadiah, dan membuat beberapa orang lain yang menawarkan nilai tukar yang akurat kehilangan jaminan. Tetapi sebenarnya, di dunia nyata, jika Anda memiliki uang yang sangat banyak, Anda juga dapat menaikkan atau menekan harga suatu komoditas, hanya saja, jika dibandingkan dengan dunia nyata, volume uang elektronik sangat kecil dan tidak membutuhkan banyak uang untuk melakukannya; tetapi sebenarnya, menaikkan atau menekan nilai tukar dengan cara yang jahat juga sangat berisiko, karena Anda tidak yakin bahwa Anda membayar jaminan yang cukup, dan jika Anda gagal, Anda akan kehilangan semua jaminan.

Kerentanan lain adalah bahwa langkah ini dilakukan dengan membuat transaksi, dan semua transaksi akan ditulis di Blockchain, sehingga nilai tukar yang Anda kirimkan sebenarnya terlihat oleh orang lain, yang selanjutnya menciptakan kesempatan bagi penyerang jahat.

Sebelumnya kami menyebutkan bahwa Contract dapat membaca data di Blockchain, tetapi data di Blockchain adalah data yang pasti, jika kita ingin melakukan aplikasi yang mirip dengan perjudian, dari mana kita mendapatkan angka acak?

Satu sumber angka acak yang dapat Anda pikirkan adalah Hash dari Blok berikutnya, dan dalam kebanyakan kasus, tingkat keacakan ini cukup. Tetapi sebenarnya, penambang dapat memanipulasi angka acak ini sampai batas tertentu, misalkan seorang penambang berpartisipasi dalam perjudian, dan keuntungan dari perjudian lebih besar daripada keuntungan dari menambang satu blok, maka jika penambang ini menambang sebuah blok yang akan membuat dirinya kehilangan taruhannya, maka jelas penambang ini akan memilih untuk tidak mempublikasikan blok baru ini, yang semakin jelas dalam kasus kekuatan komputasi seorang penambang.

Oleh karena itu, kita perlu memperkenalkan mekanisme yang mirip dengan pengumpulan nilai tukar untuk mengumpulkan sejumlah biji secara acak, dan kemudian menggunakan biji-bijian tersebut untuk menghitung jumlah acak pada akhir setiap jendela waktu. Tetapi seperti halnya pengumpulan nilai tukar, karena peserta mencapai nilai tukar dengan membuat transaksi, maka antara satu jendela waktu, jumlah acak yang diserahkan oleh setiap orang terlihat oleh orang lain, sehingga seseorang yang telah berpartisipasi dalam perjudian dapat dengan hati-hati memilih sejumlah biji acak sehingga jumlah biji yang telah diserahkan orang lain ditambah dengan jumlah biji acak baru yang dihasilkan sesuai dengan harapan mereka.

Jadi kita perlu membagi jendela pengumpulan benih menjadi dua bagian untuk mendapatkan jumlah acak yang tidak dapat diprediksi dan diintervensi oleh siapa pun:

  • Tahap 1: Semua orang dapat menyetor uang jaminan ke Contract dan memberikan "nilai seri dari biji yang dipilih secara acak".
  • Tahap II: Peserta Tahap I memberikan benih yang belum disusun kepada Contract.
  • Tahap II berakhir: Kontrak mengelompokkan semua benih yang sah, menghasilkan satu set angka acak, dan mengumumkan; kembali ke tahap II dengan jaminan dari orang yang memberikan benih yang benar.

Pada tahap pertama, Anda hanya tahu nilai seri dari benih yang dikirim oleh orang lain, tetapi tidak tahu benih yang sebenarnya, sehingga tidak dapat dengan hati-hati membangun benih untuk mengintervensi hasilnya; pada tahap kedua, semua orang hanya mengkonfirmasi benih yang dikirim pada tahap pertama, tidak dapat mengirimkan yang baru, dan tidak dapat mencegah orang lain untuk mengirimkan benih.

Sebelumnya kami menyebutkan bahwa Bitcoin Script tidak memberikan kemampuan untuk berputar, mundur, melompat, dll. Mungkin Bitcoin adalah untuk kepentingan mengendalikan waktu pelaksanaan Bitcoin Script, karena berdasarkan "teorema penghentian" Turing, program yang ditulis oleh bahasa pemrograman yang lengkap dengan Turing tidak selalu dapat menilai dari sudut pandang analisis statis saja apakah akan berakhir setelah langkah terbatas, sehingga penyerang yang berbahaya dapat membangun Transaction yang akan menyebabkan siklus kematian untuk mengganggu pekerjaan miner yang normal.

Sementara Ethereum lagi-lagi menghindari masalah ini dengan "insentif ekonomi". Kontrak berjalan dalam bentuk kode operasi opcode pada mesin virtual yang disebut EVM (Ethereum Virtual Machine), sebuah mesin virtual yang memiliki "biaya" sendiri, dalam standar EVM, ditentukan oleh memori dan waktu CPU yang dibutuhkan untuk operasi yang digunakan oleh setiap gas opcode, yang merupakan sumber daya komputasi yang dibeli oleh Ether. Seperti yang disebutkan sebelumnya, ketika tujuan transaksi adalah kontrak, kode kontrak akan dieksekusi, pengembang transaksi akan membayar untuk Gas Gas yang dikonsumsi dalam proses pelaksanaan kontrak, dan menyatakan "jumlah maksimum Gas Gas yang ingin dibayar", dan kontrak akan berhenti dieksekusi jika jalan tengah habis.

Kemudian kita kembali ke masalah "interval konsensus", yang disebutkan sebelumnya Bitcoin setiap 10 menit muncul sebuah blok baru, yang berarti seluruh jaringan mencapai sebuah "konsensus" setiap 10 menit, sehingga transaksi Bitcoin biasanya membutuhkan waktu beberapa puluh menit untuk dikonfirmasi, dan mungkin menunggu satu jam sebelum transaksi dianggap dapat diandalkan.

Ini karena interval konsensus yang lebih cepat akan meningkatkan keunggulan "pembuangan terpusat". Yang disebut "pembuangan" adalah bahwa para penambang Bitcoin berkumpul untuk menambang, para penambang mematuhi instruksi dari tambang tanpa syarat, dan akhirnya menyetujui pembagian keuntungan dengan tambang, jelas Bitcoin sebagai sistem terpusat, tidak menginginkan keuntungan tambahan dari tambang terpusat ini.

Ketika seorang miner A menggali sebuah blok baru, ia akan menyiarkan blok itu, dan orang lain akan segera mulai bekerja pada blok baru itu begitu mereka menerima pesan itu; sementara orang lain menghitung antara waktu antara "A menggali blok baru" dan "menerima pesan dari A" yang sebenarnya terbuang sia-sia, sementara para miner lain di kolam yang terpusat tidak akan mengalami masalah ini karena mereka dapat mendapatkan informasi tentang blok baru yang dihasilkan lebih cepat dan segera mulai bekerja pada dasar blok baru.

blockchain-ethereum-without-uncles

Waktu penyiaran ini mungkin memakan waktu beberapa puluh detik, yang tidak terlalu penting untuk 10 menit, tetapi jika interval konsensus diperpendek, keuntungan dari kolam penambangan terpusat akan semakin jelas. Tetapi Ethereum memecahkan masalah ini dengan memperkenalkan konsep "Uncle Block", mengurangi interval konsensus menjadi 15 detik, dan memiliki peningkatan besar dalam kecepatan konfirmasi pembayaran dibandingkan Bitcoin.

Dalam Blockchain Bitcoin, sebuah Blok hanya dapat memiliki satu blok induk dan satu blok anak. Tetapi di Ethereum, sebuah blok yang baru dihasilkan dapat memiliki satu blok induk dan beberapa blok anak. Kembali ke contoh di atas, jika seseorang menggali blok baru di A tetapi orang lain belum menerima siaran, jika seseorang menggali blok baru, tetapi karena siaran terlambat tidak diterima oleh semua orang, maka blok ini berpotensi menjadi "blok anak" dari blok berikutnya.

blockchain-ethereum-uncles

Gambar diambil darihttps://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

Masalah yang belum diselesaikan

Di bagian berikutnya, saya akan menjelaskan beberapa masalah yang belum diselesaikan Ethereum.

Pertama adalah bahwa Ethereum saat ini mencapai konsensus masih seperti Bitcoin yang dijamin melalui POW (Proof of Work), hanya node yang menyelesaikan jumlah pekerjaan tertentu yang dapat berpartisipasi dalam pekerjaan yang dihasilkan oleh Blok, masalah Proof of Work adalah bahwa akan membuang banyak daya komputasi untuk menjamin keamanan jaringan, meskipun ini juga didasarkan pada gagasan "insentif ekonomi" yang disebutkan sebelumnya, tetapi sebenarnya dapat ditingkatkan. Ehtereum berpikir cara yang lebih baik adalah dengan POS (Prove of Ownership) untuk menggantikan Proof of Work, yang dapat sangat meningkatkan efisiensi jaringan ini.

Jika Ether itu sendiri memiliki nilai, mengapa tidak menggunakan insentif ekonomisnya sendiri? POS adalah jaminan bahwa setiap node yang ingin berpartisipasi dalam pembuatan Blok (dalam arti tradisional penambangan) (disebut verifier) perlu memberikan sistem (dalam hal ini sistem yang dimaksudkan untuk mengatur dalam protokol, semua node menganggap bahwa uang jaminan tersebut telah "dibebaskan") untuk membayar uang jaminan, dan kemudian semua orang menggunakan uang jaminan mereka sendiri untuk bertaruh pada Blok yang mungkin menjadi Blok berikutnya.

Model ini sebenarnya sangat mirip dengan POW, di mana para penambang menggunakan kekuatan komputasi mereka sendiri untuk "menaruh", dan jika ada rantai yang lebih panjang, maka perlu untuk beralih ke rantai ini untuk melanjutkan penambangan. Karena semakin banyak rantai yang terlibat, semakin mungkin rantai yang tepat menjadi rantai yang benar, akhirnya semua orang mencapai konsensus.

POS pasti akan meningkatkan throughput dari seluruh jaringan. Tidak perlu lagi untuk mencapai konsensus dengan melakukan sejumlah besar perhitungan yang tidak berarti, dan jumlah operasi per node akan mendekati jumlah perhitungan untuk menjalankan kode dalam kontrak dan melakukan verifikasi data.

Tentu saja, POS belum diadopsi saat ini karena masih ada beberapa masalah yang belum diselesaikan, salah satunya adalah masalah serangan 51% seperti POW, di mana 51% daya komputasi seluruh jaringan terpusat di POW memiliki batasan fisik tertentu. Karena daya komputasi diperlukan untuk menyediakan perangkat komputasi; sedangkan pengumpulan 51% Ether seluruh jaringan di POS relatif lebih mudah. Asalkan Anda memiliki cukup uang.

Topik lain adalah "fragmentasi", baik Bitcoin maupun Ethereum, saat ini semua transaksi dikonfirmasi di Blockchain yang sama, yang sangat membatasi kemampuan komputasi jaringan terdistribusi.

Oleh karena itu, Ethereum berharap untuk memperkenalkan mekanisme "fragmen" di masa depan untuk membagi seluruh jaringan menjadi beberapa bagian, untuk melakukan verifikasi transaksi secara independen di antara mereka. Tetapi antara fragmen akan menggunakan struktur pointer untuk mengacu pada data fragmen lain, dengan cara panggilan asinkron untuk mempengaruhi fragmen lain, sehingga seluruh jaringan tetap satu dari pandangan pengguna, tetapi kapasitas pemrosesan seluruh jaringan akan memiliki skalabilitas yang sangat kuat.

Kontrak

Pada bagian ini saya akan menunjukkan beberapa kode kontrak yang bisa bekerja. Kontrak dapat ditulis dengan berbagai bahasa paradigma yang berbeda, dan akhirnya semuanya akan dikompilasi menjadi opcode yang dijalankan di EVM, dan hari ini kami memilih Solidity sebagai contoh bahasa JavaScript, yang merupakan salah satu bahasa EVM yang paling baik dijaga saat ini.

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 tata bahasa inti yang dapat Anda deklarasikan dalam Solidity.uint storedData;Jika Anda tidak memiliki data, Anda tidak akan dapat mengaksesnya secara gratis.structUntuk menyatakan struktur data yang kompleks; juga dapat mendefinisikan fungsi, yang akan dieksekusi pada saat menerima transaksi, dan pemicu transaksi dapat memilih fungsi mana yang akan dieksekusi, sehingga kontrak dapat menyediakan beberapa fungsi, yang dapat melakukan penilaian logis, loop, dan mengubah nilai dalam fungsi.

Bahasa ini memiliki beberapa fitur kecil yang sangat berguna, seperti algoritma kriptografi yang umum digunakan.sha256), perhitungan satuan10 finneyAnda bisa langsung menulis alamat dompet Anda.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2Aku tidak tahu apa yang terjadi.msgadalah variabel global built-in yang dapat membaca informasi yang terkait dengan transaksi tersebut, seperti pengirim, jumlah, dll. Contract dapat memanggil kode kontrak lain dengan dua cara, yaitu dengan mengklik kode yang ada di bagian atas, dan dengan mengklik kode yang ada di bagian bawah.delegatecallIni adalah sama dengan menempatkan kode Contract lain ke dalam konteks saat ini, seperti menginformasikan sebuah fungsi library.callLogikanya adalah memulai transaksi baru untuk memicu kontrak lain.

Jadi bagaimana kontrak membaca dan menulis data dari blockchain? Pekerjaan yang rumit ini diabstraksi untuk "variabel status", dimana data yang tersimpan adalah variabel status. Sebenarnya, perubahan pada variabel status dalam proses pelaksanaan kontrak tidak disimpan ke blockchain karena kontrak yang dilakukan adalah perhitungan kepastian. Pelaksanaan kontrak yang dipicu oleh transaksi, hanya membaca data yang sudah ada di blockchain dalam proses pelaksanaan, jadi selama kita tahu setiap transaksi yang terkait dengan kontrak dalam sejarah, kita dapat selalu memprediksi nilai dari setiap variabel status kontrak pada titik waktu tertentu.

Di sini saya akan menunjukkan sebuah token kontrak yang benar-benar tersedia untuk menerbitkan token miliknya sendiri berdasarkan jaringan 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);
    }
}

Kode berasal darihttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example(MIT)

Kontrak yang disebut Coin menyatakan dua variabel status, yang dapat digunakan untuk mendeteksi dan memverifikasi kondisi.minterUntuk menyimpan token ini, pencipta menggunakan fungsi constructor.function Coin()) yang memberikan nilai pemicu transaksi pertama yang digunakan untuk membuat Kontrak untuk variabel ini; juga menyatakan sebuah peta alamat dompet ke digitbalances, yang digunakan untuk menunjukkan saldo dari setiap alamat yang memegang token tersebut.

mintFungsi ini menentukan terlebih dahulu apakah pemicu transaksi adalah pencipta token, dan jika demikian, jumlah tertentu token ditambahkan ke alamat yang ditentukan sesuai dengan parameter fungsi.sendFungsi ini dapat dipanggil oleh semua orang, dan akan mengurangi jumlah saldo tertentu dari alamat penerbit transaksi (jika ada saldo yang cukup) ditambah ke alamat target, yang setara dengan fungsi transfer.

Kami juga mengumumkan sebuah pernyataan yang disebutSentPada masa depan, klien kelas ringan akan lebih mudah diimplementasikan (klien kelas ringan hanya menerima acara dan tidak benar-benar mengeksekusi kontrak).

blockchain-ethereum-mix

Ethereum menyediakan IDE yang disebut Mix untuk men-debug kode ini, di sisi kanan Mix Anda dapat membuat beberapa blok dan akun untuk menguji kontrak Anda, dan juga melihat perubahan nilai setiap variabel status dalam proses eksekusi. Perlu dicatat bahwa kontrak tidak dapat dimodifikasi setelah rilis, dan operasi selanjutnya sepenuhnya dipicu oleh transaksi orang lain, yang sangat menjengkelkan bagi programmer yang menulis bug setiap hari, tetapi arti kontrak sebenarnya adalah "kontrak", dan siapa lagi yang akan mempercayai kontrak Anda setelah Anda merilis kontrak yang tidak dapat dimodifikasi secara alami.

Setelah ditulis, kita dapat memposting kontrak ini ke web dengan Ethereum wallet:

blockchain-ethereum-create-contract

Setelah rilis, Anda dapat mengikuti kontrak ini dengan melihat antarmuka detail kontrak:

blockchain-ethereum-wallet-contract

Di sebelah kiri, Anda dapat melihat nilai dari dua variabel status.minterSaya tidak tahu apa yang akan terjadi di sana, tapi saya tahu bahwa saya akan pergi ke sana.balancesKarena ini adalah sebuah peta, maka Anda dapat memasukkan alamat untuk menanyakan saldo nya. Di sisi kanan Anda dapat memulai transaksi baru untuk kontrak ini, dan ada menu drop-down untuk memilihsendAtaumintFungsi, Anda dapat mengisi parameter untuk menyampaikan kepada Kontrak. Karena di sini tujuan kami mengirim transaksi adalah untuk menyampaikan pesan, bukan untuk menyampaikan Ether, jadi kami tidak perlu mengatur jumlah transaksi.

Sekarang saya akan memperkenalkan Contract yang sangat menarik, Contract ini memiliki efek penipuan Ponzi, yaitu Anda dapat membayar 1 Ether untuk bergabung dengan Contract ini, dan kemudian setiap tiga orang yang bergabung akan dibayarkan 3 Ether ke orang pertama yang bergabung:

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;
    }
}

Kode disederhanakan darihttps://ethereumpyramid.com/contract.html

Dan kode yang sangat sederhana, kontrak ini menyatakan satu hal.participantsArsitektur digunakan untuk menyimpan alamat dompet semua peserta secara berurutan, atau menyatakan satupayoutIdxIni digunakan untuk mencatat berapa banyak peserta sebelumnya yang telah menerima pengembalian 3 Ether.enterFungsi utama dari implementasi kontrak ini adalah terlebih dahulu memeriksa beberapa parameter, memastikan bahwa setiap peserta membayar 1 Ether, dan kemudian menempatkan peserta baru ke dalam kontrak.participantsPada akhir array, jika nomor pendahuluan peserta saat ini adalah kelipatan dari 3, maka 3 Ether dikirim ke nomor satu.payoutIdxAnda akan menemukan banyak hal yang menarik di sini.payoutIdxDi sini, saya akan menunjukkan kepada peserta berikutnya.

Tautan referensi

HashTree:

Bitcoin:

Masalah menghentikan:

Ethereum:

Jaringan Ethereum:

Berikutnya Ethereum:

Kontrak:

Kontrak IDE:


Lebih banyak

Mimpi kecilSaya tidak tahu apa-apa, saya hanya bisa mengerti sedikit, saya tidak tahu apa-apa

xuanxuanDan ternyata bos saya pergi untuk meneliti BTC dan ETH.

MomoxTidak mengerti