Siri tutorial fabrik Hyperledger berikut terdiri daripada tiga artikel yang akan mengajar anda pelbagai aspek mengenai pengembangan kod rantai Hyperledger Fabric mulai dari operasi CRUD, perlindungan data, dan pengujian kod rantai.

Bahagian 1

Bahagian 2

Bahagian 3

Oleh  Michiel Mulders

Gambaran keseluruhan siri:

  • Artikel 1: Pengembangan kod rantai asas dan menyimpan data peribadi dalam koleksi
  • Artikel 2: Pertanyaan kod rantai lanjutan dan GUI CouchDB
  • Artikel 3: Tutorial untuk menguji kod rantai anda dengan MockStub

Keperluan

  • RAM 4GB (lebih disukai)
  • Docker, Docker-Compose, editor Code (mis. Visual Studio Code), Git
  • NodeJS versi 8.9+ (Pilihan adalah 8.9.4 – ubah versi anda dengan pengurus versi seperti ‘n‘)
  • Pengetahuan JavaScript asas

Objektif

  • Buat fungsi kod rantai asas seperti membaca dan menambahkan data ke lejar.
  • Sahkan fungsi yang dibuat melalui komando Docker exec.
  • Konfigurasikan koleksi data peribadi.
  • Tambahkan data ke koleksi data peribadi dan ambil objek terkumpul dari lejar.

Pengenalan: Tutorial fabrik Hyperledger

Dalam artikel pertama ini, kita akan membiasakan diri dengan plat boiler Hyperledger Fabric untuk kod rantai NodeJS yang akan kita gunakan sepanjang siri tutorial ini. Plat boiler dikembangkan oleh syarikat perundingan blockchain Belgia yang dipanggil TheLedger.be, terima kasih banyak untuk sumber terbuka boilerplate ini.

Mengapa kita menggunakan plat boiler ini? Ini menjadikan hidup anda lebih mudah! Sebagai contoh, plat boiler secara automatik akan membungkus dan membuat siri jawapan dengan shim.sukses () dan shim.error (). Anda hanya boleh mengembalikan objek javascript dan ia akan melakukan yang lain.

Dalam tutorial ini, kami akan memfokuskan pada pengembangan operasi CRUD asas dengan dan tanpa pengumpulan data peribadi, yang akan kami uji selepas itu. Selain itu, kami akan memberi anda pengenalan ringkas mengenai bagaimana koleksi peribadi berfungsi.

Dapatkan Kodnya

Kodnya boleh didapati di Github michielmulders / hyperledger-fabric-blockgeeks. Adalah disyorkan untuk menggunakan

klon git https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git

untuk membuat klon tempatan repositori pada mesin anda dan lihat bahagian pertama tutorial dengan git checkout tutorial-1

Penyediaan Plat Dandang

Ok, jadi Hyperledger Fabric tidak akan bermula dari awal … Pertama, kita perlu menarik gambar Docker yang diperlukan yang diperlukan oleh Fabric untuk membuat bekas yang diperlukan (Certificate Authority, Orderer, Peer, Membership Service).

Folder skrip mengandungi skrip yang dipanggil bootstrap.sh yang secara lalai menarik versi 1.2.0 Hyperledger Fabric yang menyokong fungsi koleksi peribadi yang akan kita gunakan kemudian. Pastikan anda mempunyai ruang yang mencukupi pada cakera anda dan sambungan internet yang betul kerana gambarnya berukuran lebih besar daripada 1GB. Laksanakan skrip seperti ini ./scripts/bootstrap.sh

Apabila kami telah memuat turun semua gambar yang diperlukan, kami dapat melangkah lebih jauh untuk menguji plat boiler kami dengan memastikannya bermula tanpa kesalahan. Mari jalankan skrip startFabric.sh dengan ./scripts/startFabric.sh

Penyelesaian yang berjaya – rangkaian Hyperledger Fabric yang berjalan – akan mengembalikan status 200.

Tutorial Fabrik Hyperledger: Cara menguji kod rantai NodeJS anda menggunakan Mockstub- Bahagian 1

Petua: Jika anda tidak dapat menjalankan skrip Bash (.sh), cobalah untuk memberikannya hak yang dapat dilaksanakan dengan:

