Tutorial Fabric Hyperledger: Panduan Lengkap-Bagian 2
Seri tutorial berikut terdiri dari tiga artikel yang akan mengajarkan Anda berbagai aspek tentang pengembangan chaincodeHyperledger Fabric mulai dari operasi CRUD, perlindungan data, dan pengujian chaincode.
Ikhtisar seri:
- Pasal 1: Pengembangan kode rantai dasar dan menyimpan data pribadi dalam koleksi
- Artikel 2: Permintaan chaincode tingkat lanjut dan GUI CouchDB
- Artikel 3: Tutorial untuk menguji rantai kode Anda dengan MockStub
Persyaratan
- RAM 4GB (lebih disukai)
- Docker, Docker-Compose, Editor kode (mis. Visual Studio Code), Git
- NodeJS versi 8.9+ (Lebih disukai 8.9.4 – Kiat: ubah versi Anda dengan pengelola versi seperti ‘ n ‘)
- Pengetahuan dasar JavaScript
Tujuan
- Pelajari tentang CouchDB dan bahasa kuerinya
- Pelajari bahasa permintaan Mangga.
- Buat kueri chaincode tingkat lanjut, ujilah melalui GUI CouchDB dan terapkan di chaincode Anda.
pengantar
Pada artikel pertama, kami belajar untuk membuat fungsi chaincode dasar yang mampu melakukan operasi CRUD ke buku besar menggunakan pelat sumber terbuka yang disediakan oleh TheLedger.
Dalam tutorial kedua ini, kami akan fokus pada pembuatan kueri chaincode tingkat lanjut, juga disebut sebagai kueri kaya, yang memungkinkan kami membuat kueri yang lebih kompleks daripada hanya mencari kunci tertentu.
Memulai
Pastikan Anda memiliki salinan kode yang dapat ditemukan diGithub michielmulders / hyperledger-fabric-blockgeeks .Disarankan untuk menggunakan git clonehttps://github.com/michielmulders/hyperledger-fabric-blockgeeks.git untuk membuat klon lokal repositori di mesin Anda dan checkout bagian kedua tutorial dengan git checkout tutorial-2
Selanjutnya, mulai jaringan dengan ./scripts/startFabric.sh , jika Anda baru mengenal tutorial ini, pastikan untuk memeriksa bagian ‘Konfigurasi Boilerplate’ di artikel pertama untuk bangkit dan berjalan.
Setelah jaringan Fabric Hyperledger Anda mulai, buka tautan ini (http: // localhost: 5984 / _utils / # / _ all_dbs ) di browser Anda yang akan menampilkan GUI CouchDB.
Tentang CouchDB
Sebenarnya, Hyperledger Fabric mendukung kedua LevelDB sebagai CouchDB untuk berfungsi sebagai basis data keadaan, memegang status terbaru dari setiap objek. LevelDB adalah database status kunci nilai default yang tertanam di setiap peer.CouchDB adalah basis data keadaan eksternal alternatif opsional.Seperti toko nilai kunci LevelDB, CouchDB dapat menyimpan data biner apa pun yang dimodelkan dalam chaincode. Namun, CouchDB adalah pilihan yang lebih baik karena mendukung penyimpanan dokumen JSON yang memungkinkan kueri kaya terhadap data chaincode sedangkan LevelDB hanya mendukung kueri terhadap kunci.
Menurut dokumentasi Hyperledger Fabric,
” CouchDB berjalan sebagai proses basis data terpisah bersama rekan, oleh karena itu ada pertimbangan tambahan dalam hal pengaturan, manajemen, operasi, dan terutama keamanan .”
Jadi, LevelDB menawarkan fungsionalitas yang lebih sedikit, namun, itu dikonfigurasikan dengan benar sedangkan CouchDB membutuhkan beberapa konfigurasi tambahan seperti menyediakan pengguna admin database dan kata sandi atau memberikan alamat CouchDB untuk rekan kerja untuk mengetahui ke mana harus mencari kondisi saat ini.
Boilerplate yang kami gunakan berisi konfigurasi dengan CouchDB disertakan. Mari buat kueri kaya pertama kami.
GUI CouchDB
Ketika Anda telah membuka GUI yang dapat Anda temukan dihttp: // localhost: 5984 / _utils / # / _ all_dbs , Anda akan melihat antarmuka berikut.
Mari kita buka database mychannel_fabcar (nama saluran dikombinasikan dengan nama chaincode) dan menjelajahi objek mobil di dalamnya.
Selanjutnya, buka tautan ‘Jalankan Kueri dengan Mangga’ untuk menjalankan kueri pertama kami. Mari kita mulai dengan permintaan sederhana untuk menemukan semua objek Mobil. Kita dapat mencapai ini dengan mencari ‘mobil’ docType.
Operator Permintaan Mangga
1. Operator Lapangan
Operator ‘bidang’ memungkinkan Anda untuk hanya mengembalikan bidang tertentu. Mari kita ambil kueri dari contoh sebelumnya dan hanya mengembalikan warna setiap objek mobil.
{ "selector" : { "docType" : "car" }, "bidang" : [ "warna" ] }
2. Di Operator
Operator $ in memungkinkan Anda untuk mencari nilai tertentu dalam suatu bidang. Ini memungkinkan Anda untuk melewatkan sejumlah nilai yang mungkin ingin Anda cocokkan. Mari kita ambil pertanyaan sebelumnya dan hanya mengembalikan mobil ungu dan ungu.
{ "selector" : { "docType" : "car" , "color" : { "$ in" : [ "violet" , "ungu" ] } }, "bidang" : [ "warna" ] }
PANDUAN TERKAIT
Apa itu Tokenomics? Panduan Investor Utama -Bagian 15 Bahasa Pemrograman Paling MudahTutorial Blockchain | Jadi, ini adalah Blockchain-Entwickler
Kueri akan mengembalikan tiga objek mobil, satu warna ‘ungu’ dan dua warna ‘ungu’.
3. Batasi dan Lewati Operator
Ok, katakanlah misalnya kita ingin melewatkan hasil pertama dan membatasi hasil untuk dua mobil sehingga kita hanya memiliki dua mobil violet dari contoh sebelumnya. Operator batas memungkinkan Anda membatasi jumlah objek yang dikembalikan sedangkan operator skip mampu menggerakkan kursor pemilih.
< div style = "latar belakang: #ffffff; overflow: otomatis; lebar: otomatis; batas: abu-abu solid; lebar-batas: .1em .1em .1em .8em; bantalan: .2em .6em;" > < pre style = "margin: 0; tinggi-line: 125%" > { < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "warna-latar: # fff0f0" > & quot; pemilih & quot; </ span > : { < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "warna-latar: # fff0f0" > & quot; docType & quot; </ span > : < span style = "background-color: # fff0f0" > & quot; mobil & quot; </ span > , < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "background-color: # fff0f0" > & quot; warna & quot; </ span > : { < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "background-color: # fff0f0" > & quot; $ in & quot; </ span > : [ < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "warna-latar: # fff0f0" > & quot; violet & quot; </ span > , < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "background-color: # fff0f0" > & quot; ungu & quot; </ span > < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > ] < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > } < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > }, < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "background-color: # fff0f0" > & quot; bidang & quot; bidang & quot; </ span > : [ < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "background-color: # fff0f0" > & quot; warna & quot; </ span > < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > ], < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "background-color: # fff0f0" > & quot; batas & quot; </ span > : < span style = "color: # 0000DD; font-weight: bold" > 2 </ span > , < span style = "color: # FF0000; background-color: #FFAAAA" > </ span > < span style = "warna-latar: # fff0f0" > & quot; lewati & quot; </ span > : < span style = "color: # 0000DD; font-weight: bold" > 1 </ span > } </ pre > </ div >
4. Operator Regex
Seperti judulnya, dimungkinkan untuk meneruskan regex sebagai permintaan Mangga. Catatan kecil, tidak disarankan untuk mengeluarkan ekspresi regex yang kompleks (seperti ekspresi tersarang) karena memerlukan terlalu banyak daya komputasi.
Untuk contoh ini, kami hanya ingin mencocokkan model mobil yang mengandung setidaknya satu huruf. Ini harus menghilangkan CAR5 dari hasil karena modelnya ‘205’. Mari lihat.
{ "selector" : { "model" : { "$ regex" : "[AZ] +" } } }
5. Subdokumen Permintaan
Bahkan mungkin untuk meminta sub dokumen. Bayangkan sebuah objek mobil yang dimodifikasi di mana bidang pemilik berisi objek yang terdiri dari properti pengguna.
{ " Model " , " DocType " , ... , “ Pemilik ” : { " Nama " , " Usia " , " Alamat " } }
Mangga cukup fleksibel mengenai sub dokumen seperti yang ditunjukkan di bawah ini – kueri mencari pengguna yang berusia 18 tahun.
{ "selector" : { "owner.age" : 18 } }
6. Operator Lainnya
Banyak operator lain yang ada:
- “$ Gt”: Bidang harus lebih besar dari nilai X.
- “$ Lt”: Field harus lebih rendah dari nilai X.
- “$ Eq”: Bidang harus sama dengan nilai X.
- “$ Or”: Nilai harus dalam susunan nilai pencarian.
- “$ Not”: Field mungkin tidak cocok dengan nilai X.
Implementasi penuh dari operator kueri dapat ditemukan di sini .
Kueri Chaincode Rich
Sekarang, kami telah belajar menulis kueri lebih lanjut, mari gunakan pengetahuan baru ini dalam kode rantai kami untuk mengambil data. Kami akan menggunakan fungsigetQueryResultAsList dari stubHelper yang menerima pemilih dan mengembalikan data yang diperlukan.
Sekali lagi, mari kueri untuk semua objek mobil di basis data kami menggunakan kueri yang kaya. Fungsi getQueryResultAsList menerima objek yang berisi kueri.
async queryAllCars (stubHelper: StubHelper, args: string []): Janji < any > { kembali menunggu stubHelper . getQueryResultAsList ({ pemilih: { docType: 'mobil' } }); }
Mari restart jaringan menggunakan ./scripts/startFabric.sh dan jalankan perintah docker exec yang menjalankan fungsiqueryAllCars di chaincode kami.
docker exec cli peer kueri chaincode -C mychannel -n fabcar -c ‘{“function”: “queryAllCars”, “Args”: [“”]}’
Docker akan mengembalikan kita array yang penuh dengan objek mobil. Seperti yang Anda lihat, tidaklah sulit untuk membuat kueri yang kaya dalam chaincode.
Apa yang kami pelajari?
Bahasa permintaan Mangga menawarkan banyak operator kueri yang dapat kita gunakan untuk membuat kueri yang lebih kompleks untuk menemukan data di jaringan blockchain kami.Bahkan mungkin menggunakan regex untuk memfilter data, namun, batasi penggunaan hanya untuk permintaan regex dasar karena alasan kinerja. Selain itu, tidak sulit untuk mengimplementasikan kueri kaya ini ke dalam chaincode karena StubHelper melakukan semua kerja keras.
Lembar Kode Kode
- Permintaan Mangga dimulai dengan pemilih yang menargetkan bidang yang kami panggil satu atau lebih operator.
pemilih: { bidang: { "$ Operator " : ... } }
- Itu stubHelper.getQueryResultAsList fungsi mengirimkan kueri ke jaringan Hyperledger Fabric kami dan mengembalikan array hasil.