Melakukan transaksi publik dan pribadi di JPMorgan Quorum blockchain menggunakan Web3



Quorum adalah blockchain berbasis Ethereum yang dikembangkan oleh JPMorgan dan yang terbaru menjadi platform registri terdistribusi pertama yang ditawarkan Microsoft Azure.


Kuorum mendukung transaksi pribadi dan publik dan memiliki banyak kasus penggunaan komersial.


Pada artikel ini, kami akan menganalisis salah satu skenario ini - penyebaran jaringan registri terdistribusi antara supermarket dan pemilik gudang untuk memberikan informasi yang relevan tentang suhu gudang.


Kode yang digunakan dalam panduan ini terletak di repositori di GitHub .


Artikel tersebut meliputi:


  • menciptakan kontrak yang cerdas;
  • Menyebarkan jaringan Kuorum dengan Chainstack
  • Transaksi publik kuorum
  • Transaksi pribadi kuorum.

Untuk menggambarkan hal ini, kami menggunakan skenario pemantauan suhu di ruang penyimpanan peserta jaringan Kuorum sebagai bagian dari Internet of Things (IoT).


Konteks


Sekelompok perusahaan gudang disatukan dalam konsorsium untuk penyimpanan informasi dan otomatisasi proses bersama pada blockchain. Untuk ini, perusahaan memutuskan untuk menggunakan Kuorum. Dalam artikel ini, kita akan membahas dua skenario: transaksi publik dan transaksi pribadi.


Transaksi dibuat oleh peserta yang berbeda untuk berinteraksi dengan konsorsium tempat mereka berada. Setiap transaksi baik menyebarkan kontrak atau memanggil fungsi dalam kontrak untuk mengunggah data ke jaringan. Tindakan ini direplikasi ke semua node di jaringan.


Transaksi publik tersedia untuk dilihat oleh semua anggota konsorsium. Transaksi pribadi menambah lapisan kerahasiaan dan hanya tersedia bagi para peserta yang memiliki hak untuk itu.


Untuk kedua skenario, kami menggunakan kontrak yang sama untuk kejelasan.


Kontrak pintar


Di bawah ini adalah kontrak pintar sederhana yang dibuat untuk skenario kami. Ini memiliki temperature variabel publik, yang dapat diubah menggunakan metode set dan diperoleh dengan menggunakan metode get .


 pragma solidity ^0.4.25; contract TemperatureMonitor { int8 public temperature; function set(int8 temp) public { temperature = temp; } function get() view public returns (int8) { return temperature; } } 

Agar kontrak dapat bekerja dengan web3.js , itu harus dikonversi ke format dan bytecode ABI. Menggunakan fungsi formatContract bawah ini mengkompilasi kontrak menggunakan solc-js .


 function formatContract() { const path = './contracts/temperatureMonitor.sol'; const source = fs.readFileSync(path,'UTF8'); return solc.compile(source, 1).contracts[':TemperatureMonitor']; } 

Kontrak yang telah selesai adalah sebagai berikut:


 // interface [ { constant: true, inputs: [], name: 'get', outputs: [Array], payable: false, stateMutability: 'view', type: 'function' }, { constant: true, inputs: [], name: 'temperature', outputs: [Array], payable: false, stateMutability: 'view', type: 'function' }, { constant: false, inputs: [Array], name: 'set', outputs: [], payable: false, stateMutability: 'nonpayable', type: 'function' } ] 

 // bytecode 

Sekarang setelah kontrak siap, kami akan menyebarkan jaringan dan menyebarkan kontrak.


Penempatan node


gambar


Menyebarkan simpul bisa sangat memakan waktu dan proses ini dapat diganti menggunakan layanan Chainstack .


Berikut ini adalah proses penyebaran jaringan Kuorum dengan konsensus Raft dan tiga node.


Untuk memulai, mari kita mulai sebuah proyek dan menyebutnya Proyek Kuorum:


gambar


Buat jaringan Kuorum dengan konsensus Raft di Google Cloud Platform:


gambar


Untuk simpul default yang sudah dibuat, tambahkan dua node lagi:


gambar


Tiga node berjalan:


gambar


Halaman detail node menunjukkan titik akhir RPC, kunci publik, dll.


gambar


Jaringan dikerahkan. Sekarang kita akan menggunakan kontrak pintar dan melakukan transaksi menggunakan web3.js.


Transaksi publik


Konteks


Suhu gudang sangat penting untuk mengurangi biaya, terutama untuk produk yang dimaksudkan untuk penyimpanan pada suhu di bawah nol.


Dengan memberi perusahaan kemampuan untuk berbagi nilai waktu-nyata dari suhu eksternal dari lokasi geografis mereka dan mencatatnya dalam registri yang tidak dapat diubah, anggota jaringan mengurangi biaya dan waktu.


gambar


Kami akan menyelesaikan tiga tugas yang diilustrasikan dalam diagram:


  1. Kami akan mengakhiri kontrak melalui Node 1 :


     const contractAddress = await deployContract(raft1Node); console.log(`Contract address after deployment: ${contractAddress}`); 

  2. Atur suhu melalui Node 2 hingga 3 derajat:


     const status = await setTemperature(raft2Node, contractAddress, 3); console.log(`Transaction status: ${status}`); 

  3. Node 3 akan menerima informasi dari kontrak pintar. Kontrak akan mengembalikan nilai 3 derajat:


     const temp = await getTemperature(raft3Node, contractAddress); console.log('Retrieved contract Temperature', temp); 

    Selanjutnya, kita akan melihat bagaimana melakukan transaksi publik di jaringan Kuorum menggunakan web3.js.



Kami memulai sebuah instance melalui RPC untuk tiga node:


 const raft1Node = new Web3( new Web3.providers.HttpProvider(process.env.RPC1), null, { transactionConfirmationBlocks: 1, }, ); const raft2Node = new Web3( new Web3.providers.HttpProvider(process.env.RPC2), null, { transactionConfirmationBlocks: 1, }, ); const raft3Node = new Web3( new Web3.providers.HttpProvider(process.env.RPC3), null, { transactionConfirmationBlocks: 1, }, ); 

Hancurkan kontrak pintar:


 // returns the default account from the Web3 instance initiated previously function getAddress(web3) { return web3.eth.getAccounts().then(accounts => accounts[0]); } // Deploys the contract using contract's interface and node's default address async function deployContract(web3) { const address = await getAddress(web3); // initiate contract with contract's interface const contract = new web3.eth.Contract( temperatureMonitor.interface ); return contract.deploy({ // deploy contract with contract's bytecode data: temperatureMonitor.bytecode, }) .send({ from: address, gas: '0x2CD29C0', }) .on('error', console.error) .then((newContractInstance) => { // returns deployed contract address return newContractInstance.options.address; }); } 

web3.js menyediakan dua metode untuk berinteraksi dengan kontrak: call dan send .


Perbarui suhu kontrak dengan mengeksekusi set menggunakan metode send web3.


 // get contract deployed previously async function getContract(web3, contractAddress) { const address = await getAddress(web3); return web3.eth.Contract( temperatureMonitor.interface, contractAddress, { defaultAccount: address, } ); } // calls contract set method to update contract's temperature async function setTemperature(web3, contractAddress, temp) { const myContract = await getContract(web3, contractAddress); return myContract.methods.set(temp).send({}).then((receipt) => { return receipt.status; }); } 

Selanjutnya, kami menggunakan metode call web3 untuk mendapatkan suhu kontrak. Harap dicatat bahwa metode call dijalankan pada node lokal dan transaksi tidak akan dibuat di blockchain.


 // calls contract get method to retrieve contract's temperature async function getTemperature(web3, contractAddress) { const myContract = await getContract(web3, contractAddress); return myContract.methods.get().call().then(result => result); } 

Sekarang Anda dapat menjalankan public.js untuk mendapatkan hasil berikut:


 // Execute public script node public.js Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F Transaction status: true Retrieved contract Temperature 3 

Selanjutnya, kita dapat melihat entri di penjelajah Quorum di panel Chainstack, seperti yang ditunjukkan di bawah ini.


Ketiga node berinteraksi dan transaksi diperbarui:


  1. Transaksi pertama telah mendapatkan kontrak.
  2. Transaksi kedua mengatur suhu kontrak menjadi 3 derajat.
  3. Temperatur diperoleh melalui simpul lokal, sehingga transaksi belum dibuat.

gambar


Transaksi Pribadi


Konteks


Persyaratan umum organisasi adalah perlindungan data. Sebagai contoh, perhatikan skenario di mana supermarket menyewa gudang untuk menyimpan makanan laut dari vendor terpisah:


  • Vendor dengan bantuan sensor IoT membaca nilai suhu setiap 30 detik dan meneruskannya ke Supermarket ;
  • nilai-nilai ini harus tersedia hanya untuk Vendor dan Supermarket , sebuah jaringan konsorsium.

gambar


Kami akan menyelesaikan empat tugas yang diilustrasikan dalam diagram di atas.


  • Kami menggunakan tiga simpul yang sama dari skenario sebelumnya untuk menunjukkan transaksi pribadi:
  • Supermarket menyebarkan kontrak pintar yang bersifat pribadi ke supermarket dan vendor .
  • Pihak ketiga tidak memiliki akses ke kontrak pintar.

Kami akan memanggil metode get and set atas nama Supermarket dan Vendor untuk mendemonstrasikan transaksi kuorum pribadi.


  1. Kami akan mengakhiri kontrak pribadi untuk peserta Supermarket dan Vendor melalui peserta Supermarket :


     const contractAddress = await deployContract( raft1Node, process.env.PK2, ); console.log(`Contract address after deployment: ${contractAddress}`); 

  2. Atur suhu dari Pihak Ketiga (simpul luar) dan dapatkan nilai suhu:


     // Attempts to set Contract temperature to 10, this will not mutate contract's temperature await setTemperature( raft3Node, contractAddress, process.env.PK1, 10, ); // This returns null const temp = await getTemperature(raft3Node, contractAddress); console.log(`[Node3] temp retrieved after updating contract from external nodes: ${temp}`); 

  3. Atur suhu dari Vendor (simpul dalam) dan dapatkan nilai suhu:


    Suhu dalam skenario ini harus kembali dari kontrak pintar ke 12. Harap dicatat bahwa vendor di sini telah mengizinkan akses ke kontrak pintar.


     // Updated Contract temperature to 12 degrees await setTemperature( raft2Node, contractAddress, process.env.PK1, 12, ); // This returns 12 const temp2 = await getTemperature(raft2Node, contractAddress); console.log(`[Node2] temp retrieved after updating contract from internal nodes: ${temp2}`); 

  4. Dapatkan suhu dari Pihak Ketiga (simpul luar):


    Pada langkah 3, suhu ditetapkan ke 12, tetapi Pihak Ketiga tidak memiliki akses ke kontrak pintar. Oleh karena itu, nilai balik harus nol.


     // This returns null const temp3 = await getTemperature(raft3Node, contractAddress); console.log(`[Node3] temp retrieved from external nodes after update ${temp}`); 

    Selanjutnya, kami akan mempertimbangkan secara lebih rinci pelaksanaan transaksi pribadi di jaringan Kuorum dengan web3.js. Karena sebagian besar kode bertepatan dengan transaksi publik, kami hanya memilih bagian-bagian yang berbeda untuk transaksi pribadi.



Harap dicatat bahwa kontrak yang diunggah ke jaringan tidak dapat diubah, oleh karena itu akses dengan izin harus diberikan ke node yang sesuai dengan memasukkan kontrak publik pada saat penyebaran kontrak, dan bukan setelahnya.


 async function deployContract(web3, publicKey) { const address = await getAddress(web3); const contract = new web3.eth.Contract( temperatureMonitor.interface, ); return contract.deploy({ data: temperatureMonitor.bytecode, }) .send({ from: address, gas: '0x2CD29C0', // Grant Permission to Contract by including nodes public keys privateFor: [publicKey], }) .then((contract) => { return contract.options.address; }); } 

Transaksi pribadi dilakukan dengan cara yang sama - dengan memasukkan kunci publik dari peserta pada saat eksekusi.


 async function setTemperature(web3, contractAddress, publicKey, temp) { const address = await getAddress(web3); const myContract = await getContract(web3, contractAddress); return myContract.methods.set(temp).send({ from: address, // Grant Permission by including nodes public keys privateFor: [publicKey], }).then((receipt) => { return receipt.status; }); } 

Sekarang kita dapat menjalankan private.js dengan hasil berikut:


 node private.js Contract address after deployment: 0x85dBF88B4dfa47e73608b33454E4e3BA2812B21D [Node3] temp retrieved after updating contract from external nodes: null [Node2] temp retrieved after updating contract from internal nodes: 12 [Node3] temp retrieved from external nodes after update null 

Penjelajah Kuorum di Chainstack akan memperlihatkan yang berikut:


  • Penyebaran kontrak dari peserta di supermarket ;
  • Melakukan SetTemperature dari Pihak Ketiga ;
  • Lakukan SetTemperature dari peserta vendor .

gambar


Seperti yang Anda lihat, kedua transaksi selesai, tetapi hanya transaksi dari vendor peserta yang memperbarui suhu dalam kontrak. Dengan demikian, transaksi pribadi memberikan kekekalan, tetapi pada saat yang sama mereka tidak memberikan data kepada pihak ketiga.


Kesimpulan


Kami memeriksa skenario komersial untuk menggunakan Quorum untuk menyediakan informasi suhu terkini di gudang dengan menyebarkan jaringan antara dua pihak - supermarket dan pemilik gudang.


Kami telah menunjukkan bagaimana informasi suhu saat ini dapat dipertahankan baik melalui transaksi publik maupun pribadi.


Mungkin ada banyak skenario aplikasi dan, seperti yang Anda lihat, itu sama sekali tidak sulit.


Eksperimen, coba gunakan skrip Anda. Selain itu, industri teknologi blockchain dapat tumbuh hampir sepuluh kali lipat pada tahun 2024 .

Source: https://habr.com/ru/post/id456368/


All Articles