
Ada banyak artikel dan diskusi filistin di Internet, tetapi tidak cukup informasi tentang manfaatnya. Pada titik tertentu, penulis menyadari bahwa mekanisme dan banyak nuansa keamanan terkait tidak sepenuhnya dipahami bahkan oleh banyak pengembang cryptocurrency. Ini terungkap dalam kasus nyata porting implementasi PoS untuk salah satu cryptocurrency dan dalam publikasi informasi lebih lanjut tentang kerentanan yang ditemukan oleh para ahli pihak ketiga.
Artikel ini akan bermanfaat bagi semua pengembang yang telah menemukan kerentanan PoS atau yang masih akan datang.
Ngeri di bawah luka.
Sepotong sejarah
Di Internet, munculnya Proof-of-Stake (PoS) di Peercoin dilacak setelah diskusi di salah satu forum pada tahun 2011, penggunaan selanjutnya di NovaCoin dan distribusinya lebih lanjut dalam PIVX dan garpu Bitcoin lainnya. Logika PoS yang cukup primitif dibawa ke kernel.cpp
/ kernel.cpp
, yang berkeliaran melalui ruang fork dalam bentuk berbagai modul Frankenstein.
Algoritma PoS melewati beberapa tahap pengembangan, seseorang memberi mereka versi. Sekarang opsi PoS dibagi karena alasan alami, DPoS telah muncul. Salah satu solusi paling canggih adalah protokol Casper di Ethereum.
Setiap blockchain membutuhkan pembuatan blok dan seseorang harus memiliki hak untuk membangun blok baru. Jika penulis melakukannya tanpa banyak persaingan dalam blockchain seperti sistem kontrol versi Git, maka dalam cryptocurrency ada perjuangan sengit untuk hadiah blok dalam kerangka Proof-of-Work (PoW) - menemukan kombinasi parameter input variabel dengan memilih yang memberikan hasil yang sesuai dengan ditentukan oleh tujuan tertentu (penambangan, penambangan).
PoS menggantikan Proof-of-Work (PoW) untuk menghindari pemborosan sumber daya di pertambangan. Sebagai gantinya, semua parameter input didefinisikan secara ketat dengan karakteristik konstan berdasarkan simpanan pemegang koin yang ada. Oleh karena itu, PoW diperlukan sebagai titik awal untuk PoS, jika Anda tidak menggunakan berbagai opsi untuk pengayaan awal yang digadaikan dari para pembuat koin.
Mengapa
Menghemat energi sama pentingnya bagi pengembang dan pemegang koin dengan membatasi emisi gas rumah kaca bagi produsen dan konsumen. Kebenaran yang kejam berbeda:
- Proyek berbasis PoW tunduk pada apa yang disebut "51 persen serangan": penyerang dapat memanfaatkan kekuatan besar, membuat rantai paralel, dan kemudian tiba-tiba menerbitkannya dengan gerakan koin yang berbeda (yaitu limbah ganda),
- Penambang PoW perlu menutup biaya mereka dan berinvestasi dalam pengembangan kapasitas - ini adalah aliran keluar modal langsung dari proyek,
- pemilik tabungan ingin mempertahankan daya belinya dengan modal sendiri, daripada melihat inflasi alami.
Pada contoh hidup: pada November-Desember 2018 ada upaya serangan; kemudian pada bulan Desember-Februari ada kehebohan sebagai koin paling menguntungkan untuk menambang di kartu video; kurs turun dari 2+ menjadi 0,5 USD; Setelah beralih ke PoS, kurs naik menjadi 1 USD dalam seminggu dan arus investasi meningkat.
Poin teknis
Perhatian: di bagian ini, kita berbicara tentang PoS "tradisional" dalam bentuk seperti di Peercoin, PIVX dan forks-forksnya.
Anda perlu memahami bahwa tidak ada sentralisasi dan akuntansi untuk "poin". Dalam versi ini, prinsip keberuntungan yang sama berfungsi seperti pada PoW.
1. Terminologi
Terminologinya relatif umum, tetapi dalam implementasi yang berbeda nuansanya adalah:
- Target PoW - target = target dasar, biasanya 2 ^ 240 (0x0000ffff ...) dibagi dengan kompleksitas blok (meningkatkan jumlah nol di depan).
- Blok kesulitan - kompleksitas blok relatif terhadap tujuan dasar, ditentukan berdasarkan tingkat pertumbuhan rantai saat ini.
- UTXO - Output Transaksi Unspent, pasangan dari hash transaksi dan nomor keluar.
- CoinBase adalah transaksi khusus dengan indeks 0 di blok yang berisi hadiah.
- Taruhan atau CoinStake adalah transaksi khusus dengan indeks 1 di blok.
- Input Taruhan - UTXO yang memenuhi persyaratan untuk taruhan berdasarkan ukuran dan usia.
- Stake Modifier - parameter yang dihitung secara deterministik khusus untuk setiap Input Pasak .
- Stake Hash adalah hasil hash yang harus secara aritmatika kurang dari Stake Target .
- Target Pasak - sama dengan target PoW, tetapi meningkat secara proporsional dengan jumlah Input Pasak relatif terhadap tawaran minimum.
- Block Signature - Block Signature .
- Fork - rantai bercabang.
- Split - berbagi jaringan.
- Anak yatim - blok yang dibuang karena pilihan alternatif lain.
2. Anatomi
Proses Pembuatan:
- Kami menemukan semua UTXO yang memenuhi persyaratan Input Pasak
- Temukan Pengubah Pasak.
- Gandakan Target PoW dengan Input Pasak
- dalam sepersejuta bahkan - itu sebabnya 1 MH PoW hashrate secara eksperimental keluar sama dengan satu koin.
- Kami
Stake Hash = H(Stake Modifier, Stake Block Time, UTXO output index, UTXO txid, Current Block Time)
.
- hanya parameter variabel Waktu Blok Saat Ini
- Jika
Stake Hash >= Stake Target
, maka cobalah untuk menemukan Current Block Time
dalam rentang yang dapat diterima.
- Anda perlu mempertimbangkan kemungkinan luapan Target Pasak ketika dikalikan dengan jumlah Input Pasak, tergantung pada implementasinya.
- Kami menempatkan Coinbase di tx [0], dan CoinStake di tx [1].
- penerima Coinbase adalah skrip (alamat) yang sama dengan Stake Input.
- Kami menandatangani blokir.
2.1. Waktu pemblokiran:
Sangat mudah untuk melihat bahwa scam dapat memberikan manfaat dari waktu ke waktu. Konsensus standar membatasi batas bawah dan atas.
Yang lebih rendah selalu mengatur waktu rata-rata blok di atas blok N terakhir, biasanya lebih dari 11. Ini adalah toleransi untuk ketidaktepatan waktu dalam menghasilkan node.
Batas atas bersejarah ditetapkan untuk PoW dengan jari ke langit pada jam 2. Meningkatkan interval mengurangi kompleksitas dan membuat cabang kurang menarik - karena itu, tidak masuk akal. Tapi untuk PoS, itu masuk akal.
PIVX dan lainnya membatasi waktu mendatang hingga maksimum 3 menit. Beberapa menempatkan pembatasan yang lebih parah, tetapi ini menciptakan masalah bagi pengguna. Beberapa implementasi PoS telah memutuskan untuk mengubah interval Waktu Blok minimum saat ini dari satu detik menjadi 15-16 detik.
2.2. Pengubah Pasak:
Pengubah Pasak dikandung sebagai cara mempersulit prediksi dan membangun rantai di depan, tetapi ada yang salah ...
Ada berbagai opsi untuk menghitungnya: bit terakhir dari hash blok di akhir interval waktu yang ditentukan secara progresif, [tidak terlalu] nilai prediksi yang buruk dari blok sebelumnya, dll. Di beberapa tempat, ini lebih mirip kode yang membingungkan daripada sesuatu yang waras.
Dokumen asli memerlukan jarak 64 interval. Kesenjangan ini secara progresif dibagi menjadi 64 bagian yang tidak sama. Perbatasan dibulatkan menjadi menit. Di perbatasan, blok yang ada dipilih dan satu bit terakhir diambil dari mereka. Jadi ternyata angka 64-bit, sesuatu yang mirip dengan Nonce.
Interval di Peercon adalah 20 menit, tetapi orang-orang di PIVX memutuskan bahwa interval 1 menit, dibulatkan ke menit, adalah apa yang diperintahkan dokter.
Secara umum, dalam beberapa implementasi seperti Blackcoin V2 + semuanya sudah diperbaiki dan Stake Modifier dihitung dari kepala, sedangkan di Peercoin V03, PIVX, Blackcoin V1 dan lainnya dari blok Stake Input. Yang terakhir hampir sepenuhnya menghancurkan maknanya. Ada asumsi bahwa kebingungan terjadi karena masalah penamaan variabel penamaan, metamorfosis lebih lanjut dan copy-paste tanpa pertimbangan. Dan penulis sendiri menemukan masalah itu agak terlambat sementara semua perhatiannya terfokus pada perlindungan terhadap DoS. Jangan sampai ketahuan!
2.3. Blokir tanda tangan
Karena hash blok tidak lagi berfungsi sebagai bukti kerja, dan siapa pun dapat mengambil transaksi CoinStake yang ditandatangani dari blok orang lain, Anda perlu memeriksa bahwa blok tersebut dibuat oleh pemilik Pasak. Oleh karena itu, tajuk ditandatangani dengan kunci pribadi yang sama dengan CoinStake.
2.4. Script keluar CoinBase dan CoinStake
Skrip keluar yang sama, atau saat orang memanggil alamat dompet, diperlukan untuk menjaga privasi dan menghindari menautkan masing-masing alamat dalam satu dompet.
2.5 Apa dan dimana?
Ada variasi berbeda tentang cara mereka menangani jumlah di CoinBase dan CoinStake. Logika dan motivasi dalam kasus tertentu:
- Jumlah harus disimpan terpisah untuk menghindari hilangnya dana pengguna sekecil mungkin karena kesalahan pemrosesan.
- CoinBase mempertahankan 100 konfirmasi, tetapi CoinStake dapat dihabiskan segera, yang tentu saja meninggalkan risiko pengeluaran ganda.
- menjentikkan ke kedalaman blok juga bertentangan dengan kualifikasi usia untuk digunakan sebagai Input Pasak.
- CoinBase dan CoinStake seharusnya tidak pernah masuk ke mempool, dan semua transaksi yang didasarkan padanya harus dihapus selama pembangunan kembali rantai.
3. Blok lengkap terhadap header
Entri dari simpul penuh ke dalam jaringan dimulai dengan sinkronisasi. Dalam Bitcoin, sinkronisasi terutama didasarkan pada header blokir, seperti mereka berisi informasi yang cukup untuk verifikasi awal konsensus. Pertama, header yang relatif kecil ditarik keluar dan diperiksa dalam batch hingga 2.000 buah dari satu simpul sisi. Jika pemeriksaan awal berhasil, maka semua blok ditarik secara paralel dari semua node yang terhubung.
Perlindungan banjir didasarkan pada kenyataan bahwa simpul lokal membandingkan header yang paling terkenal dengan apa yang dimilikinya dan meminta seluruh rantai tajuk. Saat Anda mengunduh, semuanya diperiksa oleh biaya rendah ruang disk dan komputasi. Berat rantai dibandingkan berdasarkan karakteristik seperti rantai , yang merupakan jumlah dari kompleksitas masing-masing blok. Untuk membangun rantai alternatif yang kuat seperti itu akan membutuhkan investasi sumber daya yang sangat besar, yang membuat serangan tidak menjanjikan.
Dengan PoS, pendekatan ini tidak berhasil, karena Untuk memeriksa blok, Anda perlu memproses blok sebelumnya yang lengkap setidaknya untuk usia minimum Pasak. Implementasi yang dilihat oleh penulis tidak mulai disimpangkan, tetapi hanya menolak untuk bekerja dengan header.
Oleh karena itu, penulis menerapkan unduhan oportunistik paralel dari blok-blok yang mengikuti tajuk, yang secara signifikan meningkatkan kecepatan sinkronisasi karena penggunaan semua koneksi. Penundaan kecil terjadi hanya jika rekan-rekannya berada di rantai yang berbeda - maka koneksi terputus setelah sedikit waktu habis seperti dalam skema standar. Sebagai minus, kecenderungan untuk memilih rantai palsu pada saat sinkronisasi.
Omong-omong, klien Bitcoin standar dan fork-nya telah mengambil jumlah standar minimum dari koneksi keluar selama 8 cukup lama jika beberapa dari mereka gagal karena berbagai alasan. Ini telah diatasi dengan koneksi keluar asinkron.
4. Garpu, perpecahan dan anak yatim
Dengan kompetisi pembangunan blok, rantai alternatif 1-2 tautan relatif umum. Fork yang lebih panjang di jaringan yang dikembangkan secara alami hanya terjadi dengan kegagalan epik dalam konsensus karena kesalahan pemrograman atau jeda Internet global.
Bahkan dengan pemisahan, biasanya tidak ada ancaman terhadap integritas pemrosesan transaksi, seperti saat melepaskan blok, semua transaksi kembali ke mempool dan sudah termasuk dalam blok lainnya. Mempool adalah repositori sementara dari transaksi setelah dibuat. Mempool sendiri disimpan ke disk dalam versi terbaru. Hadiah untuk blok dihancurkan. Itulah mengapa jumlah minimum konfirmasi (kedalaman) ditetapkan untuk penghargaan.
Itu terjadi bahwa segmen jaringan lokal kehilangan koneksi mereka dengan dunia luar dan terus menambang, dengan asumsi ada koneksi ke jaringan utama. Cabang-cabang seperti itu biasanya tidak menimbulkan ancaman karena kelemahan alami mereka.
Serangan 51% utama untuk PoW telah dijelaskan di atas - ini sangat intensif sumber daya, tetapi untuk PoS menjadi relatif terjangkau. Karena alasan ini, secara teknis dimungkinkan untuk menghasilkan banyak cabang dari berbagai mata rantai. Salah satu solusi klasik adalah melarang garpu di bawah kedalaman tertentu.
Masalah utama dari perlindungan tersebut adalah ketidakmampuan node dari segmen pertapa untuk secara mandiri kembali ke sirkuit utama setelah restart.
Oleh karena itu , pendekatan diimplementasikan dalam pelarangan garpu yang lebih tua dari periode waktu tertentu hanya jika bagian atas rantai cukup muda.
Dengan interval target blok 1 menit, kriteria garpu tua dipilih pada 1 jam, yang kira-kira sesuai dengan 60% konfirmasi CoinBase, dan kriteria pemuda mahkota pada 15 menit adalah 3+ kali lebih tinggi daripada penundaan statistik maksimum blok.
5. Blokir dan pisahkan hash
Di PoW, hash blok sepenuhnya mencakup semua data. Ini juga digunakan untuk memeriksa target. Dalam PoS, Stake Hash adalah nilai yang terpisah karena perlu untuk mengecualikan kemungkinan pemilihannya. Ini membuka ancaman utama - kemampuan untuk menghasilkan jumlah yang tidak terbatas dari versi yang berbeda dari blok berdasarkan pada Peristiwa yang sama, yang mudah membanjiri dan menempatkan jaringan atau masing-masing node.
Pendekatan pertahanan naif meningkatkan kerentanan perpecahan yang bahkan lebih serius. Salah satu pendekatan tersebut dalam variasi yang berbeda adalah untuk memungkinkan penggunaan Input Pasak hanya sekali. Serangan sederhana adalah mengirim blok yang berbeda ke node yang berbeda, yang segera membuat pemisahan lembut.
Bahkan lebih fatal untuk memperburuk ini dengan larangan DoS, yang akan membagi tidak hanya rantai, tetapi jaringan itu sendiri menjadi segmen yang berbeda.
Masalah lain muncul - ketidakmampuan untuk menggunakan Pasak dari blok yang dijatuhkan.
Oleh karena itu , metode throttle dipilih sebagai solusi teraman - Taruhan yang sama dapat digunakan tidak lebih dari sekali per menit. Logikanya sederhana: serangan hanya bisa bertahan dalam interval 1 jam (lihat garpu tua di atas), yang memungkinkan untuk membanjiri tidak lebih dari 60 blok. Dalam kasus terbaik, pada blok berikutnya, jaringan sudah akan pindah ke satu sirkuit. Dalam kasus terburuk, dengan serangan terus-menerus, ini akan terjadi dalam satu jam. Probabilitas kasus terburuk - menemukan beberapa blok berturut-turut, mencair secara eksponensial.
Semua sama, beberapa titik tetap di mana node rentan terhadap banjir sedang sampai saat sinkronisasi lengkap .
6. Usia minimum
Bagi sebagian orang, batasan ini membingungkan, tetapi sangat penting untuk stabilitas jaringan parameter ini berkaitan langsung dengan panjang maksimum jaringan alternatif, yang dapat diperiksa oleh simpul lokal tanpa distorsi teknis yang serius.
Seperti disebutkan sebelumnya, simpul lokal harus memproses semua blok hingga batas waktu usia untuk dapat memverifikasi bahwa Stake Input a) memiliki tempat untuk menjadi b) benar-benar UTXO dan belum dihabiskan.
Periksa ini hanya mungkin melalui fungsi yang disebut. CoinView, yang merupakan keadaan pergerakan koin pada saat blok tertentu - bagian atas rantai utama dalam memahami simpul lokal.
Pelaksanaan uji coba lengkap rangkaian alternatif pada interval waktu atau bahkan dengan cara khusus yang disimpan oleh CoinView tampaknya tidak menjanjikan, karena jumlah rantai alternatif ini sangat besar.
Bilah terlalu besar untuk batas usia UTXO berdampak negatif pada pengguna yang ingin menghabiskan atau menggabungkan sebagian dari koin mereka.
Jika Anda menentukan batas ini di kedalaman blok, maka situasi jalan buntu hipotetis dari penghentian rantai lengkap karena fakta bahwa tidak ada UTXO yang cocok adalah mungkin. Dalam kasus unit waktu, setidaknya beberapa gerakan terjadi.
Oleh karena itu , pilihan seimbang 1 jam digunakan di jaringan lain dalam satuan waktu absolut, daripada kedalaman blok.
7. Apa yang lebih baik dari N UTXO untuk jumlah minimum atau satu UTXO dengan total N?
Di sini analoginya memohon: bahwa lebih baik memiliki satu senjata dengan akurasi 0,9 atau tiga senjata dengan akurasi 0,3, tetapi dengan probabilitas urutan 1/2 ^ 20, hasil perhitungan seperti itu tampaknya akan diratakan. Sebuah peta kecil membingungkan jatuh tempo kualifikasi.
Kepercayaan saat ini bahwa banyak transaksi kecil menemukan lebih banyak blok kemungkinan berasal dari zaman ketika Stake Input juga diperhitungkan untuk menentukan bobot. Saat itu, transaksi kecil lama benar-benar masuk akal.
Pada saat ini, berdasarkan percobaan praktis dan perhitungan teoritis, kelompok-kelompok yang dikelompokkan dalam UTXO besar membawa lebih banyak blok. Selain itu, lebih sedikit UTXO membutuhkan lebih sedikit kerja CPU. Seseorang mengklaim sebaliknya.
Jadi pikirkan sendiri.
8. Menjalankan blok ke depan
Penambang PoS secara alami mengungguli blok kali sedikit. Ini mempengaruhi kompleksitas jaringan menjadi lebih buruk. Kode Bitcoin standar memilih blok pertama yang diterima, terlepas dari waktu yang ditunjukkan di dalamnya. Sebagian besar implementasi PoS melakukan hal yang sama.
Oleh karena itu, logika penambang PoS diubah untuk memulai pemilihan dari waktu rata-rata blok jika waktu blok saat ini berjalan maju. Pada saat yang sama, sebelum membandingkan urutan, simpul membandingkan waktu yang ditunjukkan dari blok. Penambang PoS mengirim blok yang ditemukan ke jaringan bahkan jika ia melihat bahwa ia menghasilkan garpu.
Dengan cara ini, jaringan juga dilindungi dari blok hipotetis yang dikirim prematur yang Stake Input-nya tidak dapat digunakan dalam 60 detik berikutnya dengan Stake Modifier yang sama karena perlindungan DoS. Seperti hukuman ganda karena selingkuh dari waktu ke waktu.
9. Daftar periksa kecil
- Input Pasak harus valid UTXO sebelum titik fork:
- dalam kasus rantai utama, titik garpu adalah ujung,
- dalam kasus rangkaian alternatif - UTXO setelah titik fork dapat menyebabkan Self-DoS saat berpindah,
- UTXO tidak boleh di mempool dengan sendirinya.
- Jangan terima CoinStake di mempool saat membangun kembali sirkuit utama:
- hal yang sama terjadi dengan CoinBase,
- ini dapat menghancurkan rantai transaksi (tidak mungkin).
- Jangan terima garpu dari blok lama jika bagian atasnya cukup hidup.
- Batas usia dalam unit waktu absolut untuk Input Pasak diperlukan untuk stabilitas dan keamanan.
- Taruhan Taruhan seharusnya hanya berubah dari waktu blokir.
- Pengubah Pasak tidak boleh terikat pada blok Masukan Pasak.
- Bekerja dengan header blok memerlukan pemrosesan khusus pada jaringan dan selama pengindeksan ulang.
- CoinStake direkam di dompet lokal dan memerlukan beberapa perubahan untuk tampilan anak yatim dengan benar.
- Penambang PoS kemungkinan besar memiliki cukup tiang tembok dan perlu diselesaikan dengan file.
- Indeks ulang perlu ditingkatkan, karena Ini bekerja dengan analogi dengan header - pertama memuat dan memeriksa hanya indeks blok, dan kemudian hanya mencoba untuk memproses blok.
- Jika transisi ke PoS bukan hard-coded, tetapi melalui spork, maka Anda perlu menangkapnya saat boot, karena sporks tidak disimpan.
- Pos-pos pemeriksaan di Dash dan Bitcoin hampir palsu dan membutuhkan revisi yang sangat serius.
- Jika garpu Dash hingga versi 0.13, maka ada masalah dengan pemrosesan data masternode dalam mode pengguna yang sederhana.
- Dengan seringnya restart klien, tampilan jaringan terdistorsi.
- Lebih baik mengabaikan cache jika berjalan dalam mode grafis.
- Ubah pilihan blok terbaik dengan mempertimbangkan waktu blok.
- Bitcoin .
- mempool CoinStake .

. mainnet PoW , , PoS, . PoS Ethereum Casper'.
GPU - β ethminer'. 150-200 GH (ethash). - PoS .
PoS PIVX 2.x " ". - PIVX , , . , PIVX 2.x . Dash 0.12 Bitcoin'.
, PoS . , , .
. . whitepaper -.
PoS PIVX Bitcoin/Dash. CoinStake . PoS .
, Stake Modifier Stake Hash , Stake Input . - , - PIVX .
β . :
- .
- .
- β .. , .
- , - , .
. spork' , .
, . spork' .
PoS
, - . spork, , .
, .. . , .
testnet, .
testnet 3 1 mainnet, .
PoW , PoS - , 1e6 PoW.
. mainnet Stake Input.
.
PoS
X spork PoS . - , .
. , . .
, , .
Stake Modifier . . PIVX - β¦ , , Ethereum, .
Kesimpulan
- , . , PoS , . .
: - .
GitHub