Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рд╕рджрд╕реНрдпрд╛рдВрдиреА рдЧрдгрдкреВрд░реНрддреА JPMorgan рджреНрд╡рд╛рд░реЗ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗрд▓реЗ рдЗрдерд░рд┐рдпрдо-рдЖрдзрд╛рд░рд┐рдд рдмреНрд▓реЙрдХрдЪреЗрди рдЖрд╣реЗ рдЖрдгрд┐ рдЕрдЧрджреА рдЕрд▓реАрдХрдбреЗ Microsoft Azure рджреНрд╡рд╛рд░реЗ рдСрдлрд░ рдХреЗрд▓реЗрд▓реЗ рдкрд╣рд┐рд▓реЗ рд╡рд┐рддрд░рд┐рдд рдЦрд╛рддреЗрд╡рд╣реА рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рдмрдирд▓реЗ рдЖрд╣реЗ.

рдХреЛрд░рдо рдЦрд╛рдЬрдЧреА рдЖрдгрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдЕрдиреЗрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд╛рдкрд░ рдкреНрд░рдХрд░рдгреЗ рдЖрд╣реЗрдд.

рдпрд╛ рд▓реЗрдЦрд╛рдд, рдЖрдореНрд╣реА рдЕрд╢рд╛рдЪ рдПрдХрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░реВ - рд╡реЗрдЕрд░рд╣рд╛рдКрд╕рдЪреНрдпрд╛ рддрд╛рдкрдорд╛рдирд╛рдмрджреНрджрд▓ рдЕрджреНрдпрдпрд╛рд╡рдд рдорд╛рд╣рд┐рддреА рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рдЖрдгрд┐ рд╡реЗрдЕрд░рд╣рд╛рдКрд╕ рдорд╛рд▓рдХ рдпрд╛рдВрдЪреНрдпрд╛рдд рд╡рд┐рддрд░рд┐рдд рдЦрд╛рддреЗрд╡рд╣реА рдиреЗрдЯрд╡рд░реНрдХрдЪреА рддреИрдирд╛рддреА.

рдпрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗрд▓рд╛ рдХреЛрдб рдЖрд╣реЗ GitHub рд╡рд░ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬ.

рд▓реЗрдЦрд╛рдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ:

  • рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░рд╛рдЪреА рдирд┐рд░реНрдорд┐рддреА;
  • рд╡рд╛рдкрд░реВрди рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХрдЪреА рддреИрдирд╛рддреА рдЪреЗрдирд╕реНрдЯреЕрдХ;
  • рдХреЛрд░рдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░;
  • рдХреЛрд░рдо рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░.

рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЗрдВрдЯрд░рдиреЗрдЯ рдСрдл рдерд┐рдВрдЧреНрдЬ (IoT) рдордзреАрд▓ рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХрдЪреНрдпрд╛ рд╕рджрд╕реНрдпрд╛рдВрдЪреНрдпрд╛ рдЧреЛрджрд╛рдорд╛рдВрдордзреАрд▓ рддрд╛рдкрдорд╛рдирд╛рдЪреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдкрд░рд┐рд╕реНрдерд┐рддреА рд╡рд╛рдкрд░рддреЛ.

рд╕рдВрджрд░реНрдн

рд╡реЗрдЕрд░рд╣рд╛рдКрд╕ рдХрдВрдкрдиреНрдпрд╛рдВрдЪрд╛ рдПрдХ рдЧрдЯ рдПрдХрддреНрд░рд┐рддрдкрдгреЗ рдорд╛рд╣рд┐рддреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдВрдШрд╛рдд рдПрдХрддреНрд░ рдпреЗрдд рдЖрд╣реЗ. рдпрд╛рд╕рд╛рдареА рдХрдВрдкрдиреНрдпрд╛рдВрдиреА рдХреЛрд░рдо рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рдард░рд╡рд▓реЗ. рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдореНрд╣реА рджреЛрди рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдХрд░реВ: рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░.

