Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

Quorum β€” Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ Π½Π° Π±Π°Π·Π΅ Ethereum, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ JPMorgan ΠΈ совсСм Π½Π΅Π΄Π°Π²Π½ΠΎ ΡΡ‚Π°Π²ΡˆΠΈΠΉ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ распрСдСлСнного рССстра, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Microsoft Azure.

Quorum ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΈ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ коммСрчСских сцСнариСв использования.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… сцСнариСв β€” Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ сСти распрСдСлСнного рССстра ΠΌΠ΅ΠΆΠ΄Ρƒ супСрмаркСтом ΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ склада для обСспСчСния Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ складского помСщСния.

Код, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ руководствС, Π»Π΅ΠΆΠΈΡ‚ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π½Π° GitHub.

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚:

  • созданиС смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°;
  • Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ сСти Quorum ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Chainstack;
  • ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Quorum;
  • ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Quorum.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сцСнарий ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ Π² складских помСщСниях участников сСти Quorum Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Internet of Things (IoT).

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚

Π“Ρ€ΡƒΠΏΠΏΠ° складских ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ΡΡ Π² консорциум для совмСстного хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ процСссов Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅. Для этого ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Quorum. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΏΠΎΠΊΡ€ΠΎΠ΅ΠΌ Π΄Π²Π° сцСнария: ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ участниками для взаимодСйствия с консорциумом, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚. КаТдая транзакция Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Π»ΠΈΠ±ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΡΠ΅Ρ‚ΡŒ. Π”Π°Π½Π½Ρ‹Π΅ дСйствия Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° всС Π½ΠΎΠ΄Ρ‹ Π² сСти.

ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ доступны для просмотра всСми участниками консорциума. ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΆΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ слой ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ участникам, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Π½Π° это ΠΏΡ€Π°Π²Π°.

Для ΠΎΠ±ΠΎΠΈΡ… сцСнариСв ΠΌΡ‹ для наглядности ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚.

Π‘ΠΌΠ°Ρ€Ρ‚-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ простой смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, созданный для нашСго сцСнария. Π’ Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ публичная пСрСмСнная 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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π³ΠΎΡ‚ΠΎΠ², ΠΌΡ‹ Ρ€Π°Π·Π²Π΅Ρ€Π½Π΅ΠΌ ΡΠ΅Ρ‚ΡŒ ΠΈ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΠΌ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚.

Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π½ΠΎΠ΄

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π½ΠΎΠ΄Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ довольно Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΌ ΠΈ этот процСсс ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ использованиСм сСрвиса Chainstack.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ процСсс развСртывания сСти Quorum с консСнсусом Raft ΠΈ трСмя Π½ΠΎΠ΄Π°ΠΌΠΈ.

Для Π½Π°Ρ‡Π°Π»Π° Π·Π°Π²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ Quorum Project:

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ΅Ρ‚ΡŒ Quorum с консСнсусом Raft Π½Π° Google Cloud Platform:

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

К ΡƒΠΆΠ΅ созданной ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½ΠΎΠ΄Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Π΅ Π΄Π²Π΅ Π½ΠΎΠ΄Ρ‹:

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

Π’Ρ€ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ Π½ΠΎΠ΄Ρ‹:

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ Π½ΠΎΠ΄Ρ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ RPC endpoint, ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈ Ρ‚. Π΄.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

Π‘Π΅Ρ‚ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся Π΄Π΅ΠΏΠ»ΠΎΠ΅ΠΌ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ web3.js.

ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚

Π’Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° складского ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для сниТСния Π·Π°Ρ‚Ρ€Π°Ρ‚, особСнно для ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для хранСния ΠΏΡ€ΠΈ минусовой Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π΅.

Давая компаниям Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ значСниями внСшнСй Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠΈΡ… гСографичСского полоТСния Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² нСизмСняСмый рССстр, участники сСти ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ расходы ΠΈ врСмя.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

ΠœΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚Ρ€ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅:

  1. Π—Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΠΌ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Ρ‡Π΅Ρ€Π΅Π· Node 1:

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

  2. Установим Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ Ρ‡Π΅Ρ€Π΅Π· Node 2 Π½Π° 3 градуса:

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

  3. Node 3 ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π²Π΅Ρ€Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3 градуса:

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

    Π”Π°Π»Π΅Π΅ рассмотрим ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π² сСти Quorum с использованиСм 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

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ записи Π² эксплорСрС Quorum Π² ΠΏΠ°Π½Π΅Π»ΠΈ Chainstack, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

