Salah satu tujuan utama yang ingin dicapai oleh proyek berbasis blockchain adalah verifikasi data. Untuk contoh langsung, Anda dapat melihat identitas digital dan penyimpanan dan cek dokumen online. Memang, salah satu dari kasus ini memerlukan verifikasi pemrakarsa tindakan/transaksi untuk mengonfirmasi orang atau entitas tersebut. Misalnya, jika orang tersebut memiliki dokumen identitas berbentuk digital, menjadi penting untuk memastikan kepemilikannya. Jadi ini adalah contoh yang sangat baik dari masalah verifikasi data. Mari kita tinjau bentuk paling sederhana dari solusi โ tanda tangan digital, yang pengujiannya merupakan salah satu poin penting selama pengembangan kontrak pintar.
Pendekatannya sederhana:
1) sistem menghasilkan pesan dengan aturan yang diketahui semua orang
2) penandatangan mendapatkan pesan dan menambahkan serangkaian simbol tertentu โ tanda tangan digital, kode yang dibuat dari pesan dengan kunci pribadi
3) tanda tangan yang dihasilkan sekarang dikirim ke kontrak, di mana tanda tangan tersebut didekomposisi untuk mengambil alamat penanda tangan.
Solidity menawarkan algoritma ECDSA untuk pembuatan tanda tangan dan dekomposisi lebih lanjut. Kami tidak perlu menyelam jauh ke dalam algoritme itu sendiri (Anda dapat menemukan informasi yang diperlukan dalam sumber yang sesuai). Yang perlu kita ketahui adalah bahwa ECDSA adalah contoh kriptografi asimetris, di mana pengguna pertama membuat tanda tangan dengan kunci pribadi mereka, dan pengguna kedua menerapkan algoritme standar untuk mengambil kunci publik penandatangan. Dengan demikian, dapat memverifikasi sumber tanda tangan. Sebagai gantinya, mari fokus pada bagian praktis โ penggunaan dan pengujian tanda tangan.
Pertama-tama, kita perlu mengenali masalah. Misalnya, kontrak perlu melakukan beberapa tindakan, katakanlah, menyimpan alamat pemanggil. Meskipun kontrak harus melakukan penyimpanan hanya jika penelepon diverifikasi, kami perlu memastikan bahwa tidak ada yang dapat menggunakan alamat mereka tanpa izin. Untuk mengambil pemanggil asli, kita perlu membuat beberapa pesan, menandatanganinya, dan menguraikannya dalam kontrak.
Anda dapat menemukan solusi standar dalam dokumentasi Solidity (sebagai contoh, di 0.8.4 โ versi stabil terbaru pada saat artikel). Dokumen menawarkan kepada kami kontrak, yang memerlukan fungsionalitas bawaan berikut: pembuatan pesan, pemisahan tanda tangan, dan kode perakitan untuk mengambil penanda tangan. Contoh menunjukkan semua metode yang diperlukan dan cukup mudah, meskipun memiliki dua kontra: tidak memiliki universalitas, dan tidak ada contoh pengujian solusi yang baik. Itu sebabnya saya memberikan versi kode saya dan (tujuan sebenarnya) โ strategi pengujian kontrak.
Tentu, Anda dapat menggunakan perpustakaan OpenZeppelin standar untuk operasi ECDSA, tetapi Anda akan menghadapi masalah yang sama lagi โ kurangnya fleksibilitas dan pendekatan pengujian. Jadi, mari selami contoh logika berbasis tanda tangan saya. Anda dapat menemukan yang lengkap contoh kerja di GitHub saya, tetapi ada beberapa tempat yang ingin saya tampilkan sepenuhnya.
Pertama-tama, kami akan menyiapkan pesan. Seperti yang Anda lihat, itu terbentuk dari dua alamat dompet yang dikemas dan di-hash:
Bagian penting kedua dari kode adalah hashing pesan bersama dengan pesan Ethereum standar:
Ini menunjukkan bahwa pesan dikirim dalam jaringan Ethereum dan memiliki panjang 32-byte, yang bukan angka acak. Setelah operasi sebelumnya, kami memiliki hash, yang memiliki panjang 32-byte. Penting untuk memiliki fungsi hashing tambahan dalam bentuk seperti itu, dan kami akan membahas alasannya nanti.
Potongan kode lainnya cukup standar. Fungsi untuk membagi tanda tangan adalah sebagai berikut:
dan inilah fungsi untuk mengambil penandatangan:
Untuk antarmuka eksternal, kami akan menggunakan fungsi kustom, yang menerima tanda tangan dan argumen yang diperlukan, memeriksa apakah pengguna sudah terdaftar, membentuk pesan, dan memverifikasi tanda tangan:
Pertama, kita akan meniru pesan yang perlu ditandatangani. Kami akan menggunakan eters.js perpustakaan, yaitu (bersama dengan web3) perpustakaan yang paling banyak digunakan dan nyaman. Karena ini adalah perpustakaan sumber terbuka, Anda bebas menjelajah kode dan dokumennya. Selain itu, perpustakaan ini memberi kita antarmuka yang sempurna untuk membuat pesan berikut:
Salah satu kontra dari keduanya web3 dan eter perpustakaan adalah bahwa mereka tidak memiliki semua fungsi untuk lingkungan Ganache lokal karena kedua perpustakaan ditujukan untuk bekerja dengan node Ethererum penuh. Namun demikian, ada pendekatan untuk pengujian lokal menggunakan fungsionalitas akun web3. Meskipun Anda perlu membuat akun tambahan, yang akan menerapkan fungsi penyanyi dan menyediakan koneksi ke penyedia web3 saat ini:
Jadi, sekarang kita memiliki pesan yang dihasilkan dan ditandatangani. Tapi, itu bukan segalanya; ada beberapa hal yang tersisa untuk dibicarakan. Kedua perpustakaan (web3 dan eter) di bawah tenda menyediakan hashing tambahan dari pesan sebelum pembuatan tanda tangan. Juga, pesannya tidak hanya di-hash tetapi digabungkan dengan pesan Ethereum standar yang kita lihat sebelumnya:
Dan itulah mengapa kami menambahkan metode tambahan ke kontrak. Jadi, jika Anda ingin menggunakan pesan khusus, melewatkan hashing tambahan, dll., Anda perlu membuat versi khusus dari fungsi penandatanganan. Kami telah membahas alasan di atas โ kedua pustaka standar menerapkan pendekatan tipikal untuk menandatangani pesan, yang hanya dapat diubah dengan mengesampingkan fungsionalitasnya.
Sebagai langkah terakhir, mari kita jalankan tes dan periksa untuk melihat apakah itu berfungsi dengan benar:
Kami telah menguji pembuatan tanda tangan, pesan yang dihasilkan, persetujuan tanda tangan, dan penolakan. Jadi ini adalah serangkaian tes yang cukup lengkap untuk fungsi verifikasi.
- Akun
- Tindakan
- Tambahan
- algoritma
- Semua
- argumen
- artikel
- Asli
- Bit
- kasus
- Cek
- kode
- kontrak
- kriptografi
- terbaru
- data
- Pengembangan
- digital
- identitas digital
- dokumen
- Lingkungan Hidup
- ethereum
- jaringan ethereum
- Menghadapi
- Pertama
- keluwesan
- Fokus
- bentuk
- Gratis
- penuh
- fungsi
- baik
- hash
- hashing
- HTTPS
- ia
- identitas
- informasi
- IP
- IT
- kunci
- Terbaru
- Perpustakaan
- lokal
- medium
- jaringan
- node
- menawarkan
- Penawaran
- secara online
- Buka
- open source
- Operasi
- swasta
- Key pribadi
- memprojeksikan
- publik
- Key publik
- ulasan
- Run
- set
- Sederhana
- So
- soliditas
- membagi
- penyimpanan
- menyimpan
- Penyelarasan
- sistem
- uji
- pengujian
- tes
- Sumber
- us
- Verifikasi
- dompet
- Wikipedia
- dalam
- Kerja
- bekerja