рд╡реНрдпрд╡рд╣рд╛рд░ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕рд╣рднрд╛рдЧреАрдВрджреНрд╡рд╛рд░реЗ рддреЗ рдЬреНрдпрд╛ рдХрдиреНрд╕реЛрд░реНрдЯрд┐рдпрдорд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рд╕рд╛рдареА рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХрддрд░ рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рддреЛ рдХрд┐рдВрд╡рд╛ рдиреЗрдЯрд╡рд░реНрдХрд╡рд░ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯрдордзреАрд▓ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рддреЛ. рдпрд╛ рдХреНрд░рд┐рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХрд╡рд░реАрд▓ рд╕рд░реНрд╡ рдиреЛрдбреНрд╕рд╡рд░ рдкреНрд░рддрд┐рдХреГрддреА рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд.

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд░реНрд╡ рдХрдВрд╕реЛрд░реНрдЯрд┐рдпрдо рд╕рд╣рднрд╛рдЧреАрдВрджреНрд╡рд╛рд░реЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд. рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдЧреЛрдкрдиреАрдпрддреЗрдЪрд╛ рдПрдХ рд╕реНрддрд░ рдЬреЛрдбрддрд╛рдд рдЖрдгрд┐ рдХреЗрд╡рд│ рддреНрдпрд╛ рд╕рд╣рднрд╛рдЧреАрдВрд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд рдЬреНрдпрд╛рдВрдирд╛ рдЕрд╕реЗ рдХрд░рдгреНрдпрд╛рдЪреЗ рдЕрдзрд┐рдХрд╛рд░ рдЖрд╣реЗрдд.

рджреЛрдиреНрд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрд╕рд╛рдареА, рдЖрдореНрд╣реА рд╕реНрдкрд╖реНрдЯрддреЗрд╕рд╛рдареА рд╕рдорд╛рди рдХрд░рд╛рд░ рд╡рд╛рдкрд░рддреЛ.

рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░

рдЦрд╛рд▓реА рдЖрдордЪреНрдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрд╕рд╛рдареА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ рдПрдХ рд╕рд╛рдзрд╛ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░ рдЖрд╣реЗ. рдпрд╛рдд рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдЖрд╣реЗ temperature, рдЬреЗ рд╡рд╛рдкрд░реВрди рдмрджрд▓рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ set рдЖрдгрд┐ рдкрджреНрдзрддреАрдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рд╛ 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;
  }
}

рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд░рд╛рд░рд╛рд╕рд╛рдареА web3.js, рддреЗ ABI рдлреЙрд░рдореЕрдЯ рдЖрдгрд┐ рдмрд╛рдЗрдЯрдХреЛрдбрдордзреНрдпреЗ рднрд╛рд╖рд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рдгреЗ formatContractрдЦрд╛рд▓реА рд╡рд╛рдкрд░реВрди рдХрд░рд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЛ solc-js.

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

рдкреВрд░реНрдг рдЭрд╛рд▓реЗрд▓рд╛ рдХрд░рд╛рд░ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

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

рдЖрддрд╛ рдХрд░рд╛рд░ рддрдпрд╛рд░ рдЭрд╛рд▓рд╛ рдЖрд╣реЗ, рдЖрдореНрд╣реА рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рдд рдХрд░реВ рдЖрдгрд┐ рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХрд░реВ.

рдиреЛрдб рдЙрдкрдпреЛрдЬрди

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рдиреЛрдб рддреИрдирд╛рдд рдХрд░рдгреЗ рдЦреВрдк рд╢реНрд░рдо-рдХреЗрдВрджреНрд░рд┐рдд рдЕрд╕реВ рд╢рдХрддреЗ рдЖрдгрд┐ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░реВрди рдмрджрд▓рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдЪреЗрдирд╕реНрдЯреЕрдХ.

рдЦрд╛рд▓реА рд░рд╛рдлреНрдЯ рдПрдХрдордд рдЖрдгрд┐ рддреАрди рдиреЛрдбреНрд╕рд╕рд╣ рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╣реЗ.

рдкреНрд░рдердо, рдПрдХ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░реВ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ рдХреЛрд░рдо рдкреНрд░рдХрд▓реНрдк рдореНрд╣рдгреВ:

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рдЪрд▓рд╛ Google рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рд░рд╛рдлреНрдЯ рдПрдХрдорддрд╛рдиреЗ рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рддрдпрд╛рд░ рдХрд░реВрдпрд╛:

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдЖрдзреАрдЪ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдиреЛрдбрдордзреНрдпреЗ рдЖрдгрдЦреА рджреЛрди рдиреЛрдб рдЬреЛрдбреВрдпрд╛:

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рддреАрди рдЪрд╛рд▓реВ рдиреЛрдбреНрд╕:

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рдиреЛрдб рддрдкрд╢реАрд▓ рдкреГрд╖реНрда RPC рдПрдВрдбрдкреЙрдЗрдВрдЯ, рдкрдмреНрд▓рд┐рдХ рдХреА рдЗ. рджрд╛рдЦрд╡рддреЗ.

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рдд рдХреЗрд▓реЗ рдЖрд╣реЗ. рдЪрд▓рд╛ рдЖрддрд╛ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯ рд▓рд╛рдЧреВ рдХрд░реВ рдЖрдгрд┐ рд╡рд╛рдкрд░реВрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реВ web3.js.

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░

рд╕рдВрджрд░реНрдн

рдЦрд░реНрдЪ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЧреЛрджрд╛рдорд╛рдЪреЗ рддрд╛рдкрдорд╛рди рдЦреВрдк рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ, рд╡рд┐рд╢реЗрд╖рдд: рдЙрдк-рд╢реВрдиреНрдп рддрд╛рдкрдорд╛рдирд╛рдд рд╕рд╛рдард╡рд┐рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рдЙрддреНрдкрд╛рджрдирд╛рдВрд╕рд╛рдареА.

рдХрдВрдкрдиреНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рднреМрдЧреЛрд▓рд┐рдХ рд╕реНрдерд╛рдирд╛рдЪреЗ рдмрд╛рд╣реЗрд░реАрд▓ рддрд╛рдкрдорд╛рди рд░рд┐рдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рддреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд▓реЗрдЬрд░рдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдб рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрдКрди, рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╣рднрд╛рдЧреА рдЦрд░реНрдЪ рдЖрдгрд┐ рд╡реЗрд│ рдХрдореА рдХрд░рддрд╛рдд.

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рдЖрдореНрд╣реА рддреАрди рдХрд╛рд░реНрдпреЗ рдХрд░реВ, рдЬреЗ рдЖрдХреГрддреАрдордзреНрдпреЗ рд╕реНрдкрд╖реНрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ:

  1. рджреНрд╡рд╛рд░реЗ рдЖрдореНрд╣реА рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХрд░реВ рдиреЛрдб 1:

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

  2. рджреНрд╡рд╛рд░реЗ рддрд╛рдкрдорд╛рди рд╕реЗрдЯ рдХрд░рд╛ рдиреЛрдб 2 3 рдЕрдВрд╢рд╛рдВрдиреА:

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

  3. рдиреЛрдб 3 рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░рд╛рддреВрди рдорд╛рд╣рд┐рддреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓. рдХрд░рд╛рд░ 3 рдЕрдВрд╢ рдореВрд▓реНрдп рдкрд░рдд рдХрд░реЗрд▓:

    const temp = await getTemperature(raft3Node, contractAddress);
    console.log(тАШRetrieved contract TemperatureтАЩ, temp);

    рдкреБрдвреЗ, рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рд╡рд╛рдкрд░реВрди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╕реЗ рдЪрд╛рд▓рд╡рд╛рдпрдЪреЗ рддреЗ рдЖрдореНрд╣реА рдкрд╛рд╣реВ web3.js.

рдЖрдореНрд╣реА рддреАрди рдиреЛрдбреНрд╕рд╕рд╛рдареА RPC рджреНрд╡рд╛рд░реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реБрд░реВ рдХрд░рддреЛ:

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

рдЪрд▓рд╛ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░реВрдпрд╛:

// 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 рдХрд░рд╛рд░рд╛рд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рд╕рд╛рдареА рджреЛрди рдкрджреНрдзрддреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ: call ╨╕ send.

рдЪрд▓рд╛ рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯ рддрд╛рдкрдорд╛рди рдЕрдВрдорд▓рд╛рдд рдЖрдгреВрди рдЕрдкрдбреЗрдЯ рдХрд░реВрдпрд╛ set web3 рдкрджреНрдзрдд рд╡рд╛рдкрд░реВрди 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;
  });
}

рдкреБрдвреЗ рдЖрдкрдг web3 рдкрджреНрдзрдд рд╡рд╛рдкрд░рддреЛ call рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯ рддрд╛рдкрдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рдкрджреНрдзрдд рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ call рд╕реНрдерд╛рдирд┐рдХ рдиреЛрдбрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА.

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

