Web3 рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JPMorgan Quorum blockchain рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

Web3 рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JPMorgan Quorum blockchain рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдЗрдпрддреНрддрд╛ JPMorgan рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ Ethereum-рдЖрдзрд╛рд░рд┐рдд рдмреНрд▓рдХрдЪреЗрди рд╣реЛ рд░ рд╕рдмреИрднрдиреНрджрд╛ рд╣рд╛рд▓реИ 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 рдврд╛рдБрдЪрд╛ рд░ bytecode рдорд╛ рдЕрдиреБрд╡рд╛рдж рд╣реБрдиреБрдкрд░реНрдЫред рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ 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 рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдЧреБрдЧрд▓ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рд░рд╛рдлреНрдЯ рд╕рд╣рдорддрд┐рдХреЛ рд╕рд╛рде рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ:

Web3 рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JPMorgan Quorum blockchain рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдиреЛрдбрдорд╛ рджреБрдИ рдердк рдиреЛрдбрд╣рд░реВ рдердкреМрдВ:

Web3 рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JPMorgan Quorum blockchain рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рддреАрди рдЪрд╛рд▓реБ рдиреЛрдбрд╣рд░реВ:

Web3 рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JPMorgan Quorum blockchain рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдиреЛрдб рд╡рд┐рд╡рд░рдг рдкреГрд╖реНрдард▓реЗ RPC рдЕрдиреНрддреНрдпрдмрд┐рдиреНрджреБ, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдЮреНрдЬреА, рдЖрджрд┐ рджреЗрдЦрд╛рдЙрдБрдЫред

Web3 рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JPMorgan Quorum blockchain рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рде рдЧрд░рд┐рдПрдХреЛ рдЫред рдЕрдм рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реМрдВ web3.js.

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди

рдкреНрд░рд╕реНрдЧ

рдЧреЛрджрд╛рдордХреЛ рддрд╛рдкрдХреНрд░рдо рд▓рд╛рдЧрдд рдШрдЯрд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЙрдк-рд╢реВрдиреНрдп рддрд╛рдкрдХреНрд░рдордорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдЪрд╛рд╣рдиреЗ рдЙрддреНрдкрд╛рджрдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ред

рдХрдореНрдкрдиреАрд╣рд░реВрд▓рд╛рдИ рдЙрдиреАрд╣рд░реВрдХреЛ рднреМрдЧреЛрд▓рд┐рдХ рд╕реНрдерд╛рдирдХреЛ рдмрд╛рд╣рд┐рд░реА рддрд╛рдкрдХреНрд░рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордпрдорд╛ рд╕рд╛рдЭрд╛ рдЧрд░реНрди рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЦрд╛рддрд╛рдорд╛ рд░реЗрдХрд░реНрдб рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдПрд░, рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╣рднрд╛рдЧреАрд╣рд░реВрд▓реЗ рд▓рд╛рдЧрдд рд░ рд╕рдордп рдШрдЯрд╛рдЙрдБрдЫрдиреНред

Web3 рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JPMorgan Quorum blockchain рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╣рд╛рдореА рддреАрди рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрдиреЗрдЫреМрдВ, рд░реЗрдЦрд╛рдЪрд┐рддреНрд░рдорд╛ рдЪрд┐рддреНрд░рдг:

  1. рд╣рд╛рдореА рд╕рдореНрдЭреМрддрд╛ рдорд╛рд░реНрдлрдд рддреИрдирд╛рдд рдЧрд░реНрдиреЗрдЫреМрдВ рдиреЛрдб реж:

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

  2. рдорд╛рд░реНрдлрдд рддрд╛рдкрдорд╛рди рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдиреЛрдб реж 3 рдбрд┐рдЧреНрд░реА рджреНрд╡рд╛рд░рд╛:

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

  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. рдмрд╛рдЯ рддрд╛рдкрдорд╛рди рд╕реЗрдЯ рдЧрд░реМрдВ рд╡рд┐рдХреНрд░реЗрддрд╛ (рдЖрдиреНрддрд░рд┐рдХ рдиреЛрдб) рд░ рддрд╛рдкрдорд╛рди рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН:

    рдпрд╕ рдкрд░рд┐рджреГрд╢реНрдпрдХреЛ рддрд╛рдкрдХреНрд░рдорд▓реЗ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзрдмрд╛рдЯ рдорд╛рди резреи рдлрд░реНрдХрд╛рдЙрдиреБ рдкрд░реНрдЫред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рд╡рд┐рдХреНрд░реЗрддрд╛ рдпрд╣рд╛рдБ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзрдорд╛ рдЕрдзрд┐рдХреГрдд рдкрд╣реБрдБрдЪ рдЫред

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