chmod + x bootstrap.sh

Mengenai Koleksi Peribadi

Hyperledger Fabric telah mengembangkan konsep SideDBs ini yang mengandungi data peribadi, hanya dapat dilihat untuk nod yang memiliki SideDB. Pada dasarnya, ini adalah maklumat yang belum dikongsi secara terbuka di antara rangkaian peribadi. Baru-baru ini, Hyperledger telah menjenamakannya semula sebagai koleksi peribadi yang mereka lihat sebagai penyelesaian “patuh GDPR” terpasang.

Sebelum ini, kerahsiaan telah dibuat di rangkaian Hyperledger melalui penggunaan saluran. Contoh yang paling biasa adalah perundingan mengenai harga sekilo untuk ikan tertentu. Fisher A ingin menawarkan harga istimewa untuk Restaurant A kerana mereka adalah kawan rapat, namun Fisher A tidak mahu Restaurant B melihat tawaran yang lebih murah ini dengan Restaurant A. Untuk mewujudkan komunikasi yang selamat, dua saluran dibuat dari Fisher A ke Restoran A dan dari Fisher A ke Restoran B.

Walau bagaimanapun, proses membuat saluran boleh menjadi agak kompleks dalam situasi fintech di mana kita bercakap mengenai ribuan pelanggan, masing-masing mempunyai banyak saluran. Itulah sebab mengapa Hyperledger Fabric tidak menggalakkan penggunaan saluran secara berlebihan kerana ini melambatkan rangkaian secara drastik, mempengaruhi prestasi.

Jonas Snellinckx dari TheLedger menerangkan bagaimana data peribadi dapat diuruskan dengan lebih baik di dalam rangkaian Hyperledger,

Data peribadi membolehkan anda membuat kumpulan data menggunakan dasar untuk menentukan pihak mana di saluran yang dapat mengakses data tersebut. Akses ini hanya dapat dikendalikan dengan menambahkan polisi pada koleksi. Ini membolehkan beberapa data menjadi umum dan beberapa bersifat peribadi untuk beberapa pihak. “

Tutorial Fabrik Hyperledger: Cara menguji kod rantai NodeJS anda menggunakan Mockstub- Bahagian 1

Gambar 1: Dari slaideck “Privacy Enabled Ledger” https://jira.hyperledger.org/browse/FAB-1151

Untuk tutorial ini, kami menentukan kereta yang akan disimpan di dalam rangkaian Fabric. Data mengenai pemiliknya bersifat peribadi, jadi akan ditambahkan ke koleksi peribadi. Mari kod!

Kod Rantai Fabrik Hyperledger

Mari lihat kod rantai semasa yang boleh anda temui chaincode / node / src / MyChaincode.ts. Fail mengandungi satu fungsi, initLedger digunakan untuk mengisi terlebih dahulu lejar dengan beberapa kereta. Objek kereta terdiri daripada membuat, model, warna, dan pemiliknya. Semasa menambahkan objek kereta ke lejar, kami memberikan semuanya kunci dan doktok unik sehingga lebih mudah untuk mengambilnya.

untuk (let i = 0; i < kereta.panjang; saya ++) {

           kereta const: any = kereta [i];

           car.docType = ‘kereta’;

           //car.key = `KERETA $ {i}`;

           tunggu stubHelper.putState (‘CAR’ + i, kereta);

           this.logger.info (‘Ditambah <–> ‘, kereta);

       }

1. Buat Kereta Baru