рдЖрддрд╛ рддреБрдореНрд╣реА рдзрд╛рд╡реВ рд╢рдХрддрд╛ public.js рдЦрд╛рд▓реАрд▓ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА:

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

рдкреБрдвреЗ, рдЦрд╛рд▓реА рджрд╛рдЦрд╡рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдЖрдкрдг рдЪреЗрдирд╕реНрдЯреЕрдХ рдкреЕрдиреЗрд▓рдордзреАрд▓ рдХреЛрд░рдо рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░рдордзреАрд▓ рдиреЛрдВрджреА рдкрд╛рд╣реВ рд╢рдХрддреЛ.

рд╕рд░реНрд╡ рддреАрди рдиреЛрдбреНрд╕рдиреЗ рдкрд░рд╕реНрдкрд░ рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрд▓рд╛ рдЖрдгрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ:

  1. рдкрд╣рд┐рд▓реНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдиреЗ рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХреЗрд▓рд╛.
  2. рджреБрд╕рд▒реНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдиреЗ рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯ рддрд╛рдкрдорд╛рди 3 рдЕрдВрд╢рд╛рдВрд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ.
  3. рддрд╛рдкрдорд╛рди рд╕реНрдерд╛рдирд┐рдХ рдиреЛрдбрджреНрд╡рд╛рд░реЗ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рдХреЛрдгрддрд╛рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рддрдпрд╛рд░ рд╣реЛрдд рдирд╛рд╣реА.

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░

рд╕рдВрджрд░реНрдн

рд╕рдВрд╕реНрдерд╛рдВрдЪреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореНрд╣рдгрдЬреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдХреНрд╖рдг. рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди, рдПрдХ рдкрд░рд┐рд╕реНрдерд┐рддреА рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреНрдпрд╛ рдЬреНрдпрд╛рдордзреНрдпреЗ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рд╕реАрдлреВрдб рд╕рд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрдЕрд░рд╣рд╛рдКрд╕ рдЬрд╛рдЧрд╛ рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддреЗ рд╡рд┐рдХреНрд░реЗрддрд╛:

  • рд╡рд┐рдХреНрд░реЗрддрд╛ IoT рд╕реЗрдиреНрд╕рд░ рд╡рд╛рдкрд░реВрди, рджрд░ 30 рд╕реЗрдХрдВрджрд╛рдВрдиреА рддрд╛рдкрдорд╛рди рдореВрд▓реНрдпреЗ рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЛ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯрд▓рд╛;
  • рд╣реА рдореВрд▓реНрдпреЗ рдлрдХреНрдд рдЙрдкрд▓рдмреНрдз рдЕрд╕рд╛рд╡реАрдд рд╡рд┐рдХреНрд░реЗрддреНрдпрд╛рд▓рд╛ ╨╕ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯрд▓рд╛, рдПрдХрд╛ рд╕рдВрдШрд╛рджреНрд╡рд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗрд▓реЗрд▓реЗ.

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рд╡рд░реАрд▓ рдЖрдХреГрддреАрдд рджрд╛рдЦрд╡рд▓реЗрд▓реА рдЪрд╛рд░ рдХрд╛рд░реНрдпреЗ рдЖрдкрдг рдкреВрд░реНрдг рдХрд░реВ.

  • рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдорд╛рдЧреАрд▓ рдкрд░рд┐рд╕реНрдерд┐рддреАрддреАрд▓ рд╕рдорд╛рди рддреАрди рдиреЛрдбреНрд╕ рд╡рд╛рдкрд░рддреЛ:
  • рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХрд░рддреЗ рдЬреЗ рдЦрд╛рдЬрдЧреА рдЖрд╣реЗ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ ╨╕ рд╡рд┐рдХреНрд░реЗрддрд╛.
  • рддрд┐рд╕рд░реА рдмрд╛рдЬреВ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░рд╛рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЕрдзрд┐рдХрд╛рд░ рдирд╛рд╣реА.

рдЖрдореНрд╣реА рдкрджреНрдзрддреА рдХреЙрд▓ рдХрд░реВ get ╨╕ set рдЪреНрдпрд╛ рд╡рддреАрдиреЗ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ ╨╕ рд╡рд┐рдХреНрд░реЗрддрд╛ рдЦрд╛рдЬрдЧреА рдХреЛрд░рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

  1. рдЖрдореНрд╣реА рд╕рд╣рднрд╛рдЧреАрдВрд╕рд╛рдареА рдПрдХ рдЦрд╛рдЬрдЧреА рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХрд░реВ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ ╨╕ рд╡рд┐рдХреНрд░реЗрддрд╛ рд╕рд╣рднрд╛рдЧреАрджреНрд╡рд╛рд░реЗ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ:

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

  2. рдкрд╛рд╕реВрди рддрд╛рдкрдорд╛рди рд╕реЗрдЯ рдХрд░реВ рддреГрддреАрдп рдкрдХреНрд╖ (рдмрд╛рд╣реНрдп рдиреЛрдб) рдЖрдгрд┐ рддрд╛рдкрдорд╛рди рдореВрд▓реНрдп рдорд┐рд│рд╡рд╛:

    // 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. рдкрд╛рд╕реВрди рддрд╛рдкрдорд╛рди рд╕реЗрдЯ рдХрд░реВ рд╡рд┐рдХреНрд░реЗрддрд╛ (рдЕрдВрддрд░реНрдЧрдд рдиреЛрдб) рдЖрдгрд┐ рддрд╛рдкрдорд╛рди рдореВрд▓реНрдп рдорд┐рд│рд╡рд╛:

    рдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрддреАрд▓ рддрд╛рдкрдорд╛рдирд╛рдиреЗ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯрдордзреВрди 12 рдореВрд▓реНрдп рдкрд░рдд рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ. рдХреГрдкрдпрд╛ рдпрд╛рдЪреА рдиреЛрдВрдж рдШреНрдпрд╛ рд╡рд┐рдХреНрд░реЗрддрд╛ рдпреЗрдереЗ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░рд╛рд╕рд╛рдареА рдЕрдзрд┐рдХреГрдд рдкреНрд░рд╡реЗрд╢ рдЖрд╣реЗ.

    // 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. рдкрд╛рд╕реВрди рддрд╛рдкрдорд╛рди рдорд┐рд│рддреЗ рддреГрддреАрдп рдкрдХреНрд╖ (рдмрд╛рд╣реНрдп рдиреЛрдб):

    рдЪрд░рдг 3 рдордзреНрдпреЗ рддрд╛рдкрдорд╛рди 12 рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ, рдкрд░рдВрддреБ рддрд┐рд╕рд░реА рдмрд╛рдЬреВ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░рд╛рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдирд╛рд╣реА. рдореНрд╣рдгреВрди рдкрд░рддрд╛рд╡рд╛ рдореВрд▓реНрдп рд╢реВрдиреНрдп рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

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

    рдкреБрдвреЗ, рдЖрдореНрд╣реА рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХрд╡рд░ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрд╡рд│реВрди рдкрд╛рд╣реВ web3.js. рдмрд╣реБрддреЗрдХ рдХреЛрдб рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрд╕рд╛рдареА рд╕рдорд╛рди рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЖрдореНрд╣реА рдлрдХреНрдд рддреЗрдЪ рднрд╛рдЧ рд╣рд╛рдпрд▓рд╛рдЗрдЯ рдХрд░реВ рдЬреЗ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрд╕рд╛рдареА рд╡реЗрдЧрд│реЗ рдЖрд╣реЗрдд.

рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдиреЗрдЯрд╡рд░реНрдХрд╡рд░ рдЕрдкрд▓реЛрдб рдХреЗрд▓реЗрд▓рд╛ рдХрд░рд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЖрд╣реЗ, рддреНрдпрд╛рдореБрд│реЗ рдХрд░рд╛рд░рд╛рдирдВрддрд░ рдирд╡реНрд╣реЗ, рддрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░рд╛рд░рд╛рдЪреНрдпрд╛ рд╡реЗрд│реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░рд╛рд░ рд╕рдХреНрд╖рдо рдХрд░реВрди рдпреЛрдЧреНрдп рдиреЛрдбреНрд╕рдирд╛ рдкрд░рд╡рд╛рдирдЧреА рдЕрд╕рд▓реЗрд▓рд╛ рдкреНрд░рд╡реЗрд╢ рдордВрдЬреВрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

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

рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрд╢рд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд - рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреНрдпрд╛ рд╡реЗрд│реА рд╕рд╣рднрд╛рдЧреАрдВрдЪреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░реВрди.

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

рдЖрддрд╛ рдЖрдкрдг рдзрд╛рд╡реВ рд╢рдХрддреЛ рдЦрд╛рдЬрдЧреА.рдЬреЗ.рдПрд╕ рдЦрд╛рд▓реАрд▓ рдкрд░рд┐рдгрд╛рдорд╛рдВрд╕рд╣:

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

рдЪреЗрдирд╕реНрдЯреЕрдХрдордзреАрд▓ рдХреЛрд░рдо рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдЦрд╛рд▓реАрд▓ рдЧреЛрд╖реНрдЯреА рджрд░реНрд╢рд╡реЗрд▓:

  • рд╕рд╣рднрд╛рдЧреАрдВрдХрдбреВрди рдХрд░рд╛рд░рд╛рдЪреА рддреИрдирд╛рддреА рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ;
  • рдкрд░рд┐рдкреВрд░реНрддреА SetTemperature рдкрд╛рд╕реВрди рддреГрддреАрдп рдкрдХреНрд╖;
  • рдкрд░рд┐рдкреВрд░реНрддреА SetTemperature рд╕рд╣рднрд╛рдЧреА рдХрдбреВрди рд╡рд┐рдХреНрд░реЗрддрд╛.

Web3 рд╡рд╛рдкрд░реВрди JPMorgan Quorum blockchain рд╡рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛

рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рджреЛрдиреНрд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдкреВрд░реНрдг рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рдХреЗрд╡рд│ рд╕рд╣рднрд╛рдЧреАрдХрдбреВрди рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рдХреНрд░реЗрддрд╛ рдХрд░рд╛рд░рд╛рдордзреНрдпреЗ рддрд╛рдкрдорд╛рди рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛рдд, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪ рд╡реЗрд│реА рддреГрддреАрдп рдкрдХреНрд╖рд╛рд▓рд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрдЯ рдХрд░рдд рдирд╛рд╣реАрдд.

рдирд┐рд╖реНрдХрд░реНрд╖

рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рдЖрдгрд┐ рд╡реЗрдЕрд░рд╣рд╛рдКрд╕ рдорд╛рд▓рдХ - рджреЛрди рдкрдХреНрд╖рд╛рдВрдордзреНрдпреЗ рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рдд рдХрд░реВрди рд╡реЗрдЕрд░рд╣рд╛рдКрд╕рдордзреНрдпреЗ рдЕрджреНрдпрдпрд╛рд╡рдд рддрд╛рдкрдорд╛рди рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрд░рдорд╕рд╛рдареА рдЖрдореНрд╣реА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд╛рдкрд░ рдкреНрд░рдХрд░рдг рдкрд╛рд╣рд┐рд▓реЗ.

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рджреЛрдиреНрд╣реА рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрджреНрд╡рд╛рд░реЗ рддрд╛рдкрдорд╛рдирд╛рдЪреА рдЕрджреНрдпрдпрд╛рд╡рдд рдорд╛рд╣рд┐рддреА рдХрд╢реА рд░рд╛рдЦрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рд╣реЗ рдЖрдореНрд╣реА рджрд╛рдЦрд╡рд▓реЗ.

рддреЗрдереЗ рдмрд░реЗрдЪ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рд┐рд╕реНрдерд┐рддреА рдЕрд╕реВ рд╢рдХрддрд╛рдд рдЖрдгрд┐ рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рддреЗ рдЕрдЬрд┐рдмрд╛рдд рдХрдареАрдг рдирд╛рд╣реА.

рдкреНрд░рдпреЛрдЧ рдХрд░рд╛, рддреБрдордЪреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рд╕реНрддреГрдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛. рд╢рд┐рд╡рд╛рдп, рдмреНрд▓реЙрдХрдЪреЗрди рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдЙрджреНрдпреЛрдЧ 2024 рдкрд░реНрдпрдВрдд рдЬрд╡рд│рдкрд╛рд╕ рджрд╣рд╛рдкрдЯ рд╡рд╛рдв рд╣реЛрдК рд╢рдХрддреЗ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