ВсС Ρ‚Ρ€ΠΈ Π½ΠΎΠ΄Ρ‹ провзаимодСйствовали ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ обновились:

  1. ΠŸΠ΅Ρ€Π²Π°Ρ транзакция Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΠ»Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚.
  2. Вторая транзакция установила Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π² 3 градуса.
  3. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ происходит Ρ‡Π΅Ρ€Π΅Π· Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Π½ΠΎΠ΄Ρƒ, поэтому транзакция Π½Π΅ создана.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚

Частым Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΉ являСтся Π·Π°Ρ‰ΠΈΡ‚Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим сцСнарий, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ CΡƒΠΏΠ΅Ρ€ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ Π°Ρ€Π΅Π½Π΄ΡƒΠ΅Ρ‚ складскоС ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ для хранСния ΠΌΠΎΡ€Π΅ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Ρƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π’Π΅Π½Π΄ΠΎΡ€Π°:

  • Π’Π΅Π½Π΄ΠΎΡ€ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ IoT-Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² считываСт Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π½Ρ‹Π΅ значСния ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 30 сСкунд ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΡ… CΡƒΠΏΠ΅Ρ€ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚Ρƒ;
  • Π΄Π°Π½Π½Ρ‹Π΅ значСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π’Π΅Π½Π΄ΠΎΡ€Ρƒ ΠΈ Π‘ΡƒΠΏΠ΅Ρ€ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚Ρƒ, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹ΠΌ Π² ΡΠ΅Ρ‚ΡŒ консорциум.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

ΠœΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹ΡˆΠ΅.

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Π΅ ΠΆΠ΅ Ρ‚Ρ€ΠΈ Π½ΠΎΠ΄Ρ‹ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ сцСнария для дСмонстрации ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ:
  • Π‘ΡƒΠΏΠ΅Ρ€ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ для Π‘ΡƒΠΏΠ΅Ρ€ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚Π° ΠΈ Π’Π΅Π½Π΄ΠΎΡ€Π°.
  • Π’Ρ€Π΅Ρ‚ΡŒΡ сторона Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²Π° доступа ΠΊ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ.

ΠœΡ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ get ΠΈ set ΠΎΡ‚ Π»ΠΈΡ†Π° Π‘ΡƒΠΏΠ΅Ρ€ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚Π° ΠΈ Π’Π΅Π½Π΄ΠΎΡ€Π° для дСмонстрации ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Quorum.

  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, Π½ΠΎ Π’Ρ€Π΅Ρ‚ΡŒΡ сторона Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступа ΠΊ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ значСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ null.

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

    Π”Π°Π»Π΅Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ рассмотрим Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² сСти Quorum с web3.js. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ большая Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° совпадаСт с ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ транзакциями, Π²Ρ‹Π΄Π΅Π»ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ части, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ для ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² ΡΠ΅Ρ‚ΡŒ, являСтся нСизмСняСмым, поэтому доступ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ (permissioned) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π΄Π°Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π½ΠΎΠ΄Π°ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ дСплоя ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°, Π° Π½Π΅ послС.

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

ЭксплорСр Quorum Π² Chainstack ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  • Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΎΡ‚ участника Π‘ΡƒΠΏΠ΅Ρ€ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚;
  • Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ SetTemperature ΠΎΡ‚ Π’Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ стороны;
  • Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ SetTemperature ΠΎΡ‚ участника Π’Π΅Π½Π΄ΠΎΡ€.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ JPMorgan Quorum с использованиСм Web3

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΎΠ±Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ транзакция ΠΎΡ‚ участника Π’Π΅Π½Π΄ΠΎΡ€ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π° Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ Π² ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΈ Π½Π΅ Π²Ρ‹Π΄Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ сторонС.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠœΡ‹ рассмотрСли коммСрчСский сцСнарий использования Quorum для обСспСчСния Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ Π² складском ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΏΡƒΡ‚Π΅ΠΌ развСртывания сСти ΠΌΠ΅ΠΆΠ΄Ρƒ двумя сторонами β€” супСрмаркСтом ΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ склада.

ΠœΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ ΠΊΠ°ΠΊ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ информация ΠΎ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠ΅Π² примСнСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡ‚Π΅, это совсСм Π½Π΅ слоТно.

ЭкспСримСнтируйтС, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ свой сцСнарий. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‚ΠΎ индустрия Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½-Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΊ 2024 Π³ΠΎΠ΄Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ вырасти ΠΏΠΎΡ‡Ρ‚ΠΈ Π² Π΄Π΅ΡΡΡ‚ΡŒ Ρ€Π°Π·.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com