6
fokus pada
792
Pengikut

Pengantar Blockchain dan Ethereum

Dibuat di: 2016-05-05 17:31:57, diperbarui pada: 2016-05-05 17:32:31
comments   3
hits   2492

Sumber: https://jysperm.me/2016/05/blockchain-slides/

Artikel ini disusun berdasarkan sharing teknologi yang saya lakukan di LeanCloud pada akhir Maret, dengan asumsi bahwa pembaca sudah memiliki pengetahuan dasar tentang kriptografi dan pemahaman awal tentang implementasi Bitcoin.

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

blockchain-hash-tree

Foto diambil dari:<http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

Dalam sebuah struktur pohon, setiap node terminal memiliki nilai-nilai yang disagregat, sedangkan node non-terminal berasal dari nilai-nilai yang disagregat dari semua node anak langsung, sehingga setiap node secara langsung atau tidak langsung berisi informasi dari semua node anak. Oleh karena itu, setiap kali nilai-nilai yang disagregat dari salah satu node terminal berubah, nilai-nilai yang disagregat dari semua node induknya akan berubah, dan node akar juga harus berubah.

Saya dapat memberikan contoh aplikasi HashTree: “100% proof of reserve”, yang termasuk dalam kategori “zero-knowledge proofs”. Kita dapat mempertimbangkan sebuah skenario di mana pemegang Bitcion perlu menyimpan Bitcoin di sebuah bursa untuk melakukan transaksi, dan bursa secara teoritis dapat mengambil uang itu (segala saldo akun yang disimpan pengguna) untuk menggunakannya, yang tidak diinginkan oleh pengguna, dan bursa juga ingin memastikan diri: bursa pertama kali mempublikasikan alamat Bitcoin yang dipegangnya, dan semua orang memastikan bahwa bursa benar-benar memiliki sejumlah Bitcoin sebagai cadangan, tetapi bagaimana cara membuktikan bahwa uang itu benar-benar lebih besar dari jumlah total saldo semua pengguna? Dengan kata lain, bagaimana cara membuat setiap pengguna mengakui bahwa saldo mereka dimasukkan ke dalam cadangan total ini tanpa mempublikasikan saldo masing-masing pengguna (yang akan membocorkan privasi pengguna)?

blockchain-proof-of-reserves

Foto diambil dari:<http://blog.bifubao.com/2014/03/16/proof-of-reserves

Kita bisa membuat sebuah HashTree dimana semua node di ujungnya mewakili satu pengguna, dan berisi saldo pengguna.Σ) dan identifikasi pengguna (misalnya alamat email)h), sedangkan node induk berisi jumlah saldo dari node anak-anaknya (sum) dan informasi dari semua sub-node (hashUntuk setiap pengguna, hanya perlu untuk menunjukkan kepadanya sendiri node akhir dan saudara node, semua node ayah dan saudara dari node ayah, karena pengguna dapat mengkonfirmasi sendiri saldo yang termasuk dalam node ayah, dan akhirnya termasuk dalam node akar dengan cara bertahap menelusuri kembali ke node ayah.

Dengan cara ini, informasi yang ditampilkan untuk setiap pengguna hanya informasi sendiri dan beberapa informasi yang telah digabungkan, dan setiap pengguna dapat mengkonfirmasi bahwa saldo mereka sendiri telah dimasukkan ke dalam node akar tanpa diketahui oleh pengguna lainnya.hMengapa?e4df9d12Sebuah node seharusnya tidak menjadi node akhir yang mewakili pengguna, tetapi harus menjadi node informasi yang digabungkan (yang dapat berisi pengguna dengan saldo 3333, dan pengguna virtual dengan saldo 0) untuk menghindari informasi privasi dari pengguna tertentu.

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

blockchain-git-objects-example

Foto diambil dari:http://gitbook.liuhui998.com/1_2.html (GPL v2)

Dalam Git, baik file (Blob), indeks (Tree), atau komited (Commit), memiliki hash yang ditentukan oleh isinya, jika dua objek memiliki konten yang sama, maka memiliki hash yang sama. Dalam Git, seluruh sejarah gudang adalah sebuah Blockchain, setiap Commit setara dengan sebuah Block, Commit berisi Hash dari Commit sebelumnya dan Hash dari objek yang terkait dengan modifikasi kali ini, Hash Commit sendiri ditentukan oleh isinya dan informasi ini.

Git menggunakan Blockchain untuk menentukan sejarah unik untuk gudang. Jika sebuah commit diubah, maka semua hash dari commit yang diikuti akan berubah. Tentu saja, karena Git hanyalah alat kontrol versi, itu tidak mencegah Anda untuk mengubah sejarah.push --force), namun perubahan tersebut akan dirasakan oleh semua rekan penulis.

