Blockchain/Tahap III · Rangkaian/3.1 Nod/Pelajaran 2
Gosip peer-to-peer
Protokol gosip: bagaimana nod mencari rakan sebaya dan menyebarkan data tanpa pusat
BahanNod Bitcoin Core yang sedang berjalanAkses terminal menggunakan ‘bitcoin-cli’Editor teks untuk merekod maklumat rakan sebaya
Ingin tahu
- Bagaimanakah nod baru dalam rangkaian kosong mencari rakan sebaya pertamanya?
- Bagaimanakah sebuah blok baru dapat sampai ke ribuan nod dalam beberapa saat tanpa ada sesiapa yang mengkoordinasikannya?
- Apakah yang menghalang penyerang daripada mengasingkan sesebuah nod daripada seluruh rangkaian?
Teroka
- Bitcoin beroperasi sebagai rangkaian peer-to-peer yang terdesentralisasi, di mana setiap nod penuh menyimpan keadaannya sendiri secara bebas. Untuk menyertai rangkaian, nod baharu perlu mewujudkan sambungan TCP dengan rakan sebaya sedia ada. Mainnet menggunakan port 8333 untuk sambungan tersebut. Penemuan awal bergantung pada DNS seeds yang dikendalikan oleh ahli komuniti yang telah lama aktif dan disenaraikan dalam perisian, serta alamat sandaran yang dikodkan secara tetap. Setelah bersambung, sesebuah nod boleh meminta alamat melalui mesej 'getaddr' dan menerimanya dalam mesej 'addr', sekali gus membolehkannya mengetahui tentang peserta aktif yang lain dan mengembangkan set rakan sebayanya secara dinamik.
- Bitcoin Core mengurus topologi tertentu: 8 sambungan keluar relay penuh untuk penyebaran transaksi dan blok, ditambah 2 sambungan relay blok sahaja untuk mengurangkan penggunaan lebar jalur. Ia membenarkan sehingga 125 sambungan secara keseluruhan, termasuk sambungan masuk dan keluar. Struktur ini memastikan lewahan; sekiranya satu rakan sebaya terputus sambungan atau tidak memberi respons, nod tersebut masih kekal berhubung melalui rakan sebaya yang lain. Sambungan relay blok sahaja tidak membawa sebarang transaksi atau alamat, dan ini menyukarkan pemerhati untuk memetakan topologi rangkaian.
- Penyebaran data mengikut mekanisme pengumuman. Apabila sesebuah nod menerima transaksi baharu, ia mengumumkannya melalui mesej 'inv' (inventori) yang mengandungi hash tetapi bukan datanya; blok baharu kini biasanya diumumkan dengan menghantar kepala blok atau blok kompak secara langsung. Rakan sebaya yang menerima pengumuman ini menyedari bahawa mereka tidak mempunyai objek tersebut lalu menghantar permintaan 'getdata'. Pemegang asal kemudian menghantar muatan penuh. Proses dua langkah ini mengelakkan rangkaian dibanjiri muatan besar yang berlebihan sebelum rakan sebaya mengesahkan minat mereka, sekali gus memastikan penggunaan lebar jalur yang cekap dalam sistem teragih.
- Blok kompak (BIP152), yang diperkenalkan pada tahun 2016, mengoptimumkan proses ini lagi. Memandangkan kebanyakan transaksi dalam sesebuah blok sudah diketahui oleh rakan sebaya melalui penyebaran mempool, menghantar keseluruhan blok adalah satu pembaziran. Sebaliknya, nod menghantar kepala blok beserta pengecam pendek (6 bait setiap satu) bagi transaksinya, bersama transaksi coinbase; penerima membina semula blok tersebut daripada mempoolnya sendiri dan hanya meminta beberapa transaksi yang tidak dimilikinya. Ini mengurangkan kependaman penyebaran blok dengan ketara, membolehkan rangkaian mencapai konsensus dengan lebih pantas walaupun dengan volum transaksi yang tinggi.
- Serangan eclipse menunjukkan betapa pentingnya kepelbagaian rakan sebaya. Heilman et al. (2015) menunjukkan bahawa penyerang yang menguasai semua sambungan sesebuah nod boleh mengasingkannya daripada rangkaian yang jujur dan memberinya gambaran palsu tentang rantaian. Bitcoin Core menerima pakai langkah pencegahan mereka mulai versi 0.10.1, termasuk sambungan peninjau (feeler) dan pengusiran entri jadual alamat yang lebih teliti, dan kemudiannya menambah sambungan anchor yang kekal walaupun nod dimulakan semula. Beroperasi hanya melalui Tor boleh menjadikan sesebuah nod lebih mudah, bukan lebih sukar, untuk diserang secara eclipse.
- Sahkan sambungan nod anda dengan menjalankan 'bitcoin-cli getpeerinfo' dalam terminal yang disambungkan ke instans Bitcoin Core setempat. Output akan menyenaraikan alamat setiap rakan sebaya, 'connection_type' (contohnya outbound-full-relay atau block-relay-only), versi perisiannya dan sejauh mana ia telah diselaraskan ('synced_headers', 'synced_blocks'). Nod yang sihat menunjukkan kira-kira sepuluh sambungan keluar: lapan full-relay dan dua block-relay-only.
Fakta utama
- Mainnet Bitcoin menggunakan port TCP 8333 untuk komunikasi peer-to-peer.
- Nod baharu dimulakan menggunakan DNS seeds dan alamat yang dikodkan secara tetap sebelum mengenal pasti rakan sebaya melalui gosip.
- Secara lalai, Bitcoin Core menggunakan 8 sambungan keluar relay penuh, 2 sambungan relay blok sahaja, dan maksimum 125 sambungan secara keseluruhan.
- Mesej 'inv' mengumumkan hash data; 'getdata' meminta muatan sebenar daripada rakan sebaya yang menyimpannya.
- Blok kompak (BIP152) membolehkan rakan sebaya membina semula blok daripada mempool tempatan, seterusnya mengurangkan lalu lintas data.
- Serangan Eclipse cuba merampas semua sambungan sebuah nod; Bitcoin Core telah menambah beberapa langkah pencegahan sejak tahun 2015.
Latihan sembilan, enam, tiga, satu
9KumpulSenaraikan 9 komponen berbeza dalam proses bootstrap dan penyebaran Bitcoin P2P (contohnya, benih DNS, mesej ‘inv’).
6KelompokkanKumpulkan 9 komponen ini kepada 6 kategori berdasarkan fungsinya: penemuan, pengurusan sambungan, pengumuman data, pengambilan data, pengoptimuman, atau keselamatan.
3SaringKurangkan 6 kumpulan tersebut kepada 3 prinsip asas yang mengawal penyebaran rangkaian yang cekap dan selamat.
1KristalkanTulis satu ayat yang menerangkan mengapa sesebuah nod perlu mengekalkan sambungan keluar yang pelbagai untuk menangkis serangan eclipse.
Semakan fakta
Tarikh, angka dan dakwaan telah disemak berbanding dengan sumber yang diterbitkan yang disenaraikan di bawah.