Tutorial Fabric Hyperledger: Panduan Lengkap-Bagian 1
Seri tutorial kain Hyperledger berikut terdiri dari tiga artikel yang akan mengajarkan Anda berbagai aspek tentang pengembangan rantai kodeHyperledger Fabric mulai dari operasi CRUD, perlindungan data, dan pengujian chaincode.
Oleh Michiel Mulders
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 – ubah versi Anda dengan pengelola versi seperti ‘ n ‘)
- Pengetahuan dasar JavaScript
Tujuan
- Buat fungsi chaincode dasar seperti membaca dan menambahkan data ke buku besar.
- Validasi fungsionalitas yang dibuat melalui perintah Docker exec.
- Konfigurasikan pengumpulan data pribadi.
- Tambahkan data ke koleksi data pribadi dan ambil objek teragregasi dari buku besar.
Pendahuluan: Tutorial fabric Hyperledger
Pada artikel pertama ini, kita akan terbiasa dengan boilerplate FabricHyperledger untuk NodeJS chaincode yang akan kita gunakan sepanjang seri tutorial ini. Boilerplate dikembangkan oleh perusahaan konsultan blockchain Belgia bernama TheLedger.be , terima kasih banyak karena telah membuka sumber boilerplate ini.
Mengapa kami menggunakan boilerplate ini? Itu membuat hidup Anda lebih mudah! Misalnya, boilerplate akan secara otomatis membungkus dan membuat cerita bersambung dengan responsshim.success () danshim.error (). Anda cukup mengembalikan objek javascript dan sisanya akan dilakukan.
Dalam tutorial ini, kami akan fokus pada pengembangan operasi CRUD dasar dengan dan tanpa koleksi data pribadi, yang akan kami uji sesudahnya. Selain itu, kami akan memberikan pengantar singkat tentang cara kerja koleksi pribadi.
Dapatkan Kode
Kode ini dapat ditemukan di michielmulders / hyperledger-fabric-blockgeeks Github . Dianjurkan untuk digunakan
git clone https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git
untuk membuat klon lokal repositori di komputer Anda dan lihat bagian pertama tutorial dengan git checkout tutorial-1
Pengaturan Boilerplate
Ok, jadi Hyperledger Fabric tidak akan memulai dengan tiba-tiba … Pertama, kita perlu menarik gambar Docker yang diperlukan yang diperlukan untuk Fabric untuk membuat wadah yang diperlukan (Otoritas Sertifikat, Pemesan, Peer, Layanan Keanggotaan).
Folder skrip berisi skrip yang disebut bootstrap.shyang secara default akan menarik versi 1.2.0 dari Hyperledger Fabric yang mendukung fungsionalitas koleksi pribadi yang akan kita gunakan nanti. Pastikan Anda memiliki ruang yang cukup pada disk Anda dan koneksi internet yang tepat karena ukuran gambar lebih besar dari 1GB. Jalankan skrip seperti ini./scripts/bootstrap.sh
Ketika kami telah mengunduh semua gambar yang diperlukan, kami dapat bergerak lebih jauh untuk menguji pelat tungku kami dengan memastikannya dimulai tanpa kesalahan. Mari kita jalankan skrip startFabric.sh dengan./scripts/startFabric.sh
Penyelesaian yang berhasil – jaringan Hyperledger Fabric yang sedang berjalan – harus mengembalikan status 200.
Kiat : Jika Anda tidak dapat menjalankan skrip Bash (.sh), cobalah untuk memberikannya hak yang dapat dieksekusi dengan:
chmod + x bootstrap.sh
Tentang Koleksi Pribadi
Hyperledger Fabric telah mengembangkan konsep SideDBs yang berisi data pribadi, hanya terlihat untuk node yang memiliki SideDB. Pada dasarnya, ini adalah informasi yang belum dibagikan secara publik di antara jaringan pribadi. Baru-baru ini, Hyperledger telah mengganti nama ini sebagai koleksi pribadi yang mereka anggap sebagai solusi “GDPR compliant” bawaan.
Sebelumnya, kerahasiaan dibuat di jaringan Hyperledger melalui penggunaan saluran. Contoh paling umum adalah negosiasi tentang harga per kilo untuk ikan tertentu. Fisher A ingin menawarkan harga khusus untuk Restoran A karena mereka adalah teman dekat, namun, Fisher A tidak ingin Restoran B melihat kesepakatan yang lebih murah ini dengan Restoran A. Untuk menciptakan komunikasi yang aman, dua saluran dibuat dari Fisher A ke Restoran A dan dari Fisher A ke Restaurant B.
Namun, proses membuat saluran dapat menjadi cukup kompleks dalam situasi fintech di mana kami berbicara tentang ribuan klien, masing-masing memiliki banyak saluran. Itulah alasan mengapa Hyperledger Fabric mencegah penggunaan saluran yang berlebihan karena ini memperlambat jaringan secara drastis, sehingga berdampak pada kinerja.
Jonas Snellinckx dari TheLedger menjelaskan bagaimana data pribadi dapat dikelola dengan lebih baik di dalam jaringan Hyperledger,
“ Data pribadi memungkinkan Anda untuk membuat koleksi data menggunakan kebijakan untuk menentukan pihak mana dalam saluran yang dapat mengakses data. Akses ini hanya dapat dikelola dengan menambahkan kebijakan ke koleksi. Hal ini memungkinkan beberapa data untuk publik dan beberapa bersifat pribadi untuk beberapa pihak. “
Gambar 1: Dari slidedeck “Privacy Enabled Ledger” https://jira.hyperledger.org/browse/FAB-1151
Untuk tutorial ini, kami mendefinisikan mobil yang akan disimpan di dalam jaringan Fabric. Data tentang pemilik bersifat pribadi, sehingga akan ditambahkan ke koleksi pribadi. Mari kode!
Kode Rantai Kain Hyperledger
Mari kita lihat pada kode rantai saat ini yang dapat Anda temukan dichaincode / node / src / MyChaincode.ts. File berisi satu fungsi,initLedger digunakan untuk mengisi awal buku besar dengan beberapa mobil. Objek mobil terdiri dari merek, model, warna, dan pemilik. Saat menambahkan objek mobil ke buku besar, kami memberi mereka semua kunci dan doktype unik sehingga lebih mudah untuk mengambilnya.
for (let i = 0 ; i < mobil . panjang; i ++ ) { mobil const: any = cars [i]; mobil . docType = 'mobil' ; // mobil . key = `CAR $ {i}` ; menunggu stubHelper . putState ( 'CAR' + i, car); ini . logger . info ( 'Ditambahkan <-->' , mobil); }
1. Buat Mobil Baru
Mari kode fungsi yang membuat objek mobil baru di negara dunia Hyperledger. Fungsi menerima larik string, namun, hanya elemen pertama dalam larik yang berisi objek JSON yang dirubah. Kami menggunakan fungsi pembantu untuk dengan mudah memeriksa argumen menggunakan Yup . Selain memeriksa argumen, argumen ini juga dapat menguraikan argumen Anda dari string ke format data yang diperlukan.Yup akan mem-parsing objek JSON yang dirubah sesuai dengan skema yang disediakan yang kita tentukan denganYup.object (). Shape ({my-object}.
async createCar (stubHelper: StubHelper, args: string []) { const diverifikasiArgs = menunggu Pembantu . checkArgs < any > (args [ 0 ], Yup . object () . bentuk({ kunci: Yup . string () . wajib(), buat: Yup . string () . wajib(), model: Yup . string () . wajib(), warna: Yup . string () . wajib(), pemilik: Yup . string () . wajib(), })); ... }
Selanjutnya, kita dapat menggunakan objek berformat ini ( konstantaVerifiedArgs ) untuk membangun objek mobil baru. Jangan lupa untuk menambahkan DOCTYPE . Objek siap sekarang untuk ditambahkan ke buku besar. Mari kita gunakan stubHelper yang berisi semua fungsi untuk berinteraksi dengan status buku besar seperti mengambil, menambah, memperbarui, dan menghapus data.
async createCar (stubHelper: StubHelper, args: string []) { const diverifikasiArgs = menunggu Pembantu . checkArgs < any > (args [ 0 ], Yup . object () . bentuk({ kunci: Yup . string () . wajib(), buat: Yup . string () . wajib(), model: Yup . string () . wajib(), warna: Yup . string () . wajib(), pemilik: Yup . string () . wajib(), })); biarkan mobil = { docType: 'mobil' , buat: VerifiedArgs . membuat, model: VerifiedArgs . model, warna: VerifiedArgs . warna, pemilik: VerifiedArgs . pemilik, kunci: VerifiedArgs . kunci, }; menunggu stubHelper . putState (verifiedArgs . key, mobil); }
Fungsi putState menerima kunci dan objek yang akan disimpan dalam buku besar. Fungsi putState yang kami gunakan di sini adalah fungsi wrapper karena buku besar hanya dapat menyimpan array byte dan bukan objek JSON. The stubHelper melakukan keajaiban bagi kita, pelaksanaan asli dapat ditemukan di ChaincodeStubInterface.PutState .
1.1 Penambahan Validasi Mobil
Kami akan menggunakan Docker untuk menjalankan perintah di dalam wadah peer sebagai peer memegang versi terbaru dari chaincode. Untuk memberikan versi pembaruan ini kepada rekan, mari mulai lagi jaringan Hyperledger Fabric dengan./scripts/startFabric.sh. Mengapa menggunakan skrip ini? Ini dijalankan lebih cepat karena hanya akan mengganti chaincode pada rekan-rekan dan tidak me-restart seluruh jaringan.
Buka terminal dan jalankan perintah berikut: docker exec cli peer chaincode menjalankan -C mychannel -n fabcar -c ‘{“function”: “createCar”, “Args”: [“{\” key \ “: \” CAR100 \ “, \” make \ “: \ ”Peugot \”, \ ”model \”: \ ”307 \”, \ ”color \”: \ ”green \”, \ ”owner \”: \ ”John Doe \”} ”]} ‘
PANDUAN TERKAIT
Apa itu Tokenomics? Panduan Investor Utama -Bagian 15 Bahasa Pemrograman Paling MudahTutorial Blockchain | Jadi, ini adalah Blockchain-Entwickler
Perintah ini akan mengirimkan proposal transaksi baru ke rekan untuk dimasukkan dalam negara dunia buku besar. Kami memanggil fungsi ‘createCar ‘ kami dan kami menambahkan objek JSON yang dirender dengan kunci ‘CAR100’ sebagai parameter pertama dalam array string kami. Kita harus menghindari tanda kutip ganda dari objek JSON untuk meneruskannya ke rantai kode kita.
Perhatikan penggunaan kata kunci yang diminta . Penting untuk mengetahui perbedaan antara pemanggilan dan kueri . Kata kunci aktif digunakan ketika kami mencoba mengubah atau menambahkan data ke buku besar, sedangkan kata kunci kueri hanya digunakan ketika mengambil informasi dari buku besar.
Eksekusi yang berhasil dari perintah Docker harus mengembalikan ‘hasil: status: 200’.
2. Baca Data Dari Buku Besar
Untuk membaca data dari buku besar, kita dapat mencari kunci tertentu.Mari kita cari objek Mobil yang baru dibuat dengan kunci ‘CAR100’. Kami mulai lagi dengan memvalidasi argumen yang kami terima dalam rantai kode kami, kali ini kami hanya menerima kunci.
Selanjutnya, kita menggunakan fungsi getStateAsObject untuk mengambil objek JSON dari buku besar untuk kunci tertentu. Mungkin saja kuncinya tidak ada. Dalam hal ini, kita bisa melempar kesalahan khusus denganNotFoundError yang merupakan bagian dari fabric-chaincode-utils , kami mengimpor di bagian atas file, seperti stubHelper .
async queryCar (stubHelper: StubHelper, args: string []): Janji < any > { const diverifikasiArgs = menunggu Pembantu . checkArgs < {kunci: string} > (args [ 0 ], Yup . objek () . bentuk({ kunci: Yup . string () . wajib(), })); mobil const = menunggu stubHelper . getStateAsObject ( kunci VerifiedArgs . ); if ( ! car) { lempar NotFoundError baru ( 'Mobil tidak ada' ); } mobil kembali ; }
2.1 Fungsi Mobil Permintaan Validasi
Gunakan perintah Docker berikut untuk permintaan Mobil dengan kunci ‘CAR100’, perhatikan penggunaan kata kunci permintaan dalam perintah ini.
docker exec cli peer kueri chaincode -C mychannel -n fabcar -c ‘{“function”: “queryCar”, “Args”: [“{\” key \ “: \” CAR100 \ “}”]}’
3 Koleksi Pribadi
Untuk memulai, pertama-tama kita perlu file konfigurasi koleksi collections_config.json yang mencakup nama dan kebijakan koleksi.Kebijakan ini mirip dengan dukungan, ini memungkinkan kami untuk menggunakan logika kebijakan yang sudah ada seperti operator OR, AND,….
3.1 Konfigurasi Koleksi Pribadi
Koleksi pribadi terdiri dari nama dan kebijakan, properti lain di luar cakupan untuk tutorial ini dan dioptimalkan untuk jaringan Hyperledger.Kami menggunakan koleksi bernama “privateCarCollection” dengan kebijakan di mana hanya satu anggota organisasi yang harus memvalidasi transaksi.
& nbsp
[ { "name" : "privateCarCollection" , "kebijakan" : "ATAU ('Org1MSP.member', 'Org2MSP.member')" , "requiredPeerCount" : 0 , "maxPeerCount" : 3 , "blockToLive" : 1000000 } ]
3.2 Tambahkan Data ke Koleksi Pribadi
Sekarang kami memiliki koleksi pribadi kami, mari gunakan ini dalam kode kami. Bukan pekerjaan besar untuk memberi tahu stubHelper untuk menyimpan data ke koleksi pribadi alih-alih menyebarkannya di jaringan.
menunggu stubHelper . putState ( VerifiedArgs . kunci, mobil, {privateCollection: 'privateCarCollection' } );
Mari kita sedikit modifikasi kode kita untuk hanya menyimpan pemilik mobil dan alamatnya di koleksi mobil pribadi. Ingatlah untuk menambahkan kunci yang sama ke objek mobil pribadi baru ini agar lebih mudah untuk mengambil objek penuh. Selain itu, kami akan mengubah validator objek Yup untuk hanya menerima kunci, alamat, dan properti pemilik. Sebagai praktik terbaik, kami mengubah DOCTYPE menjadi‘privateCar’ .
async createPrivateCar (stubHelper: StubHelper, args: string []) { const diverifikasiArgs = menunggu Pembantu . checkArgs (args [ 0 ], Yup . object () . bentuk({ kunci: Yup . string () . wajib(), alamat: Yup . string () . wajib(), pemilik: Yup . string () . wajib(), })); biarkan mobil = { docType: 'privateCar' , alamat: VerifiedArgs . alamat, pemilik: VerifiedArgs . pemilik, kunci: VerifiedArgs . kunci, }; menunggu stubHelper . putState ( VerifiedArgs . kunci, mobil, {privateCollection: 'privateCarCollection' } ); }
3.3 Mobil Agregat Permintaan
Untuk membuat objek mobil teragregasi, kami akan menanyakan jaringan Hyperledger dan pengumpulan data pribadi yang berisi pemilik dan alamat mobil kami.
Pertama, mari kita ambil mobil umum dengan:
biarkan publicCar = tunggu stubHelper.getStateAsObject (verifiedArgs.key);
Selanjutnya, kita dapat meminta data mobil pribadi dengan cara yang sama:
biarkan privateCar = menunggu stubHelper.getStateAsObject (VerifiedArgs.key, {privateCollection: ‘privateCarCollection’})
Akhirnya, mari kita kembalikan objek mobil agregat. Kami menggunakan penyebaran objek (tiga titik ‘…’) yang merupakan metode ECMAscript 2018 yang mengambil semua properti dari setiap objek dan menggabungkannya menjadi satu objek baru.
async queryAggregatedCar (stubHelper: StubHelper, args: string []): Janji < any > { const diverifikasiArgs = menunggu Pembantu . checkArgs < {kunci: string} > (args [ 0 ], Yup . objek () . bentuk({ kunci: Yup . string () . wajib(), })); biarkan publicCar = menunggu stubHelper . getStateAsObject ( kunci VerifiedArgs . ); if ( ! publicCar) { lempar NotFoundError baru ( 'Mobil tidak ada' ); } biarkan privateCar = menunggu stubHelper . getStateAsObject ( VerifiedArgs . kunci, {privateCollection: 'privateCarCollection' } ); mobil const = { ... publicCar, ... privateCar }; mobil kembali ; }
3.4. Permintaan Agregat Tervalidasi
Di bullet 1.1 dalam tutorial ini, kami menciptakan mobil baru dengan kunci ‘ CAR100 ‘. Mari kita gunakan kunci ini untuk membuat objek data pribadi baru melalui perintah Docker exec.
docker exec cli peer chaincode menjalankan -C mychannel -n fabcar -c ‘{“function”: “createPrivateCar”, “Args”: [“{\” key \ “: \” CAR100 \ “, \” address \ “: \ ”Parklane 20, Italia \”, \ ”pemilik \”: \ ”John Doe \”} ”]} ‘
Sekarang kita memiliki publik sebagai objek mobil pribadi, mari kita coba panggilan agregat seperti ini. Ingatlah untuk menggunakan kata kuncikueri karena kami hanya mengambil data.
docker exec cli peer kueri chaincode -C mychannel -n fabcar -c ‘{“function”: “queryAggregatedCar”, “Args”: [“{\” key \ “: \” CAR100 \ “}”]}’
Ini akan kembali:
{“Color”: “green”, “docType”: “privateCar”, “key”: “CAR100 ″,” make “:” Peugot “,” model “:” 307 ″, “pemilik”: “John Doe”, ”Alamat”: ”Parklane 20, Italia”}
4. Apa yang kita pelajari?
The stubHelper adalah alat yang paling penting untuk berinteraksi dengan data dalam buku besar. Ia mampu menambah, memperbarui, dan menghapus data. Tetapi, juga dapat membantu dalam menemukan dan menanyakan objek dalam buku besar dan mengembalikannya sebagai objek JSON.