рдЕрдм рд╣рд╛рдореА рджреМрдбрди рд╕рдХреНрдЫреМрдВ private.js рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдорд╣рд░реБ рд╕рдВрдЧ:

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 рдорд╛ рдХреЛрд░рдо рдЕрдиреНрд╡реЗрд╖рдХрд▓реЗ рдирд┐рдореНрди рджреЗрдЦрд╛рдЙрдиреЗрдЫ:

  • рд╕рд╣рднрд╛рдЧреАрдмрд╛рдЯ рд╕рдореНрдЭреМрддрд╛рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ;
  • рдкреНрд░рджрд░реНрд╢рди SetTemperature рджреЗрдЦрд┐ рддреЗрд╕реНрд░реЛ рдкрдХреНрд╖;
  • рдкреНрд░рджрд░реНрд╢рди SetTemperature рдПрдХ рд╕рд╣рднрд╛рдЧреАрдмрд╛рдЯ рд╡рд┐рдХреНрд░реЗрддрд╛.

Web3 рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JPMorgan Quorum blockchain рдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рджреБрдмреИ рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреВрд░рд╛ рднрдПрдХрд╛ рдЫрдиреН, рддрд░ рд╕рд╣рднрд╛рдЧреАрдмрд╛рдЯ рдорд╛рддреНрд░ рд▓реЗрдирджреЗрди рд╡рд┐рдХреНрд░реЗрддрд╛ рд╕рдореНрдЭреМрддрд╛рдорд╛ рддрд╛рдкрдорд╛рди рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░рд┐рдпреЛред рдпрд╕рд░реА, рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд▓реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ, рддрд░ рдПрдХреИ рд╕рдордпрдорд╛ рддреЗрд╕реНрд░реЛ рдкрдХреНрд╖рд▓рд╛рдИ рдбреЗрдЯрд╛ рдкреНрд░рдХрдЯ рдЧрд░реНрджреИрдиред

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

рд╣рд╛рдореАрд▓реЗ рджреБрдИ рдкрдХреНрд╖рд╣рд░реВ - рдПрдХ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рд░ рдПрдХ рдЧреЛрджрд╛рдо рдорд╛рд▓рд┐рдХ рдмреАрдЪрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рде рдЧрд░реЗрд░ рдЧреЛрджрд╛рдордорд╛ рдЕрдк-рдЯреБ-рдбреЗрдЯ рддрд╛рдкрдХреНрд░рдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдЧрд░реНрди рдХреЛрд░рдордХреЛ рд▓рд╛рдЧрд┐ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдпреЛрдЧрдХреЛ рдорд╛рдорд▓рд╛ рд╣реЗрд░реНрдпреМрдВред

рд╣рд╛рдореАрд▓реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рджреБрд╡реИ рд▓реЗрдирджреЗрдирд╣рд░реВ рдорд╛рд░реНрдлрдд рдХрд╕рд░реА рдЕрдк-рдЯреБ-рдбреЗрдЯ рддрд╛рдкрдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рдХрд╛рдпрдо рд░рд╛рдЦреНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреЗрд░ рджреЗрдЦрд╛рдпреМрдВред

рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпрд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫрдиреН рд░, рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдпреЛ рдХреБрдиреИ рдкрдирд┐ рдЧрд╛рд╣реНрд░реЛ рдЫреИрдиред

рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЖрдлреНрдиреЛ рд▓рд┐рдкрд┐ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрд╕рдмрд╛рд╣реЗрдХ, blockchain рдкреНрд░рд╡рд┐рдзрд┐ рдЙрджреНрдпреЛрдЧ 2024 рд╕рдореНрдо рд▓рдЧрднрдЧ рджрд╢ рдЧреБрдгрд╛ рдмрдвреНрди рд╕рдХреНрдЫ.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди