Rumah >Peranti teknologi >industri IT >Solidity Pitfalls: Generasi Nombor Rawak untuk Ethereum
Artikel ini ditaja dan dicipta oleh Iolite. Terima kasih kerana menyokong rakan kongsi yang membuat SitePoint mungkin.
Solidity adalah bahasa yang agak baru yang mengandungi isu yang berkaitan dengan kod dan penggunaannya yang dimaksudkan kerana tidak ada kod yang sempurna. Artikel ini akan membimbing anda amalan terbaik dan perangkap apabila menggunakan nombor rawak sebagai input kepada kontrak pintar Ethereum.
mata utama
block.timestamp
, pelombong boleh memanipulasi nilai -nilai ini. block.difficulty
Generasi Nombor Rawak Solidity
Kekecohan tidak dapat membuat nombor rawak. Malah, semua algoritma yang membuat nombor rawak adalah bahasa pseudo-rawak-tidak boleh membuat nombor rawak sepenuhnya. Masalah dengan kepantasan ialah algoritma kompleks terlalu mahal dan oleh itu penyelesaian yang lebih asas digunakan. Selain itu, kod Solidity harus ditentukan, kerana ia akan berjalan pada pelbagai nod. Kami memerlukan algoritma yang boleh menghasilkan nombor rawak sekaligus dan menggunakannya pada pelbagai nod. Maklumat seperti masa jam tidak tersedia untuk menjana nombor rawak, jadi kita perlu mencari pilihan lain. Sebagai pemaju, anda harus menyedari masalah ini kerana penyerang dapat meramalkan hasil dalam situasi tertentu.Salah satu algoritma yang paling biasa digunakan ialah "Generator Congruence Linear" (LCG). Ia adalah salah satu algoritma tertua, pantas dan mudah difahami. LCG adalah pilihan yang baik untuk sistem tertanam kerana mereka hanya mempunyai ingatan terhad. Walau bagaimanapun, ia tidak berfungsi dengan aplikasi keselamatan kata laluan. Walau bagaimanapun, ia masih digunakan dalam kontrak pintar, kerana algoritma cepat lebih murah dari segi kos gas.
Algoritma itu sendiri melakukan langkah -langkah berikut:
block.timestamp
& block.difficulty
Apabila pelombong mengesahkan transaksi, block.timestamp
diberikan. Tiada pemain di kontrak loteri kami dapat mengawalnya. Mari kita lihat kod ini yang digunakan untuk membuat nombor rawak.
<code class="language-solidity">function random() private view returns (uint8) { return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251); }</code>
Cari gist di sini.
Kod ini pertama hash timestamp blok dan kesukaran. Seterusnya, kami menukar nilai hash ke integer dan membahagikannya dengan 251 untuk mendapatkan integer antara 0 dan 250. Walau bagaimanapun, masalah dengan kod ini ialah kita tidak boleh mempercayai pelombong untuk memilih pemenang.
Kami memerlukan lebih banyak data sewenang -wenang untuk memilih pemenang kami. Kami boleh menggunakan alamat pemain yang telah memasuki kontrak pintar loteri kami, tetapi kami perlu menyembunyikannya kerana mereka mungkin menyalahgunakannya. Oleh kerana semua maklumat dicatatkan pada blockchain, maklumat ini tidak dapat disembunyikan.
Nombor yang boleh dikemukakan kepada kontrak pintar loteri kami. Pengguna mesti mempunyai nombor hashing yang mereka pilih dengan alamat Ethereum mereka. Ini memberi kita nombor yang cukup rawak.
Dengan yang dikatakan, rawak adalah mungkin, tetapi anda hanya perlu menggunakan oracle untuk mendapatkan nombor rawak dari luar blockchain. Masalah dengan menggunakan data luaran adalah sangat sukar untuk membuktikan bahawa nombor itu sebenarnya rawak dan untuk memastikan bahawa entiti rantaian tidak memanipulasi nombor rawak dalam apa cara sekalipun. Di sinilah Chainlink VRF bermain. ChainLink VRF (Fungsi Rawak Disahkan) adalah bagaimana kita mendapat nombor rawak terbukti dalam kepantasan.
Chainlink VRF menambah peristiwa ke blockchain yang mana nod ChainLink membaca acara dan mengembalikan nombor rawak. Pemeriksaan rawak di rantaian dilakukan melalui penyelaras VRF yang dipanggil. Ini menggunakan hash kunci tertentu dari oracle dan frasa benih dari pengguna, serta beberapa kriptografi untuk memastikan nombor itu adalah nombor rawak yang benar. Dengan cara ini, kita boleh mendapatkan nombor rawak yang tidak berat sebelah.
pemaju perlu mempertimbangkan bila memilih pemenang. Maklumat seperti masa jam tidak tersedia dalam mesin maya Ethereum, kerana kod akan berjalan pada masa yang berlainan pada pelbagai nod. Ini menjadikannya lebih sukar untuk memilih pemenang. Salah satu cara adalah untuk melaksanakan fungsi dalam kontrak pintar anda yang akan mematikan loteri dan memilih pemenang. Ini tidak seperti yang terdesentralisasi seperti yang kita harapkan. Pemilik kontrak boleh menutup loteri apabila ditentukan bahawa rakan mereka akan menang. Kita mesti mengelakkan penipuan seperti ini.
Pilihan yang lebih baik ialah menggunakan jam penggera Ethereum. Ia adalah perkhidmatan yang membolehkan urus niaga penjadualan dilaksanakan kemudian di blok Ethereum. Perkhidmatan ini tidak boleh dipercayai, yang bermaksud keseluruhan perkhidmatan berjalan sebagai kontrak pintar. Pada asasnya, penggera Ethereum menggunakan nombor blok untuk menjadualkan urus niaga. Perhatikan bahawa ini tidak bermakna bahawa kontrak akan bermula dengan sendirinya. Ia bergantung kepada minat pengguna untuk memanggil fungsi "Pilih Pemenang" (Ether Ganjaran). Sudah tentu, jika tiada siapa yang memanggil fungsi anda, loteri anda akan gagal.
random.org menyediakan API yang menyediakan sumber data rawak melalui JSON. Kontrak pintar Ethereum boleh menggunakan sumber data ini untuk memberi makan algoritma untuk memilih nombor rawak. Kerana keselamatan adalah penting, tandatangan digital boleh digunakan. Data rawak akan ditandatangani oleh random.org. Anda boleh mengesahkan integriti data supaya anda dapat membuktikan bahawa ia memang dari random.org dan data itu belum diganggu.
Randao adalah projek baru dalam bidang blockchain, memberi tumpuan sepenuhnya kepada menyediakan nombor rawak. Mereka menggunakan gabungan orakel dan kontrak pintar untuk memberi anda nombor rawak. Walau bagaimanapun, perkhidmatan Randao kini sangat perlahan. Jika anda mempunyai aplikasi yang sering anda gunakan, ini tidak sesuai.
Anda juga boleh menggunakan monitor dalam kod anda yang memeriksa nombor blok sehingga ia sepadan dengan nombor sasaran yang anda tetapkan.
<code class="language-solidity">function random() private view returns (uint8) { return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251); }</code>
Sumber. GIST .
iolite mencipta produk yang menerima bahasa semulajadi untuk membuat kontrak pintar. Ia menggunakan enjin Pemprosesan Bahasa Natural Stanford (NLP), yang dipanggil enjin penyesuaian cepat (FAE). Iolite bergantung kepada pakar kebocoran untuk latihan komuniti. Pakar Solidity (penyumbang) boleh menentukan struktur yang mengandungi satu atau lebih ayat dan memasukkannya ke kod kontrak pintar yang sepadan.
Enjin Stanford NLP direka untuk memahami bahasa yang kompleks. Kerumitan bahasa bergantung kepada jumlah latihan mesin. Selepas latihan yang betul, enjin akan dapat mewujudkan kontrak pintar yang kompleks. FAE dapat membuat kontrak sedemikian kerana kontrak kompleks sebenarnya tidak rumit. Pakar boleh memecah permintaan ke dalam beberapa coretan kod yang lebih kecil dan memasukkannya ke ayat.
Apabila seseorang memasuki pelbagai ayat, ia akan mencari struktur/ayat yang sepadan untuk membina kontrak "kompleks". Penyumbang akan menerima ganjaran token iolit melalui proses perlombongan struktur baru.
Kelebihan menggunakan iolit ialah pakar kontrak pintar dapat menyelesaikan masalah seperti penjanaan nombor rawak untuk anda. Anda boleh mendapatkan lebih banyak maklumat di iolite.io.
Kesimpulan
seperti yang anda lihat, menghasilkan input rawak yang benar tidak mudah. Jangan bergantung pada block.timestamp
, now
dan block.blockhash
sebagai sumber rawak. Penyelesaian yang baik termasuk menggabungkan beberapa input data pseudo-rawak dan menggunakan orakes atau kontrak pintar untuk menjadikannya lebih dipercayai. Anda perlu 100% pasti tiada siapa yang boleh merosakkan data yang dimasukkan ke dalam kontrak pintar.
sila berhati -hati dan berfikir dua kali sebelum melaksanakan logik penjanaan nombor rawak.
FAQ untuk penjanaan nombor rawak dalam Solidity (FAQ)
Solidity (bahasa pengaturcaraan yang digunakan untuk menulis kontrak pintar Ethereum) tidak mempunyai fungsi terbina dalam untuk menjana nombor rawak. Ini kerana blockchain (teknologi asas Ethereum) pada dasarnya adalah deterministik. Ini bermakna bahawa diberikan satu set input, output akan sentiasa sama. Kepastian ini adalah penting untuk mengekalkan integriti dan keselamatan blok block. Walau bagaimanapun, ia menjadikan nombor rawak yang benar sebagai cabaran, kerana konsep rawak sememangnya nondeterministik.
Pemaju menggunakan beberapa kaedah untuk menjana nombor pseudo-rawak dalam kepantasan. Kaedah yang sama adalah menggunakan fungsi hash KECCAK256, yang inputnya sukar untuk diramalkan, seperti timestamp blok semasa dan kesukaran blok. Pendekatan lain ialah menggunakan perkhidmatan Oracle yang menyediakan nombor rawak dari sumber luar. Walau bagaimanapun, setiap pendekatan mempunyai batasan sendiri dan risiko keselamatan yang berpotensi.
Walaupun fungsi hash KECCAK256 boleh digunakan untuk menghasilkan nombor pseudo-rawak, ia menimbulkan beberapa risiko keselamatan yang berpotensi. Oleh kerana input ke fungsi hash seperti cap waktu blok semasa dan kesukaran blok tersedia secara terbuka di blockchain, pelombong berniat jahat boleh memanipulasi nilai -nilai ini untuk mempengaruhi output yang dihasilkan oleh nombor rawak.
Perkhidmatan asal boleh memberikan nombor rawak dari sumber luar rantaian. Perkhidmatan ini bertindak sebagai jambatan antara blockchain dan dunia luar, yang membolehkan kontrak pintar berinteraksi dengan data yang tidak tersedia untuk blockchain itu sendiri. Walau bagaimanapun, menggunakan Perkhidmatan Oracle memperkenalkan tahap kepercayaan, kerana kontrak pintar mesti bergantung pada orak untuk memberikan nombor rawak yang tepat dan tidak berat sebelah.
Skim-skim penataan komitmen adalah cara untuk menjana nombor rawak dalam cara yang terdesentralisasi dan selamat. Dalam skim komitmen yang dikembangkan, para peserta pertama kali melakukan nombor rahsia, dan kemudian semua nombor rahsia diturunkan pada masa yang sama, dan nombor rawak dijana berdasarkan rahsia ini. Pendekatan ini menghalang mana -mana peserta tunggal daripada dapat mempengaruhi output yang dihasilkan oleh nombor rawak.
Nombor rawak sebenar adalah penting untuk pelbagai jenis kontrak pintar, seperti yang digunakan untuk permainan peluang, loteri, dan aplikasi lain yang memerlukan rawak. Jika nombor rawak yang digunakan dalam kontrak ini boleh diramalkan atau terjejas, ia boleh menyebabkan hasil yang tidak adil dan bahkan membenarkan pelakon jahat mengeksploitasi kontrak.
Fungsi blockhash dalam kepantasan boleh digunakan untuk menjana nombor pseudo-rawak. Fungsi ini mengembalikan nilai hash nombor blok yang diberikan, yang tidak dapat diramalkan dan berbeza dengan setiap blok. Walau bagaimanapun, kaedah ini mempunyai batasannya. Sebagai contoh, fungsi blockhash hanya berfungsi pada 256 blok terkini, dan blockhash blok masa depan tidak dapat diketahui sebelum perlombongan.
Terdapat batasan utama untuk menggunakan cap waktu blok semasa sebagai input untuk menghasilkan nombor rawak. Pelombong mempunyai pengaruh pada cap waktu blok yang mereka lombong, yang bermaksud mereka boleh memanipulasi cap waktu untuk mempengaruhi output yang dihasilkan oleh nombor rawak.
Randao (nombor rawak DAO) Beacon adalah cara yang terdesentralisasi dan telus untuk menghasilkan nombor rawak. Peserta di Randao Beacon menjanjikan nombor rahsia, yang kemudiannya diturunkan dan digabungkan untuk menghasilkan nombor rawak. Pendekatan ini direka untuk menghalang mana -mana peserta tunggal daripada dapat mempengaruhi output yang dihasilkan oleh nombor rawak.
Penyelidikan dan cadangan untuk meningkatkan penjanaan nombor rawak dalam solidity dan platform blockchain lain sedang dijalankan. Sebagai contoh, Ethereum 2.0 (peningkatan yang akan datang ke rangkaian Ethereum) dijangka termasuk penjana nombor rawak terbina dalam. Walau bagaimanapun, sebelum penambahbaikan ini dilaksanakan, pemaju mesti terus menggunakan pendekatan sedia ada dan batasan yang wujud dan risiko keselamatan yang berpotensi.
Atas ialah kandungan terperinci Solidity Pitfalls: Generasi Nombor Rawak untuk Ethereum. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!