Mari kod fungsi yang membuat objek kereta baru di negara Hyperledger dunia. Fungsi ini menerima susunan rentetan, namun, hanya elemen pertama dalam array yang berisi objek JSON yang diikat. Kami menggunakan fungsi pembantu untuk memeriksa argumen dengan mudah Yup. Selain memeriksa argumen, ia juga dapat menguraikan argumen anda dari rentetan ke format data yang diperlukan. Yup akan mengurai objek JSON yang dililit mengikut skema yang disediakan yang kami tetapkan Yup.object (). Bentuk ({my-object}.

async createCar (stubHelper: StubHelper, args: string []) {

       const verifiedArgs = tunggu Helpers.checkArgs<ada>(berhujah [0], Yup.object ()

           .bentuk ({

               kunci: Yup.string (). diperlukan (),

               buat: Yup.string (). diperlukan (),

               model: Yup.string (). diperlukan (),

               warna: Yup.string (). diperlukan (),

               pemilik: Yup.string (). diperlukan (),

           }));

    …

}

Seterusnya, kita boleh menggunakan objek berformat ini (disahkanArgs pemalar) untuk membina objek kereta baru. Jangan lupa untuk menambah jenis doktrin. Objek siap sekarang untuk dilampirkan ke lejar. Mari gunakan stubHelper yang mengandungi semua fungsi untuk berinteraksi dengan keadaan lejar seperti mengambil, menambah, mengemas kini, dan menghapus data.

async createCar (stubHelper: StubHelper, args: string []) {

       const verifiedArgs = tunggu Helpers.checkArgs<ada>(berhujah [0], Yup.object ()

           .bentuk ({

               kunci: Yup.string (). diperlukan (),

               buat: Yup.string (). diperlukan (),

               model: Yup.string (). diperlukan (),

               warna: Yup.string (). diperlukan (),

               pemilik: Yup.string (). diperlukan (),

           }));

       biarkan kereta = {

           docType: ‘kereta’,

           buat: verifiedArgs.make,

           model: verifiedArgs.model,

           warna: verifiedArgs.color,

           pemilik: verifiedArgs.owner,

           kunci: verifiedArgs.key,

       };

       tunggu stubHelper.putState (verifiedArgs.key, kereta);

   }

The putState fungsi menerima kunci dan objek yang akan disimpan di dalam lejar. Fungsi putState yang kami gunakan di sini adalah fungsi pembungkus kerana lejar hanya dapat menyimpan tatasusunan bait dan bukan objek JSON. The stubHelper adakah keajaiban untuk kita, pelaksanaan asal boleh didapati di ChaincodeStubInterface.PutState.

1.1 Mengesahkan Penambahan Kereta

Kami akan menggunakan Docker untuk melaksanakan perintah di dalam wadah peer kerana peer memegang versi terbaru kod rantai. Untuk memberikan versi terkini kepada rakan sebaya, mari kita mulakan semula rangkaian Hyperledger Fabric ./scripts/startFabric.sh. Mengapa menggunakan skrip ini? Ia dijalankan lebih cepat kerana hanya akan menggantikan kod rantai pada rakan sebaya dan tidak memulakan semula keseluruhan rangkaian.

Buka terminal dan jalankan arahan berikut: docker exec cli peer chaincode memanggil -C mychannel -n fabcar -c ‘{“function”: “createCar”, “Args”: [“{\” key \ “: \” CAR100 \ “, \” make \ “: \ “Peugot \”, \ “model \”: \ “307 \”, \ “warna \”: \ “hijau \”, \ “pemilik \”: \ “John Doe \”} “]} ”

Perintah ini akan menghantar cadangan transaksi baru kepada rakan sebaya untuk dimasukkan ke dalam keadaan lejar dunia. Kami memanggil kami ‘buat kereta‘Berfungsi dan kami menambah objek JSON bertali dengan kunci’ CAR100 ‘sebagai parameter pertama dalam rentetan rentetan kami. Kita harus melepaskan tanda petik ganda dari objek JSON untuk meneruskannya ke kod rantai kita.

Perhatikan penggunaan memohon kata kunci. Penting untuk mengetahui perbezaan antara memohon dan pertanyaan. Kata kunci pemanggil digunakan ketika kita berusaha mengubah atau menambahkan data ke lejar, sedangkan kata kunci pertanyaan hanya digunakan ketika mengambil maklumat dari lejar.

Pelaksanaan arahan Docker yang berjaya akan mengembalikan ‘hasil: status: 200’.

Tutorial Fabrik Hyperledger: Cara menguji kod rantai NodeJS anda menggunakan Mockstub- Bahagian 1

2. Baca Data Dari Lejar

Untuk membaca data dari lejar, kita dapat mencari kunci tertentu. Mari cari objek Kereta yang baru dibuat dengan kunci ‘CAR100’. Kami mulakan sekali lagi dengan mengesahkan hujah yang kami terima dalam kod rantai kami, kali ini kami hanya menerima kunci.

Seterusnya, kami menggunakan getStateAsObject berfungsi untuk mengambil objek JSON dari lejar untuk kunci yang ditentukan. Ada kemungkinan kunci itu tidak ada. Dalam kes ini, kita dapat membuang ralat tersuai dengan Kesalahan NotFound yang merupakan sebahagian daripada kain-rantai kod-perkakas, kami mengimport di bahagian atas fail, seperti stubHelper.

async queryCar (stubHelper: StubHelper, args: string []): Janji<ada> {

       

       const verifiedArgs = tunggu Helpers.checkArgs<{kunci: tali}>(berhujah [0], Yup.object ()

           .bentuk ({

               kunci: Yup.string (). diperlukan (),

           }));

       const car = tunggu stubHelper.getStateAsObject (verifiedArgs.key);

       jika (! kereta) {

           membuang NotFoundError baru (‘Kereta tidak wujud’);

       }

       kereta balik;

   }

2.1 Fungsi Kereta Pertanyaan Pengesahan

Gunakan perintah Docker berikut untuk meminta Car dengan kunci ‘CAR100’, perhatikan penggunaan kata kunci pertanyaan dalam arahan ini.

pertanyaan docker exec cli peer chaincode -C mychannel -n fabcar -c ‘{“function”: “queryCar”, “Args”: [“{\” key \ “: \” CAR100 \ “}”]}’

Tutorial Fabrik Hyperledger: Cara menguji kod rantai NodeJS anda menggunakan Mockstub- Bahagian 1

3 Koleksi Peribadi

Untuk memulakan, pertama-tama kita memerlukan fail konfigurasi koleksi koleksi_config.json yang merangkumi nama dan polisi koleksi. Polisi ini serupa dengan sokongan, ini membolehkan kami menggunakan logik dasar yang sudah ada seperti operator OR, AND,….

3.1 Konfigurasi Koleksi Peribadi

Koleksi peribadi terdiri daripada nama dan polisi, sifat lain di luar ruang lingkup untuk tutorial ini dan dioptimumkan untuk rangkaian Hyperledger. Kami menggunakan koleksi bernama “privateCarCollection” dengan polisi di mana hanya satu anggota organisasi yang harus mengesahkan transaksi.

[

 {

   "nama": "privateCarCollection",

   "dasar": "ATAU (‘Org1MSP.member’, ‘Org2MSP.member’)",

   "diperlukanPeerCount": 0,

   "maxPeerCount": 3,

   "blokToLive": 1000000

 }

]

3.2 Menambah Data ke Koleksi Peribadi

Sekarang kami mempunyai koleksi peribadi kami, mari gunakan ini dalam kod kami. Bukan tugas besar untuk memberitahu stubHelper untuk menyimpan data ke koleksi peribadi dan bukannya menyebarkannya ke seluruh rangkaian.

tunggu stubHelper.putState (

           disahkanArgs.key,

           kereta,

           {privateCollection: ‘privateCarCollection’}

       );

Mari ubah sedikit kod kami untuk menyimpan pemilik kereta dan alamatnya di koleksi kereta persendirian. Ingatlah untuk menambah kunci yang sama pada objek kereta persendirian baru ini untuk memudahkan mengambil objek penuh. Selain itu, kami akan mengubah validator objek Yup untuk menerima hanya kunci, alamat, dan harta pemilik. Sebagai amalan terbaik, kami mengubahypeype ke ‘kereta persendirian’.

async createPrivateCar (stubHelper: StubHelper, args: string []) {

const verifiedArgs = tunggu Helpers.checkArgs (args [0], Yup.object ()

.bentuk ({

kunci: Yup.string (). diperlukan (),

alamat: Yup.string (). diperlukan (),

pemilik: Yup.string (). diperlukan (),

}));

biarkan kereta = {

docType: ‘privateCar’,

alamat: verifiedArgs.address,

pemilik: verifiedArgs.owner,

kunci: verifiedArgs.key,

};

tunggu stubHelper.putState (

disahkanArgs.key,

kereta,

{privateCollection: ‘privateCarCollection’}

);

}

3.3 Pertanyaan Kereta Gabungan

Untuk membuat objek kereta yang digabungkan, kami akan meminta jaringan Hyperledger dan pengumpulan data peribadi yang mengandungi pemilik dan alamat kereta kami.

Pertama, mari dapatkan kereta awam dengan:

biarkan publicCar = tunggu stubHelper.getStateAsObject (verifiedArgs.key);

Seterusnya, kita dapat meminta data kereta persendirian dengan cara yang sama:

let privateCar = tunggu stubHelper.getStateAsObject (verifiedArgs.key, {privateCollection: ‘privateCarCollection’})

Akhirnya, mari kembalikan objek kereta agregat. Kami menggunakan penyebaran objek (tiga titik ‘…’) yang merupakan kaedah ECMAscript 2018 yang mengambil semua sifat setiap objek dan menggabungkannya menjadi satu objek baru.

pertanyaan asyncAggregatedCar (stubHelper: StubHelper, args: string []): Janji<ada> {

       

       const verifiedArgs = tunggu Helpers.checkArgs<{kunci: tali}>(berhujah [0], Yup.object ()

           .bentuk ({

               kunci: Yup.string (). diperlukan (),

           }));

       biarkan publicCar = tunggu stubHelper.getStateAsObject (verifiedArgs.key);

       jika (! publicCar) {

           membuang NotFoundError baru (‘Kereta tidak wujud’);

       }

       biarkan privateCar = tunggu stubHelper.getStateAsObject (

           disahkanArgs.key,

           {privateCollection: ‘privateCarCollection’}

       );

       kereta const = {

           …kereta awam,

           …kereta persendirian

       };

       kereta balik;

   }

3.4 Mengesahkan Pertanyaan Gabungan

Pada peluru 1.1 dalam tutorial ini, kami membuat kereta baru dengan kunci ‘KERETA100‘. Mari gunakan kunci ini untuk membuat objek data peribadi baru melalui perintah Docker exec.

docker exec cli peer chaincode memanggil -C mychannel -n fabcar -c ‘{“function”: “createPrivateCar”, “Args”: [“{\” key \ “: \” CAR100 \ “, \” address \ “: \ “Parklane 20, Itali \”, \ “pemilik \”: \ “John Doe \”} “]} ‘

Sekarang kita mempunyai awam sebagai objek kereta persendirian, mari kita cuba panggilan agregat seperti ini. Ingat untuk menggunakan pertanyaan kata kunci kerana kami hanya mengambil data.

pertanyaan docker exec cli peer chaincode -C mychannel -n fabcar -c ‘{“function”: “queryAggregatedCar”, “Args”: [“{\” key \ “: \” CAR100 \ “}”]}’

Ini mesti kembali:

{“Color”: “green”, “docType”: “privateCar”, “key”: “CAR100 ″,” make “:” Peugot “,” model “:” 307 ″, “owner”: “John Doe”, “Alamat”: “Parklane 20, Itali”}

4. Apa yang kita pelajari?

The stubHelper adalah alat yang paling penting untuk berinteraksi dengan data di lejar. Ia mampu menambahkan, mengemas kini, dan menghapus data. Tetapi, juga dapat membantu dalam mencari dan meminta objek dalam lejar dan mengembalikannya sebagai objek JSON.

Kod Cheatsheet

Tutorial Fabrik Hyperledger: Cara menguji kod rantai NodeJS anda menggunakan Mockstub- Bahagian 1

Ingin menyelami lebih mendalam mengenai hyperledger? Lihat Hyperledger Accelerator kami 

Terus ke Bahagian Dua Di Sini: 

Bacaan selanjutnya

  • Di sini anda boleh menemui pelaksanaan antara muka penuh ChaincodeStubInterface yang dikodkan dengan Golang kerana Hyperledger dibuat dengan bahasa baru ini.
  • API penuh spek Pembantu Stub.
  • Koleksi sumber berkaitan Hyperledger Fabric di Github.

Oleh Michiel Mulders

@michiel_mulders

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me