
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:
// bytecode
Sekarang setelah kontrak siap, kami akan menyebarkan jaringan dan menyebarkan kontrak.
Penempatan node

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:

Buat jaringan Kuorum dengan konsensus Raft di Google Cloud Platform:

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

Tiga node berjalan:

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

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.

Kami akan menyelesaikan tiga tugas yang diilustrasikan dalam diagram:
Kami akan mengakhiri kontrak melalui Node 1 :
const contractAddress = await deployContract(raft1Node); console.log(`Contract address after deployment: ${contractAddress}`);
Atur suhu melalui Node 2 hingga 3 derajat:
const status = await setTemperature(raft2Node, contractAddress, 3); console.log(`Transaction status: ${status}`);
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:
web3.js menyediakan dua metode untuk berinteraksi dengan kontrak: call
dan send
.
Perbarui suhu kontrak dengan mengeksekusi set
menggunakan metode send
web3.
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.
Sekarang Anda dapat menjalankan public.js untuk mendapatkan hasil berikut:
Selanjutnya, kita dapat melihat entri di penjelajah Quorum di panel Chainstack, seperti yang ditunjukkan di bawah ini.
Ketiga node berinteraksi dan transaksi diperbarui:
- Transaksi pertama telah mendapatkan kontrak.
- Transaksi kedua mengatur suhu kontrak menjadi 3 derajat.
- Temperatur diperoleh melalui simpul lokal, sehingga transaksi belum dibuat.

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.

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.
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}`);
Atur suhu dari Pihak Ketiga (simpul luar) dan dapatkan nilai suhu:
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.
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.
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',
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,
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 .

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 .