Aplikasi klasik lainnya dari Blockchain adalah Bitcoin, yang mempopulerkan istilah Blockchain (dan konsep ini sudah ada sejak dulu):

blockchain-bitcoin-block-data

Foto diambil dari:https://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

Dalam Bitcoin, setiap blok terdiri dari serangkaian transaksi dan hash dari blok sebelumnya, sedangkan seluruh blockchain membentuk satu buku besar yang terdesentralisasi. Karena blok baru dibuat setiap sepuluh menit, dan blok yang dibuat akan tetap berada di blockchain selamanya, blockchain menetapkan urutan transaksi yang terjadi, mempertahankan urutan sebelumnya dan selanjutnya, dan menentukan apakah akun memiliki saldo yang cukup untuk melakukan transaksi.

Bitcoin

Bagian pertama dari berbagi ini adalah dengan melihat kembali Bitcoin secara sederhana.

Pembentukan blok dalam Bitcoin dilakukan melalui “bukti kerja”, yaitu semua “penambang” yang terlibat dalam “penambangan” harus melakukan perhitungan acak yang terkait dengan kekuatan komputasi dan sifatnya acak, sampai jumlah acak yang memenuhi kondisi tertentu dihitung, sebelum mendapatkan hak untuk menerbitkan blok.

Secara default, setiap miner akan selalu mempercayai “chain terpanjang” dan menghitung blok berikutnya berdasarkan rantai terpanjang yang diketahui dan memenuhi aturan, atau daya komputasi Anda akan terbuang sia-sia. Oh, karena miner lain selalu mengakui rantai terpanjang, dan jika Anda tidak memulai bekerja berdasarkan rantai terpanjang, maka itu adalah melawan daya komputasi semua miner lainnya.

Bitcoin didesain untuk menghasilkan satu blok baru setiap 10 menit, dan waktu ini dicapai dengan melihat selang waktu beberapa blok terakhir, untuk menyesuaikan kesulitan kondisi pembuatan blok berikutnya. Ketika beberapa blok terakhir dihasilkan lebih cepat dari yang diharapkan, orang akan berpikir bahwa pembuatan blok berikutnya harus memiliki kesulitan yang lebih tinggi.

Biasanya, setiap node Bitcoin perlu menyimpan data Blockchain lengkap untuk memastikan bahwa transaksi itu sah. Namun sekarang blockchain lengkap sudah 66G, dan masih tumbuh sekitar 0.1G per hari. Jika permintaan untuk setiap pengguna Bitcoin untuk menyimpan blockchain lengkap tidak terlalu keras, maka Bitcoin memiliki mekanisme “Simplified payment verification (SPV) “, yang disebut “klien ringan” yang dapat memilih untuk tidak menyimpan blockchain lengkap, tetapi menempel pada satu atau beberapa node lengkap, hanya menyimpan semua elemen dari blok, dan kemudian memverifikasi setiap blok, dan setiap kali diperlukan untuk memverifikasi transaksi, pergi ke titik Blockchain lengkap untuk menanyakan di mana transaksi terjadi, dan kemudian mendapatkan informasi yang diperlukan untuk memastikan apakah transaksi ini termasuk dalam blok.

blockchain-bitcoin-state-machine

Foto diambil dari:<https://github.com/ethereum/wiki/wiki/White-Paper

  • Blockchain Log Log Log perubahan status
  • Transaction Transaksi Perubahan status satu kali
  • “Konsensus” tentang Status Saat Ini

Sebenarnya kita dapat membayangkan Blockchain Bitcoin sebagai “mesin status”, seluruh Blockchain adalah “buku catatan” yang memiliki status, di mana setiap transaksi disimpan, berdasarkan catatan transaksi ini dapat dihitung seluruh “status” di seluruh buku catatan pada setiap waktu. Setiap Transaksi adalah perubahan status, dan setiap Blok adalah “konsensus” tentang status saat ini para penambang di seluruh jaringan Bitcoin, karena Bitcoin menghasilkan satu Blok baru setiap 10 menit, setara dengan setiap 10 menit kita akan mencapai konsensus tentang keseimbangan semua akun, dan selama sepuluh menit, status buku catatan adalah “kaos”.

Alt Coin

Pada dasarnya, bitcoin juga merupakan turunan dari banyak mata uang kripto lainnya, yang sering disebut sebagai “Alt Coin”, yang biasanya memiliki dua implementasi:

