Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

yetərsay JPMorgan tərəfindən hazırlanmış Ethereum əsaslı blokçeyndir və bu yaxınlarda Microsoft Azure tərəfindən təklif edilən ilk paylanmış kitab platforması oldu.

Quorum özəl və ictimai əməliyyatları dəstəkləyir və bir çox kommersiya istifadə hallarına malikdir.

Bu yazıda biz belə bir ssenarini - anbarın temperaturu haqqında aktual məlumat vermək üçün supermarket və anbar sahibi arasında paylanmış kitablar şəbəkəsinin yerləşdirilməsini nəzərdən keçirəcəyik.

Bu dərslikdə istifadə olunan kod GitHub-da depolar.

Məqalə aşağıdakıları əhatə edir:

  • ağıllı müqavilənin yaradılması;
  • istifadə edərək Quorum şəbəkəsinin yerləşdirilməsi Zəncir yığını;
  • Kvorum açıq əməliyyatlar;
  • Şəxsi əməliyyatlar kvorum.

Nümunə etmək üçün biz Əşyaların İnterneti (IoT) daxilində Quorum şəbəkəsinin üzvlərinin anbarlarında temperaturun monitorinqi üçün ssenaridən istifadə edirik.

Kontekst

Bir qrup anbar şirkətləri blokçeyndə məlumatları birgə saxlamaq və prosesləri avtomatlaşdırmaq üçün konsorsiumda birləşir. Bunun üçün şirkətlər Quorum-dan istifadə etmək qərarına gəliblər. Bu yazıda biz iki ssenarini əhatə edəcəyik: ictimai əməliyyatlar və özəl əməliyyatlar.

Əməliyyatlar müxtəlif iştirakçılar tərəfindən aid olduqları konsorsiumla qarşılıqlı əlaqə yaratmaq üçün yaradılır. Hər bir əməliyyat ya müqaviləni yerləşdirir və ya məlumatı şəbəkəyə yükləmək üçün müqavilədəki funksiyanı çağırır. Bu hərəkətlər şəbəkədəki bütün qovşaqlara təkrarlanır.

İctimai əməliyyatlar bütün konsorsium iştirakçıları tərəfindən baxa bilər. Şəxsi əməliyyatlar məxfilik qatını əlavə edir və yalnız bunu etmək hüququ olan iştirakçılar üçün əlçatandır.

Hər iki ssenari üçün aydınlıq üçün eyni müqavilədən istifadə edirik.

Ağıllı müqavilə

Aşağıda ssenarimiz üçün yaradılmış sadə ağıllı müqavilədir. Onun ictimai dəyişəni var temperatureistifadə edərək dəyişdirilə bilər set və üsulla qəbul edin 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;
  }
}

Müqavilə ilə işləmək üçün web3.js, ABI formatına və bayt koduna tərcümə edilməlidir. Funksiyadan istifadə etməklə formatContractaşağıda istifadə edərək müqavilə tərtib edir solc-js.

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

Tamamlanmış müqavilə belə görünür:

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

İndi müqavilə hazırdır, biz şəbəkəni yerləşdirəcəyik və müqaviləni yerləşdirəcəyik.

Düyün yerləşdirilməsi

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Bir qovşağın yerləşdirilməsi olduqca əmək tələb edə bilər və bu proses bir xidmətdən istifadə etməklə əvəz edilə bilər Zəncir yığını.

Aşağıda Raft konsensus və üç qovşaq ilə Quorum şəbəkəsinin yerləşdirilməsi prosesidir.

Əvvəlcə bir layihə yaradaq və onu Quorum Layihəsi adlandıraq:

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Google Bulud Platformasında Raft konsensus ilə Quorum şəbəkəsi yaradaq:

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Defolt olaraq artıq yaradılmış node-a daha iki qovşaq əlavə edək:

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Üç işləyən qovşaq:

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Düyün təfərrüatları səhifəsində RPC son nöqtəsi, açıq açar və s. göstərilir.

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Şəbəkə yerləşdirilib. İndi ağıllı müqavilələri yerləşdirək və istifadə edərək əməliyyatlar həyata keçirək web3.js.

İctimai əməliyyatlar

Kontekst

Xüsusilə sıfırdan aşağı temperaturda saxlanması nəzərdə tutulan məhsullar üçün anbar temperaturu xərclərin azaldılmasında böyük əhəmiyyət kəsb edir.

Şirkətlərə öz coğrafi yerlərinin xarici temperaturunu real vaxt rejimində paylaşmağa və onu dəyişməz kitabda qeyd etməyə icazə verməklə, şəbəkə iştirakçıları xərcləri və vaxtı azaldır.

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Diaqramda təsvir olunan üç tapşırığı yerinə yetirəcəyik:

  1. Biz vasitəsilə müqaviləni yerləşdirəcəyik Node 1:

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

  2. vasitəsilə temperaturu təyin edin Node 2 3 dərəcə ilə:

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

  3. Node 3 smart müqavilədən məlumat alacaq. Müqavilə dəyəri 3 dərəcə qaytarır:

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

    Bundan sonra Quorum şəbəkəsində ictimai əməliyyatın necə həyata keçiriləcəyinə baxacağıq web3.js.

Biz üç qovşaq üçün RPC vasitəsilə nümunəyə başlayırıq:

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

Ağıllı müqaviləni tətbiq edək:

// 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 müqavilə ilə qarşılıqlı əlaqə üçün iki üsul təqdim edir: call и send.

İcra edərək müqavilənin temperaturunu yeniləyək set web3 metodundan istifadə etməklə 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;
  });
}

Sonra web3 metodundan istifadə edirik call müqavilə temperaturu əldə etmək. Unutmayın ki, üsul call yerli qovşaqda icra edilir və əməliyyat blokçeynində yaradılmayacaq.

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

İndi qaça bilərsiniz public.js aşağıdakı nəticəni əldə etmək üçün:

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

Bundan sonra, aşağıda göstərildiyi kimi, Chainstack panelində Quorum Explorer-də qeydlərə baxa bilərik.

Hər üç qovşaq qarşılıqlı əlaqədə oldu və əməliyyatlar yeniləndi:

  1. İlk əməliyyat müqaviləni yerləşdirdi.
  2. İkinci əməliyyat müqavilənin temperaturunu 3 dərəcə təyin etdi.
  3. Temperatur yerli qovşaq vasitəsilə qəbul edilir, ona görə də heç bir əməliyyat yaradılmır.

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Şəxsi əməliyyatlar

Kontekst

Təşkilatların ümumi tələbi məlumatların qorunmasıdır. Nümunə olaraq hansı ssenarini nəzərdən keçirək Supermarket ayrı-ayrılıqda dəniz məhsulları saxlamaq üçün anbar sahəsi icarəyə götürür Satıcı:

  • Satıcı IoT sensorlarından istifadə edərək, hər 30 saniyədən bir temperatur dəyərlərini oxuyur və ötürür Supermarketə;
  • bu dəyərlər yalnız mövcud olmalıdır Satıcıya и Supermarketə, konsorsium tərəfindən şəbəkələşdirilmişdir.

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Yuxarıdakı diaqramda təsvir olunan dörd tapşırığı yerinə yetirəcəyik.

  • Şəxsi əməliyyatları nümayiş etdirmək üçün əvvəlki ssenaridəki eyni üç qovşaqdan istifadə edirik:
  • Supermarket özəl olan ağıllı müqaviləni yerləşdirir Supermarket и Satıcı.
  • Üçüncü tərəf smart müqaviləyə daxil olmaq hüququ yoxdur.

Biz üsulları çağıracağıq get и set adından Supermarket и Satıcı şəxsi Quorum əməliyyatını nümayiş etdirmək.

  1. İştirakçılar üçün özəl müqavilə bağlayacağıq Supermarket и Satıcı iştirakçı vasitəsilə Supermarket:

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

  2. Gəlin temperaturu təyin edək Üçüncü tərəf (xarici node) və temperatur dəyərini əldə edin:

    // 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. Gəlin temperaturu təyin edək Satıcı (daxili node) və temperatur dəyərini əldə edin:

    Bu ssenaridəki temperatur smart müqavilədən 12 dəyərini qaytarmalıdır. Nəzərə alın ki Satıcı burada ağıllı müqaviləyə icazə verilmişdir.

    // 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. Temperaturu ondan alırıq Üçüncü tərəf (xarici qovşaq):

    3-cü addımda temperatur 12-yə təyin edildi, lakin Üçüncü tərəf smart müqaviləyə çıxışı yoxdur. Buna görə də qaytarılan dəyər null olmalıdır.

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

    Bundan sonra Quorum şəbəkəsində şəxsi əməliyyatların həyata keçirilməsinə daha yaxından nəzər salacağıq web3.js. Kodun əksəriyyəti ictimai əməliyyatlar üçün eyni olduğundan, biz yalnız özəl əməliyyatlar üçün fərqli olan hissələri vurğulayacağıq.

Nəzərə alın ki, şəbəkəyə yüklənmiş müqavilə dəyişməzdir, ona görə də icazəli giriş müvafiq qovşaqlara açıq müqaviləni işə saldıqdan sonra deyil, müqavilənin yerləşdirilməsi zamanı təmin edilməlidir.

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

Şəxsi əməliyyatlar oxşar şəkildə - icra zamanı iştirakçıların açıq açarını daxil etməklə həyata keçirilir.

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

İndi qaça bilərik private.js aşağıdakı nəticələrlə:

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-dəki Quorum tədqiqatçısı aşağıdakıları göstərəcək:

  • iştirakçıdan müqavilənin yerləşdirilməsi Supermarket;
  • İcra SetTemperature etibarən Üçüncü tərəf;
  • İcra SetTemperature bir iştirakçıdan Satıcı.

Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin

Gördüyünüz kimi, hər iki əməliyyat tamamlandı, ancaq iştirakçıdan gələn əməliyyat Satıcı müqavilədəki temperaturu yenilədi. Beləliklə, şəxsi əməliyyatlar dəyişməzliyi təmin edir, lakin eyni zamanda məlumatları üçüncü tərəfə göstərmir.

Nəticə

Biz iki tərəf - supermarket və anbar sahibi arasında şəbəkə yerləşdirməklə anbarda ən son temperatur məlumatını təmin etmək üçün Quorum üçün kommersiya istifadə vəziyyətinə baxdıq.

Həm dövlət, həm də özəl əməliyyatlar vasitəsilə müasir temperatur məlumatlarının necə saxlanıla biləcəyini göstərdik.

Çoxlu tətbiq ssenariləri ola bilər və gördüyünüz kimi, heç də çətin deyil.

Təcrübə edin, skriptinizi genişləndirməyə çalışın. Üstəlik, blockchain texnologiya sənayesi 2024-cü ilə qədər təxminən on dəfə arta bilər.

Mənbə: www.habr.com

Добавить комментарий