Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Quorum JPMorgan tomonidan ishlab chiqilgan Ethereum-ga asoslangan blokcheyn bo'lib, yaqinda Microsoft Azure tomonidan taqdim etilgan birinchi taqsimlangan daftar platformasi bo'ldi.

Kvorum xususiy va davlat operatsiyalarini qo'llab-quvvatlaydi va ko'plab tijorat maqsadlarida foydalanish holatlariga ega.

Ushbu maqolada biz shunday stsenariylardan birini ko'rib chiqamiz - omborning harorati haqida so'nggi ma'lumotlarni taqdim etish uchun supermarket va ombor egasi o'rtasida taqsimlangan daftar tarmog'ini o'rnatish.

Ushbu qo'llanmada ishlatiladigan kod GitHub-dagi omborlar.

Maqola quyidagilarni qamrab oladi:

  • aqlli shartnoma yaratish;
  • yordamida Quorum tarmog'ini joylashtirish Chainstack;
  • Kvorum ochiq operatsiyalar;
  • Kvorum shaxsiy operatsiyalari.

Tasavvur qilish uchun biz Internet of Things (IoT) doirasidagi Quorum tarmog'i a'zolarining omborlarida haroratni kuzatish stsenariysidan foydalanamiz.

Kontekst

Bir guruh ombor kompaniyalari ma'lumotlarni birgalikda saqlash va blokcheyndagi jarayonlarni avtomatlashtirish uchun konsortsiumga birlashmoqda. Buning uchun kompaniyalar Quorum dan foydalanishga qaror qilishdi. Ushbu maqolada biz ikkita stsenariyni ko'rib chiqamiz: davlat operatsiyalari va xususiy operatsiyalar.

Bitimlar turli ishtirokchilar tomonidan ular tegishli bo'lgan konsortsium bilan o'zaro aloqada bo'lish uchun yaratiladi. Har bir tranzaksiya shartnomani o'rnatadi yoki tarmoqqa ma'lumotlarni yuklash uchun shartnomadagi funksiyani chaqiradi. Ushbu harakatlar tarmoqdagi barcha tugunlarga takrorlanadi.

Ommaviy operatsiyalar barcha konsortsium ishtirokchilari tomonidan ko'rish uchun mavjud. Xususiy tranzaktsiyalar maxfiylik darajasini oshiradi va faqat buni qilish huquqiga ega bo'lgan ishtirokchilar uchun mavjud.

Ikkala stsenariy uchun biz aniqlik uchun bir xil shartnomadan foydalanamiz.

Aqlli shartnoma

Quyida bizning stsenariymiz uchun yaratilgan oddiy aqlli shartnoma mavjud. U umumiy o'zgaruvchiga ega temperatureyordamida o'zgartirilishi mumkin set va usul bilan qabul qilish 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;
  }
}

Shartnoma bilan ishlash uchun web3.js, u ABI formatiga va bayt kodiga tarjima qilinishi kerak. Funktsiyadan foydalanish formatContractquyida shartnoma tuzadi solc-js.

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

Tugallangan shartnoma quyidagicha ko'rinadi:

// 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
0x608060405234801561001057600080fd5b50610104806100206000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636d4ce63c81146057578063adccea12146082578063faee13b9146094575b600080fd5b348015606257600080fd5b50606960ae565b60408051600092830b90920b8252519081900360200190f35b348015608d57600080fd5b50606960b7565b348015609f57600080fd5b5060ac60043560000b60c0565b005b60008054900b90565b60008054900b81565b6000805491810b60ff1660ff199092169190911790555600a165627a7a72305820af0086d55a9a4e6d52cb6b3967afd764ca89df91b2f42d7bf3b30098d222e5c50029

Endi shartnoma tayyor, biz tarmoqni joylashtiramiz va shartnomani joylashtiramiz.

Tugunni joylashtirish

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Tugunni joylashtirish juda ko'p mehnat talab qilishi mumkin va bu jarayonni xizmat yordamida almashtirish mumkin Chainstack.

Quyida Raft konsensus va uchta tugun bilan Quorum tarmog'ini joylashtirish jarayoni keltirilgan.

Birinchidan, loyiha yaratamiz va uni Kvorum loyihasi deb nomlaymiz:

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Keling, Google Cloud Platformida Raft konsensus bilan Quorum tarmog'ini yarataylik:

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Sukut bo'yicha allaqachon yaratilgan tugunga yana ikkita tugun qo'shamiz:

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Uch ishlaydigan tugun:

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Tugun tafsilotlari sahifasida RPC so'nggi nuqtasi, ochiq kalit va boshqalar ko'rsatilgan.

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Tarmoq o'rnatildi. Keling, aqlli kontraktlarni o'rnatamiz va tranzaktsiyalarni amalga oshiramiz web3.js.

Davlat operatsiyalari

Kontekst

Ombor harorati, ayniqsa, noldan past haroratlarda saqlash uchun mo'ljallangan mahsulotlar uchun xarajatlarni kamaytirishda katta ahamiyatga ega.

Kompaniyalarga o'zlarining geografik joylashuvining tashqi haroratini real vaqt rejimida almashish va uni o'zgarmas daftarga yozib olish imkonini berish orqali tarmoq ishtirokchilari xarajatlar va vaqtni kamaytiradi.

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Biz diagrammada ko'rsatilgan uchta vazifani bajaramiz:

  1. Biz shartnomani orqali tarqatamiz 1 tugun:

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

  2. orqali haroratni o'rnating 2 tugun 3 darajaga:

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

  3. 3 tugun aqlli shartnomadan ma'lumot oladi. Shartnoma qiymati 3 daraja qaytariladi:

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

    Keyinchalik, biz Quorum tarmog'ida ommaviy tranzaksiyani qanday amalga oshirishni ko'rib chiqamiz web3.js.

Biz uchta tugun uchun RPC orqali misolni ishga tushiramiz:

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,
 },
);

Keling, aqlli shartnomani ishga tushiramiz:

// 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 Shartnoma bilan ishlashning ikkita usulini taqdim etadi: call и send.

Shartnoma haroratini bajarish orqali yangilaymiz set web3 usuli yordamida send.

// 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;
  });
}

Keyin biz web3 usulidan foydalanamiz call shartnoma haroratini olish uchun. E'tibor bering, usul call mahalliy tugunda bajariladi va tranzaksiya blokcheynda yaratilmaydi.

// 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);
}

Endi siz yugurishingiz mumkin public.js quyidagi natijani olish uchun:

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

Keyinchalik, quyida ko'rsatilganidek, Chainstack panelidagi Quorum Explorer-dagi yozuvlarni ko'rishimiz mumkin.

Barcha uchta tugun o'zaro ta'sir qildi va tranzaktsiyalar yangilandi:

  1. Birinchi bitim shartnomani o'rnatdi.
  2. Ikkinchi bitim shartnoma haroratini 3 darajaga qo'ydi.
  3. Harorat mahalliy tugun orqali qabul qilinadi, shuning uchun tranzaksiya yaratilmaydi.

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Shaxsiy operatsiyalar

Kontekst

Tashkilotlarning umumiy talabi ma'lumotlarni himoya qilishdir. Misol sifatida, qaysi stsenariyni ko'rib chiqing Supermarket dengiz mahsulotlarini saqlash uchun ombor maydonini alohida joydan ijaraga oladi Sotuvchi:

  • Sotuvchi IoT sensorlaridan foydalanib, har 30 soniyada harorat qiymatlarini o'qiydi va ularni uzatadi Supermarketga;
  • bu qiymatlar faqat mavjud bo'lishi kerak Sotuvchiga и Supermarketga, konsorsium tomonidan tarmoqqa ulangan.

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Yuqoridagi diagrammada tasvirlangan to'rtta vazifani bajaramiz.

  • Shaxsiy tranzaktsiyalarni namoyish qilish uchun oldingi stsenariydagi bir xil uchta tugunlardan foydalanamiz:
  • Supermarket shaxsiy bo'lgan aqlli shartnomani o'rnatadi Supermarket и Sotuvchi.
  • Uchinchi tomon aqlli shartnomaga kirish huquqiga ega emas.

Biz usullarni chaqiramiz get и set Nomidan Supermarket и Sotuvchi xususiy Kvorum bitimini namoyish qilish.

  1. Biz ishtirokchilar uchun shaxsiy shartnoma tuzamiz Supermarket и Sotuvchi ishtirokchi orqali Supermarket:

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

  2. Keling, haroratni dan o'rnatamiz Uchinchi tomon (tashqi tugun) va harorat qiymatini oling:

    // 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. Keling, haroratni dan o'rnatamiz Sotuvchi (ichki tugun) va harorat qiymatini oling:

    Bu stsenariydagi harorat aqlli kontraktdagi 12 qiymatini qaytarishi kerak. Shuni yodda tuting Sotuvchi bu yerda aqlli shartnomaga ruxsat berilgan.

    // 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. Biz haroratni dan olamiz Uchinchi tomon (tashqi tugun):

    3-bosqichda harorat 12 ga o'rnatildi, lekin Uchinchi tomon aqlli shartnomaga kirish imkoniga ega emas. Shuning uchun qaytarish qiymati null bo'lishi kerak.

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

    Keyinchalik, biz Quorum tarmog'ida shaxsiy tranzaktsiyalarni amalga oshirishni batafsil ko'rib chiqamiz web3.js. Kodning aksariyati ommaviy tranzaktsiyalar uchun bir xil bo'lganligi sababli, biz faqat shaxsiy tranzaktsiyalar uchun farq qiladigan qismlarni ajratib ko'rsatamiz.

E'tibor bering, tarmoqqa yuklangan shartnoma o'zgarmasdir, shuning uchun ruxsat etilgan kirish tegishli tugunlarga shartnoma o'rnatilgandan keyin emas, balki o'sha paytdagi ommaviy shartnomani yoqish orqali berilishi kerak.

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;
  });
}

Xususiy operatsiyalar xuddi shunday tarzda amalga oshiriladi - bajarilish vaqtida ishtirokchilarning ochiq kalitini kiritish orqali.

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;
  });
}

Endi biz yugurishimiz mumkin private.js quyidagi natijalar bilan:

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

Chainstack-dagi Kvorum tadqiqotchisi quyidagilarni ko'rsatadi:

  • ishtirokchidan shartnomani tarqatish Supermarket;
  • Ijroiya SetTemperature от Uchinchi tomon;
  • Ijroiya SetTemperature ishtirokchidan Sotuvchi.

Web3 yordamida JPMorgan Quorum blokcheynida davlat va xususiy operatsiyalarni amalga oshiring

Ko'rib turganingizdek, ikkala tranzaktsiya ham yakunlandi, lekin faqat ishtirokchidan olingan operatsiya Sotuvchi shartnomadagi haroratni yangiladi. Shunday qilib, xususiy bitimlar o'zgarmaslikni ta'minlaydi, lekin shu bilan birga uchinchi shaxsga ma'lumotlarni oshkor qilmaydi.

xulosa

Biz ikki tomon - supermarket va ombor egasi o'rtasida tarmoqni o'rnatish orqali ombordagi harorat to'g'risidagi dolzarb ma'lumotlarni taqdim etish uchun Quorumning tijorat maqsadlarida foydalanish holatini ko'rib chiqdik.

Biz davlat va xususiy tranzaktsiyalar orqali qanday qilib dolzarb harorat ma'lumotlarini saqlab qolish mumkinligini ko'rsatdik.

Ko'p dastur stsenariylari bo'lishi mumkin va siz ko'rib turganingizdek, bu unchalik qiyin emas.

Tajriba qiling, skriptingizni kengaytirishga harakat qiling. Bundan tashqari, blockchain texnologiyasi sanoati 2024 yilga kelib deyarli o‘n barobar o‘sishi mumkin.

Manba: www.habr.com

a Izoh qo'shish