Yang pertama adalah menggunakan jaringannya sendiri, yang terpisah dari Bitcoin, dengan keuntungan bahwa crypto dapat dengan sangat fleksibel merancang protokol dan aturan sendiri, tetapi karena jumlah pengguna yang sulit untuk mencapai tingkat yang setara dengan Bitcoin, pertahanan terhadap serangan jahat akan sangat lemah.

Yang kedua adalah menggunakan jaringan Bitcoin untuk menerapkan “metaprotokol” dan menambahkan informasi yang disesuaikan di atas Transaksi Bitocin untuk menerapkan logika mereka sendiri. Manfaatnya adalah Anda dapat menggunakan skala komputasi Bitcoin untuk melawan serangan, tetapi karena bergantung pada jaringan Bitcoin, tidak semua penambang akan mematuhi aturan koin kripto, sehingga tidak dapat mencegah masuknya Block Blockchain yang tidak sesuai dengan aturan, hanya dapat menyaring transaksi yang tidak sesuai dengan aturan di klien, dan tidak dapat menggunakan fitur konfirmasi sederhana yang disediakan Bitcoin yang disebutkan sebelumnya.

Untuk koin-koin tersebut, Bitcoin dapat menyediakan sebuah Blockchain dengan jumlah penambang yang besar yang dapat bertahan terhadap serangan jahat dalam skala besar, sementara Transaction Bitcoin juga dapat dilengkapi dengan data khusus, sehingga memungkinkan untuk implementasi koin-koin tersebut.

Bitocin juga menyediakan satu.Bitcoin ScriptNamun karena ini bukan fungsi inti dari Bitcoin, hanya dapat melakukan operasi yang relatif sederhana, hanya dapat membaca data yang sangat terbatas pada Blockchain, dan karena kurangnya mekanisme sirkulasi, sangat sulit untuk menulis logika universal dan Turing yang lengkap.

Ethereum

blockchain-ethereum

Foto diambil dari:https://www.ethereum.org/assets (CC 3.0)

“Ethereum” adalah platform aplikasi terdesentralisasi berbasis blockchain yang membangun infrastruktur Bitcoin dengan teknologi blockchain berbasis kriptografi menjadi platform umum dan melengkapi beberapa fitur yang hilang dari jaringan Bitcoin sehingga pengembang dapat menjalankan aplikasi terdesentralisasi mereka sendiri di atas Blockchain.

Sebelum membahas Ethereum secara detail, saya ingin menjelaskan dua dasar dari jaringan terdesentralisasi yang menurut saya sangat penting yaitu kriptografi dan game. Kriptografi, tentu saja, hanya menjamin keamanan secara matematis melalui enkripsi kunci publik, penandatanganan digital, hashing dan algoritma abstrak; dan game adalah bahwa dalam jaringan terdesentralisasi, siapa pun, termasuk orang-orang yang berniat untuk menyerang jaringan ini, dapat berpartisipasi.

Namun, dalam dunia digital, mempublikasikan data tanpa biaya, tanpa “keuntungan” dan “kerugian”, sehingga harus ada hubungan dengan dunia nyata untuk mendefinisikan “keuntungan”. Misalnya, dalam jaringan Bitocin, jika penyerang ingin mengubah arah Blcokchain secara artifisial, diperlukan daya komputasi yang lebih tinggi daripada semua penambang lainnya, sedangkan di dunia nyata, daya komputasi diperlukan untuk menyediakan perangkat komputasi, sedangkan perangkat komputasi harus dibeli dari dunia nyata.

Jadi dalam jaringan terdesentralisasi, tidak semua masalah dapat diselesaikan oleh “teknologi”, dan di bagian 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”)), setiap pengguna memiliki alamat dompet sebagai identitas tunggalnya, dalam hal ini mirip dengan Bitcion.

“Kontrak” adalah konsep terpenting yang diperkenalkan oleh Ethereum. Dalam Bitcoin, semua alamat dimiliki oleh satu pengguna. Ketika kita mengatakan “pengguna”, sebenarnya kita berbicara tentang sepasang kunci publik dan pribadi. Tetapi dalam Ethereum, selain alamat yang dimiliki oleh sepasang kunci, ada juga alamat yang dimiliki oleh “kode”, yaitu Contract.

  • Dapat dan hanya dapat menggunakan blockchain sebagai input dan output, sehingga perhitungan dapat diulangi Hasil perhitungan yang sebenarnya tidak perlu disimpan ke blockchain, karena perhitungan dapat dilakukan kembali kapan saja.
  • Fungsi dari Contract lain dapat dipanggil ((kode dan data dari Contract lain juga ada di blockchain)
  • Dalam proses eksekusi, transaksi baru dapat dibuat (mengontrol saldo dompet sendiri) yang dapat digunakan untuk melakukan kontrak lain.

Sebagai contoh pertama, “dompet bersama multi-pemegang”, ada fitur untuk membuat dompet multi-pemegang di klien resmi Ethereum:

blockchain-ethereum-multi-sig-wallet

Seperti yang ditunjukkan di gambar, dengan fitur ini, Anda dapat membuat alamat dompet yang dimiliki bersama oleh 2 orang lain, dan setiap orang dapat menggunakan hingga 100 Ether setiap hari, dan jika melebihi batas ini, Anda harus mendapatkan persetujuan dari orang lain.

Fungsi ini sebenarnya akan membuat sebuah Contract, dan logika di atas dijelaskan melalui kode dalam Contract. Ketika Anda ingin melakukan pembayaran dari dompet bersama ini, Anda perlu mengirim pesan ke dompet bersama ini ((transaksi adalah pesan, jumlah transaksi bisa nol, hanya membawa data), lalu kode di dompet bersama akan dieksekusi, dan jika permintaan pembayaran sesuai dengan logika di atas, maka transaksi pembayaran yang sebenarnya akan dilakukan, jika tidak, permintaan pembayaran akan ditolak ((tidak ada pembayaran yang sebenarnya).)

Contoh lain adalah “kontrak perlindungan”, yang selalu diceritakan bahwa Bitcoin sebagai mata uang digital tidak stabil dalam nilai mata uangnya (dan nilai tukar mata uang legal), sering terjadi kenaikan atau penurunan dua kali lipat dalam satu hari, tetapi masalah ini dapat diselesaikan hingga batas tertentu jika kontrak perlindungan dilakukan dengan bantuan Contract.

Kita akan menyebut seseorang yang ingin menjaga nilai mata uang tetap sama sebagai “penghindar risiko”, dan orang lain yang bersedia mengambil risiko dari fluktuasi nilai mata uang dan mendapatkan keuntungan dari itu sebagai “pengambil risiko”, sehingga mereka dapat menyepakati jumlah (misalnya 1000 CNY) dan jendela waktu (misalnya satu bulan), dan membuat kontrak yang menjalankan logika berikut:

  • Penghindar risiko akan mengirim Ether senilai 1000 CNY ke alamat dompet Contract, dan penghindar risiko akan mengirim Ether senilai 1000 CNY (atau lebih) ke Contract untuk memenuhi kontrak (jika tidak ada yang memenuhi kontrak, penghindar risiko dapat mengambil kembali Ether mereka).
  • Setelah satu bulan, penghindar risiko dapat mengambil kembali Ether dari Contract yang bernilai 1000 CNY pada saat itu, dan Ether sisanya diambil kembali oleh pengambil risiko, terlepas dari nilai tukar antara Ether dan CNY.

Jika nilai Ether naik, pemegang risiko mendapat untung, jika nilai Ether turun, pemegang risiko rugi, tetapi penghindar risiko selalu tidak rugi. Tentu saja, penghindar risiko dan pemegang risiko dapat menyetujui sebelumnya “asuransi” yang harus dibayarkan oleh penghindar risiko, atau dapat disetujui bahwa pemegang risiko perlu memberikan jaminan beberapa kali lipat dari 1000 CNY (lebih besar risiko yang dapat ditanggung).

Dalam contoh di atas sebenarnya ada masalah yang tidak terlalu baik, yaitu bagaimana menentukan nilai tukar antara Ether dan mata uang virtual, seperti yang kita sebutkan sebelumnya, Kontrak hanya dapat mengakses data di blockchain, dan mata uang virtual adalah data yang ada di dunia nyata dan bukan dunia kriptografi, kita perlu memasukkan “data dari dunia non-kripto” ini ke dalam blockchain melalui mekanisme tertentu.

Kita bisa membuat Contract lain untuk menentukan logika untuk mengambil nilai tukar antara Ether dan mata uang virtual dari dunia nyata, dalam setiap jendela waktu (misalnya satu jam):

  • Semua orang dapat membayar deposit ke Contract dan memberikan nilai tukar.
  • Pada akhir jendela waktu, Contract menghitung rata-rata nilai tukar yang ditawarkan oleh semua pemilik (bertimbangan sesuai dengan premi jaminan) dan mempublikasikan.
  • Dan uang jaminan yang dikumpulkan akan dibagikan kepada orang-orang yang paling dekat dengan rata-rata 25%.

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

Tentu saja ada beberapa kelemahan dalam aturan ini, misalnya jika seseorang memiliki banyak uang jaminan, maka ia dapat menarik nilai rata-rata ke harga yang lebih tinggi atau lebih rendah dari nilai tukar yang sebenarnya, sekaligus mendapatkan hadiah, dan membuat beberapa orang lain yang memberikan nilai tukar yang akurat kehilangan jaminan. Tetapi kenyataannya adalah sama di dunia nyata, jika Anda memiliki banyak uang juga dapat menaikkan atau menekan harga suatu barang, hanya saja dibandingkan dengan dunia nyata, volume e-mata uang masih sangat kecil, dan tidak memerlukan banyak uang untuk melakukannya; tetapi kenyataannya adalah bahwa menaikkan atau menekan nilai tukar dengan cara yang sangat berbahaya juga sangat berisiko, karena Anda tidak yakin berapa banyak uang jaminan yang Anda bayarkan cukup, dan jika gagal, Anda akan kehilangan semua jaminan.

Kesalahan lain adalah bahwa setiap orang dapat membayar deposit ke Contract dan memberikan nilai tukar. Langkah ini dilakukan dengan membuat transaksi, dan semua transaksi akan ditulis di Blockchain, sehingga nilai tukar yang Anda kirimkan sebenarnya dapat dilihat oleh orang lain, yang akan menciptakan peluang lebih lanjut bagi penyerang yang berniat jahat.

Sebelumnya kita telah menyebutkan bahwa Contract dapat membaca data dari Blockchain, tetapi data dari Blockchain adalah pasti, jadi jika kita ingin menerapkan aplikasi yang mirip dengan perjudian, dari mana kita bisa mendapatkan angka acak?

Sebuah sumber angka acak yang bisa dibayangkan adalah Hash dari Block berikutnya, dalam kebanyakan kasus, tingkat ini cukup acak. Tetapi sebenarnya penambang dapat memanipulasi angka acak ini sampai batas tertentu, dengan asumsi bahwa seorang penambang berpartisipasi dalam perjudian tertentu, dan keuntungan dari perjudian lebih besar daripada keuntungan dari menggali satu blok, maka jika penambang menggali sebuah blok yang akan membuat dirinya kehilangan taruhan, maka jelas bahwa penambang akan memilih untuk tidak mempublikasikan blok baru ini, hal ini semakin jelas dalam kasus semakin kuat perhitungan penambang tunggal.

Oleh karena itu kita perlu memperkenalkan mekanisme yang mirip dengan penarikan nilai tukar untuk mengumpulkan sejumlah biji secara acak, dan kemudian menggunakan biji tersebut untuk menghitung angka acak pada akhir setiap jendela waktu dan. Tetapi seperti penarikan nilai tukar, karena para peserta melakukan penarikan nilai tukar dengan membuat transaksi, maka antara satu jendela waktu, jumlah acak yang diserahkan setiap orang akan terlihat oleh orang lain, sehingga seseorang yang telah berpartisipasi dalam permainan tertentu dapat dengan hati-hati memilih satu biji dengan jumlah acak untuk membuat jumlah acak yang dihasilkan dari biji yang telah diserahkan orang lain ditambah dengan biji baru sesuai dengan apa yang dia harapkan.

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

  • Tahap pertama: Semua orang dapat membayar deposit ke Contract dan memberikan “harta segregasi dari satu biji yang dipilih secara acak”.
  • Tahap II: Peserta Tahap I memberikan benih yang belum disemprotkan ke Contract.
  • Tahap II berakhir: Kontrak mengurutkan semua biji yang sah, menghasilkan satu set angka acak dan dipublikasikan; Kembali ke Tahap II dengan jaminan dari orang yang memberikan biji yang benar.

Pada tahap pertama, Anda hanya tahu nilai-nilai segregasi dari orang lain yang telah mengirimkan biji, dan tidak tahu biji yang sebenarnya, sehingga Anda tidak dapat dengan hati-hati membangun biji untuk mengintervensi hasilnya; sedangkan pada tahap kedua, semua orang hanya mengkonfirmasi biji yang dikirim pada tahap pertama, dan tidak dapat mengirimkan yang baru, atau mencegah orang lain untuk mengirimkan biji.

Sebelumnya kita telah menyebutkan bahwa Bitcoin Script tidak memiliki kemampuan untuk memberikan loop, recursion, dan lompat, mungkin Bitcoin adalah untuk mengontrol waktu eksekusi Bitcoin Script, karena program yang ditulis oleh bahasa pemrograman Turing yang lengkap tidak dapat selalu ditentukan hanya dari sudut pandang analisis statis apakah itu akan berakhir setelah beberapa langkah terbatas. Dengan demikian, penyerang yang memiliki niat jahat dapat membuat Transaction yang menyebabkan siklus mati untuk mengganggu pekerjaan normal penambang.

Ethereum mengakali masalah ini dengan “insentif ekonomi” lagi. Kontrak berjalan dalam bentuk opcode (kode operasi) pada mesin virtual yang disebut EVM (Ethereum Virtual Machine). EVM adalah mesin virtual dengan “biaya” sendiri, yang didefinisikan dalam standar EVM berdasarkan memori dan waktu CPU yang dibutuhkan untuk operasi. Setiap Gas yang dikonsumsi oleh opcode, adalah sumber daya komputasi yang dibeli oleh Ether.

Kemudian kita kembali ke masalah “konsensus interval”, yang disebutkan sebelumnya bahwa Bitcoin menghasilkan satu blok baru setiap 10 menit, yang berarti bahwa seluruh jaringan mencapai “konsensus” setiap 10 menit, sehingga transaksi Bitcoin biasa harus menunggu beberapa puluh menit sebelum dikonfirmasi, mungkin menunggu satu jam (enam blok) sebelum transaksi dianggap dapat diandalkan.

Jelas bahwa waktu konsensus yang lebih pendek akan memberikan pengalaman yang lebih baik bagi pengguna, mengapa Bitcoin tidak mempersingkat waktu blok? Ini karena interval konsensus yang lebih cepat akan meningkatkan keunggulan “kolam penambangan terpusat” sampai batas tertentu. Yang disebut “kolam penambangan” adalah para penambang Bitcoin yang berkumpul untuk menambang, para penambang tanpa syarat mematuhi instruksi kolam penambangan, dan akhirnya berbagi keuntungan dengan kolam penambangan.

Ketika seorang miner A menggali sebuah blok baru, ia akan menyiarkan blok ini, dan orang lain setelah menerima berita ini, akan segera mulai bekerja berdasarkan blok baru ini. Sementara orang lain menghitung waktu antara “A menggali blok baru” dan “menerima berita yang disiarkan oleh A” sebenarnya terbuang sia-sia, dan penambang lain di kolam tambang terpusat tidak akan memiliki masalah ini, karena mereka dapat lebih cepat mendapatkan informasi tentang blok baru yang dihasilkan dan segera mulai bekerja berdasarkan blok baru.

blockchain-ethereum-without-uncles

Waktu yang dibutuhkan untuk siaran ini mungkin hanya beberapa detik, dan untuk 10 menit, waktu itu tidak terlalu penting, tetapi keuntungan dari tambang terpusat akan semakin jelas jika interval konsensus dipersingkat. Namun, Ethereum telah menyelesaikan masalah ini dengan memperkenalkan konsep “Uncle Block”, yang mengurangi interval konsensus menjadi 15 detik, dan Bitcoin memiliki peningkatan besar dalam kecepatan konfirmasi pembayaran.

Dalam Blockchain Bitcoin, sebuah blok hanya dapat memiliki satu blok induk dan satu subblok. Namun, dalam Ethereum, sebuah blok baru dapat memiliki satu blok induk dan beberapa blok paman. Kembali ke contoh di atas, jika A menggali blok baru, tetapi orang lain belum menerima waktu siaran, jika seseorang menggali blok baru, tetapi karena siaran terlambat dan tidak diterima, maka blok tersebut berpotensi menjadi “paman” blok berikutnya.

blockchain-ethereum-uncles

Foto diambil dari:<https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

Masalah yang belum diselesaikan

Di bagian selanjutnya, saya akan membahas beberapa masalah yang belum terpecahkan oleh Ethereum.

Pertama adalah bahwa Ethereum saat ini mencapai konsensus cara masih seperti Bitcoin adalah melalui POW (bukti kerja) untuk menjamin, hanya menyelesaikan pekerjaan tertentu node dapat berpartisipasi dalam pekerjaan yang dihasilkan blok, bukti kerja masalah adalah bahwa akan membuang banyak daya komputasi untuk menjamin keamanan jaringan, meskipun yang didasarkan pada “motivasi ekonomi” ide yang kita sebutkan di atas, tetapi sebenarnya dapat diperbaiki. Ehtereum berpendapat bahwa cara yang lebih baik adalah dengan POS (bukti kepemilikan) untuk menggantikan bukti kerja, sehingga dapat sangat meningkatkan efisiensi jaringan ini.

Karena Ether itu sendiri adalah berharga, mengapa tidak menggunakan itu sendiri untuk insentif ekonomi? POS adalah bahwa setiap node yang ingin berpartisipasi dalam pembuatan blok (dalam arti tradisional pertambangan) yang disebut verifikator (disebut verifikator) harus membayar jaminan kepada sistem (disebut sistem dalam protokol, semua node menganggap jaminan itu “beku”) membayar jaminan, dan kemudian menggunakan jaminan sendiri untuk kemungkinan menjadi blok berikutnya (yang disebut “mungkin” adalah asumsi penting bahwa blok harus sesuai dengan ketentuan protokol), jika blok itu benar-benar menjadi blok berikutnya, maka semua node yang berkomentar akan diberi hadiah, atau jaminan akan dibatalkan.

Model ini sebenarnya sangat mirip dengan POW, di POW, penambang menggunakan kekuatan komputasi mereka sendiri untuk “bertaruh”, dan jika ada rantai yang lebih panjang, perlu untuk beralih ke rantai ini untuk terus menambang. Karena semakin banyak rantai yang berpartisipasi, semakin mungkin untuk menjadi rantai yang benar, akhirnya kita mencapai konsensus.

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

Tentu saja, alasan mengapa POS belum diadopsi saat ini adalah karena masih ada beberapa masalah yang belum diselesaikan, salah satunya adalah masalah serangan 51% seperti POW, di mana 51% dari kekuatan komputasi yang terpusat di POW memiliki batasan fisik tertentu karena daya komputasi yang dibutuhkan untuk menyediakan perangkat komputasi; Ether yang mengumpulkan 51% dari seluruh jaringan di POS, sebaliknya, relatif mudah untuk mendapatkannya asalkan Anda memiliki cukup uang.

Hal lain yang dibahas adalah “fragmentasi”, baik Bitcoin maupun Ethereum, yang saat ini melakukan semua konfirmasi transaksi pada Blockchain yang sama, yang sangat membatasi kapasitas komputasi jaringan terdistribusi. Setiap node perlu menerima, menyimpan, dan memverifikasi setiap transaksi, dan kapasitas pemrosesan seluruh jaringan sebanding dengan kapasitas pemrosesan satu node.

Oleh karena itu, Ethereum berharap untuk memperkenalkan mekanisme “pemisahan” di masa depan, untuk membagi seluruh jaringan menjadi beberapa bagian, dan melakukan verifikasi transaksi secara independen di antara mereka. Namun, pemisahan antara mereka akan menggunakan struktur pointer untuk merujuk data dari pemisahan lainnya, dengan cara memanggil asynchronous untuk mempengaruhi pemisahan lainnya, sehingga seluruh jaringan tetap menjadi satu bagi pengguna, hanya saja kemampuan pemrosesan seluruh jaringan akan sangat kuat.

Contract

Pada bagian ini saya akan menunjukkan beberapa kode kontrak yang benar-benar bekerja. Kontrak dapat ditulis dengan berbagai bahasa yang berbeda, dan akhirnya dikompilasi menjadi opcode yang dieksekusi pada EVM, hari ini kita akan menggunakan bahasa JavaScript Solidity, yang merupakan bahasa EVM yang paling terjaga 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 ini adalah beberapa contoh sintaks inti yang dapat Anda gunakan untuk menyatakan variabel status di Solidity:uint storedData;Jika Anda memiliki nilai variabel, Anda akan menyimpan nilai variabel tersebut di blockchain selamanya.structUntuk mendeklarasikan struktur data yang kompleks; juga dapat mendefinisikan fungsi, yang akan dieksekusi pada saat menerima transaksi, dan pengirim transaksi dapat memilih fungsi mana yang akan dieksekusi, sehingga sebuah Contract dapat menyediakan beberapa fungsi, di dalam fungsi dapat dilakukan penilaian logis, berputar, dan memodifikasi nilai perubahan.

Bahasa ini memiliki beberapa fitur kecil yang sangat berguna, seperti algoritma kriptografi yang umum.sha256) , unit konversi ((10 finney“Saya tidak tahu apa-apa, tapi saya tidak tahu apa-apa.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2Dan sebagainya.msgContract adalah sebuah variabel global yang terpasang di dalamnya, yang dapat membaca informasi yang berkaitan dengan transaksi ini, seperti initiator, jumlah, dan lain-lain. Contract dapat memanggil kode dari Contract lain dengan dua cara, yaitu dengan menggunakan kode dari Contract yang lain, dan dengan menggunakan kode dari Contract yang lain.delegatecallIni sama dengan menempatkan kode dari kontrak lain ke dalam konteks eksekusi saat ini, seolah-olah memperkenalkan fungsi perpustakaan; dancallIni adalah logika untuk memulai transaksi baru untuk memicu kontrak lain.

Jadi bagaimana Contract membaca dan menulis data dari blockchain? Pekerjaan rumit ini diabstraksi menjadi “variabel status”, di mana storedData adalah sebuah variabel status. Sebenarnya, perubahan pada variabel status dalam proses eksekusi Contract tidak disimpan ke dalam blockchain, karena Contract dilakukan secara pasti.

Berikut ini saya akan menunjukkan sebuah Contract Coin yang benar-benar bisa digunakan untuk mengeluarkan token 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)

Contract, yang diberi nama Coin, menyatakan dua variabel status, yaitu “Coin” dan “Coin”.minterPencipta token yang digunakan untuk menyimpan token ini, sedang membangun fungsi ((function Coin()Variabel ini diberi atribusi initiator dari transaksi pertama yang digunakan untuk membuat Contract; juga menyatakan sebuah tabel pemetaan alamat dompet ke angka.balances, digunakan untuk menunjukkan saldo dari setiap alamat yang memegang token tersebut.

mintFungsi ini menilai apakah orang yang memulai transaksi adalah pencipta token, dan jika demikian, maka akan ditambahkan sejumlah token ke alamat yang ditentukan sesuai dengan parameter fungsi tersebut.sendFungsi ini dapat dipanggil oleh semua orang dan akan mengurangi jumlah saldo dari alamat yang memulai transaksi (jika ada saldo yang cukup), ditambah dengan alamat tujuan, yang setara dengan fungsi transfer.

Kami juga mengumumkan sebuah nama,SentEvent, event sebenarnya tidak akan memiliki peran praktis, hanya untuk memudahkan proses debugging saat mencetak event penting, dan di masa depan juga akan memudahkan implementasi klien ringan ((client ringan hanya menerima event dan tidak benar-benar menjalankan Contract)).

blockchain-ethereum-mix

Ethereum menyediakan sebuah IDE bernama Mix untuk melakukan debug kode ini, di sebelah kanan Mix Anda dapat membuat beberapa blok dan akun untuk menguji Contract Anda, dan Anda juga dapat melihat perubahan nilai setiap variabel status selama proses eksekusi. Perlu disebutkan bahwa Contract tidak dapat diubah setelah diluncurkan, dan kemudian berjalan sepenuhnya berdasarkan transaksi orang lain.

Setelah selesai, kita dapat menggunakan dompet Ethereum untuk mempublikasikan kontrak ini ke jaringan:

blockchain-ethereum-create-contract

Setelah rilis, Anda dapat mengikuti Contract ini dengan mengunjungi antarmuka Contract detail:

blockchain-ethereum-wallet-contract

Di sebelah kiri Anda dapat melihat nilai dari dua variabel status,minterSaya tidak tahu apa yang harus saya lakukan, tapi saya tidak akan melakukannya.balancesKarena ini adalah tabel pemetaan, Anda dapat mengetikkan alamat untuk melihat saldo. Di sebelah kanan Anda dapat memulai transaksi baru dengan Contract ini, dan ada menu unduh yang dapat Anda pilih.sendAtau …mintFungsi, Anda dapat mengisi parameter yang akan dikirim ke Contract. Karena tujuan kami mengirim transaksi di sini adalah untuk menyampaikan pesan, bukan untuk menyampaikan Ether, jadi kami tidak perlu mengatur jumlah transaksi.

Berikut ini saya akan memperkenalkan Contract yang sangat menarik, Contract ini memiliki efek penipuan ponzi yaitu anda bisa membayar 1 Ether kepada Contract ini untuk bergabung dengan permainan ini, dan kemudian setiap tiga orang yang bergabung akan dibayar 3 Ether kepada orang yang bergabung sebelumnya:

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 dari<https://ethereumpyramid.com/contract.html

Kode ini cukup sederhana, dan Contract menyatakan satu hal.participantsArray digunakan untuk menyimpan alamat dompet semua peserta secara berurutan, atau menyatakan sebuahpayoutIdxIni digunakan untuk mencatat berapa banyak peserta yang telah menerima 3 Ether kembali.enterUntuk melakukan fungsi utama dari Contract ini, pertama-tama melakukan beberapa pemeriksaan parameter, memastikan bahwa setiap peserta membayar 1 Ether, dan kemudian menempatkan peserta baru keparticipantsDi akhir array, jika nomor seri dari peserta saat ini adalah kelipatan dari 3, maka 3 Ether dikirimkan ke peserta kedua.payoutIdxSeorang peserta, dan akanpayoutIdxMenunjuk peserta berikutnya.

Referensi

HashTree:

Bitcoin:

Halting Problem:

Ethereum:

Ethereum Network:

Next of Ethereum:

Contract:

Contract IDE: