αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αž€αžΌαžšαŸ‰αž»αž˜ αž‚αžΊαž‡αžΆ blockchain αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ Ethereum αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™ JPMorgan αž αžΎαž™αžαŸ’αž˜αžΈαŸ—αž“αŸαŸ‡αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαžœαŸαž‘αž·αž€αžΆαž…αŸ‚αž€αž…αžΆαž™αžŸαŸ€αžœαž—αŸ…αž€αžαŸ‹αžαŸ’αžšαžΆαžŠαŸ†αž”αžΌαž„αž‚αŸαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αžŠαŸ„αž™ Microsoft Azure αŸ”

αž€αžΌαžšαŸ‰αž»αž˜αž‚αžΆαŸ†αž‘αŸ’αžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž―αž€αž‡αž“ αž“αž·αž„αžŸαžΆαž’αžΆαžšαžŽαŸˆ αž αžΎαž™αž˜αžΆαž“αž€αžšαžŽαžΈαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αžΆαžŽαž·αž‡αŸ’αž‡αž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž”αŸ‚αž”αž“αŸαŸ‡αž˜αž½αž™ - αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αžŽαŸ’αžαžΆαž‰αž”αž‰αŸ’αž‡αžΈαžšαžΆαž™αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžšαžœαžΆαž„αž•αŸ’αžŸαžΆαžšαž‘αŸ†αž“αžΎαž” αž“αž·αž„αž˜αŸ’αž…αžΆαžŸαŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžαŸ’αž˜αžΈαŸ—αž’αŸ†αž–αžΈαžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αŸ”

αž€αžΌαžŠβ€‹αžŠαŸ‚αž›β€‹αž”αŸ’αžšαžΎβ€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αžšαŸ€αž“β€‹αž“αŸαŸ‡β€‹αž‚αžΊβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„ αžƒαŸ’αž›αžΆαŸ†αž„αž“αŸ…αž›αžΎ GitHub.

αž’αžαŸ’αžαž”αž‘αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αŸ–

  • αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒ;
  • αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αžŽαŸ’αžαžΆαž‰αž€αžΌαžšαŸ‰αž»αž˜αžŠαŸ„αž™αž”αŸ’αžšαžΎ αž†αžΆαž†αžΊαž€;
  • αž€αžΌαžšαŸ‰αž»αž˜ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ;
  • αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž―αž€αž‡αž“αž“αŸƒαž€αžΌαžšαŸ‰αž»αž˜αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰ αž™αžΎαž„αž”αŸ’αžšαžΎαžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αžŸαž˜αžΆαž‡αž·αž€αž“αŸƒαž”αžŽαŸ’αžαžΆαž‰αž€αžΌαžšαŸ‰αž»αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž’αŸŠαžΈαž“αž’αžΊαžŽαŸ‚αžαž“αŸƒαž’αŸ’αžœαžΈαŸ— (IoT)αŸ”

αž”αžšαž·αž”αž‘

αž€αŸ’αžšαž»αž˜β€‹αž αŸŠαž»αž“β€‹αžƒαŸ’αž›αžΆαŸ†αž„β€‹αž˜αž½αž™β€‹αž€αŸ†αž–αž»αž„β€‹αžšαž½αž”β€‹αžšαž½αž˜β€‹αž‚αŸ’αž“αžΆβ€‹αž€αŸ’αž“αž»αž„β€‹αž€αŸ’αžšαž»αž˜β€‹αž αŸŠαž»αž“β€‹αž˜αž½αž™β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αžšαž€αŸ’αžŸαžΆβ€‹αž‘αž»αž€β€‹αž–αŸαžαŸŒαž˜αžΆαž“β€‹αžšαž½αž˜β€‹αž‚αŸ’αž“αžΆ αž“αž·αž„β€‹αž’αŸ’αžœαžΎβ€‹αžŠαŸ†αžŽαžΎαžšβ€‹αž€αžΆαžšβ€‹αžŠαŸ„αž™β€‹αžŸαŸ’αžœαŸαž™β€‹αž”αŸ’αžšαžœαžαŸ’αžαž·β€‹αž“αŸ…β€‹αž›αžΎ blockchainαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αŸ’αžšαžΎαž€αžΌαžšαŸ‰αž»αž˜αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αžšαŸ€αž”αžšαžΆαž”αŸ‹αž’αŸ†αž–αžΈαžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž–αžΈαžšαŸ– αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž―αž€αž‡αž“αŸ”

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž‡αžΆαž€αž˜αŸ’αž˜αžŸαž·αž‘αŸ’αž’αž·αŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΈαž˜αž½αž™αŸ—αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆ αž¬αž αŸ…αž˜αž»αžαž„αžΆαžšαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αŸ” αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„αž‘αŸ…αž€αžΆαž“αŸ‹αžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αŸ”

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆαž‚αžΊαž’αžΆαž…αžšαž€αž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αžΎαž›αžŠαŸ„αž™αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž‚αŸ’αžšαž”αŸ‹αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž―αž€αž‡αž“αž”αž“αŸ’αžαŸ‚αž˜αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž αžΎαž™αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž‘αžΆαŸ†αž„αž–αžΈαžš αž™αžΎαž„αž”αŸ’αžšαžΎαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αŸ”

αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒ

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αžœαžΆαž˜αžΆαž“αž’αžαŸαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ 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;
  }
}

αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ αž‚αŸαž αž‘αŸ†αž–αŸαžš 3.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

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαžšαž½αž…αžšαžΆαž›αŸ‹ αž™αžΎαž„αž“αžΉαž„αž–αž„αŸ’αžšαžΆαž™αž”αžŽαŸ’αžαžΆαž‰ αž“αž·αž„αž–αž„αŸ’αžšαžΆαž™αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžαŸ’αž“αžΆαŸ†αž„

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžαŸ’αž“αžΆαŸ†αž„αž’αžΆαž…αž”αŸ’αžšαžΎαž€αž˜αŸ’αž›αžΆαŸ†αž„αž–αž›αž€αž˜αŸ’αž˜αžαŸ’αž›αžΆαŸ†αž„ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ†αž“αž½αžŸαžŠαŸ„αž™αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αž†αžΆαž†αžΊαž€.

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αžŽαŸ’αžαžΆαž‰ Quorum αž‡αžΆαž˜αž½αž™αž“αžΉαž„ Raft consensus αž“αž·αž„αžαŸ’αž“αžΆαŸ†αž„αž”αžΈαŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž…αžΌαžšαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αž˜αž½αž™ αž αžΎαž™αž αŸ…αžœαžΆαžαžΆ αž‚αž˜αŸ’αžšαŸ„αž„αž€αžΌαžšαŸ‰αž»αž˜αŸ–

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαž”αžŽαŸ’αžαžΆαž‰ Quorum αž‡αžΆαž˜αž½αž™ Raft consensus αž“αŸ…αž›αžΎ Google Cloud PlatformαŸ–

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αžαŸ„αŸ‡αž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αž“αžΆαŸ†αž„αž–αžΈαžšαž‘αŸ€αžαž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžšαž½αž…αž αžΎαž™αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ–

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΈαŸ–

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αž‘αŸ†αž–αŸαžšαž–αžαŸŒαž˜αžΆαž“αž›αŸ†αž’αž·αžαžšαž”αžŸαŸ‹αžαŸ’αž“αžΆαŸ†αž„αž”αž„αŸ’αž αžΆαž‰αž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹ RPC αžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆαŸ”αž›αŸ”

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αž”αžŽαŸ’αžαžΆαž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒ αž“αž·αž„αž’αŸ’αžœαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎ αž‚αŸαž αž‘αŸ†αž–αŸαžš 3.js.

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ

αž”αžšαž·αž”αž‘

αžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžαŸ’αž›αžΆαŸ†αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž…αŸ†αžŽαžΆαž™ αž‡αžΆαž–αž·αžŸαŸαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αž›αž·αžαž•αž›αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ†αžŽαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αžšαž„αžŸαžΌαž“αŸ’αž™αŸ”

αžŠαŸ„αž™αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αžαžΆαž„αž€αŸ’αžšαŸ…αž“αŸƒαž‘αžΈαžαžΆαŸ†αž„αž—αžΌαž˜αž·αžŸαžΆαžŸαŸ’αžšαŸ’αžαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž€αŸ’αž“αž»αž„αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž αžΎαž™αž€αžαŸ‹αžαŸ’αžšαžΆαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ€αžœαž—αŸ…αž€αžαŸ‹αžαŸ’αžšαžΆαžŠαŸ‚αž›αž˜αž·αž“αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžΆαž“ αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž”αžŽαŸ’αžαžΆαž‰αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž…αŸ†αžŽαžΆαž™ αž“αž·αž„αž–αŸαž›αžœαŸαž›αžΆαŸ”

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αž™αžΎαž„β€‹αž“αžΉαž„β€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αž”αžΈβ€‹αžŠαŸ‚αž›β€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž€αŸ’αž“αž»αž„β€‹αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αŸ–

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

    αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžšαž”αŸ€αž”αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆαž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž€αžΌαžšαŸ‰αž»αž˜αžŠαŸ„αž™αž”αŸ’αžšαžΎ αž‚αŸαž αž‘αŸ†αž–αŸαžš 3.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;
  });
}

αž‚αŸαž αž‘αŸ†αž–αŸαžš 3.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 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž αžΎαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΉαž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž“αŸ…αž›αžΎ blockchain αž‘αŸαŸ”

// 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 explorer αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž“αŸ’αž‘αŸ‡ Chainstack αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

αžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž”αžΈαž”αžΆαž“αž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜ αž αžΎαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αŸ–

  1. αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ†αž”αžΌαž„αž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαŸ”
  2. αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΈαž–αžΈαžšαž€αŸ†αžŽαžαŸ‹αžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαžŠαž›αŸ‹ 3 αžŠαžΊαž€αŸ’αžšαŸαŸ”
  3. αžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αžαžΆαž˜αžšαž™αŸˆαžαŸ’αž“αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŽαžΆαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αŸαŸ”

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž―αž€αž‡αž“

αž”αžšαž·αž”αž‘

αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‘αžΌαž‘αŸ…αžšαž”αžŸαŸ‹αž’αž„αŸ’αž‚αž€αžΆαžšαž‚αžΊαž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αžŸαžΌαž˜αž–αž·αž…αžΆαžšαžŽαžΆαžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž˜αž½αž™αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αŸ” αž•αŸ’αžŸαžΆαžšαž‘αŸ†αž“αžΎαž” αž‡αž½αž›αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž’αžΆαž αžΆαžšαžŸαž˜αž»αž‘αŸ’αžšαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαŸ” αž’αŸ’αž“αž€αž›αž€αŸ‹:

  • αž’αŸ’αž“αž€αž›αž€αŸ‹ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αžŸαž‰αŸ’αž‰αžΆ IoT αž’αžΆαž“αžαž˜αŸ’αž›αŸƒαžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αžšαŸ€αž„αžšαžΆαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αž–αž½αž€αž‚αŸαŸ” αž‘αŸ…αž•αŸ’αžŸαžΆαžšαž‘αŸ†αž“αžΎαž”;
  • αžαž˜αŸ’αž›αŸƒαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αž½αžšαžαŸ‚αž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“ αžŠαž›αŸ‹αž’αŸ’αž“αž€αž›αž€αŸ‹ ΠΈ αž‘αŸ…αž•αŸ’αžŸαžΆαžšαž‘αŸ†αž“αžΎαž”αž”αžŽαŸ’αžαžΆαž‰αžŠαŸ„αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αž½αž™αŸ”

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αž™αžΎαž„αž“αžΉαž„αž”αŸ†αž–αŸαž‰αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž”αž½αž“αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžαžΆαž„αž›αžΎαŸ”

  • αž™αžΎαž„αž”αŸ’αžšαžΎαžαŸ’αž“αžΆαŸ†αž„αž”αžΈαžŠαžΌαž…αž‚αŸ’αž“αžΆαž–αžΈαžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž˜αž»αž“ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž―αž€αž‡αž“αŸ–
  • αž•αŸ’αžŸαžΆαžšαž‘αŸ†αž“αžΎαž” αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαžŠαŸ‚αž›αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž―αž€αž‡αž“ αž•αŸ’αžŸαžΆαžšαž‘αŸ†αž“αžΎαž” ΠΈ αž’αŸ’αž“αž€αž›αž€αŸ‹.
  • αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈ αž˜αž·αž“αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαž‘αŸαŸ”

αž™αžΎαž„αž“αžΉαž„αž αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž 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}`);

    αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαž“αŸ‹αžαŸ‚αžŠαž·αžαžŠαž›αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž―αž€αž‡αž“αž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž€αžΌαžšαŸ‰αž»αž˜αž‡αžΆαž˜αž½αž™ αž‚αŸαž αž‘αŸ†αž–αŸαžš 3.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 αž–αžΈαž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜ αž’αŸ’αž“αž€αž›αž€αŸ‹.

αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αž“αŸ…αž›αžΎ JPMorgan Quorum blockchain αžŠαŸ„αž™αž”αŸ’αžšαžΎ Web3

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αžαŸ‚αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž–αžΈαž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž’αŸ’αž“αž€αž›αž€αŸ‹ αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž―αž€αž‡αž“αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž—αžΆαž–αž˜αž·αž“αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž αžΆαž‰αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαž›αŸ‹αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαž‘αžΎαž™αŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž™αžΎαž„αž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžšαžŽαžΈαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αžΆαžŽαž·αž‡αŸ’αž‡αž€αž˜αŸ’αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΌαžšαŸ‰αž»αž˜αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αž‘αžΆαž“αŸ‹αžŸαž˜αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŠαŸ„αž™αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αžŽαŸ’αžαžΆαž‰αžšαžœαžΆαž„αž—αžΆαž‚αžΈαž–αžΈαžš - αž•αŸ’αžŸαžΆαžšαž‘αŸ†αž“αžΎαž” αž“αž·αž„αž˜αŸ’αž…αžΆαžŸαŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αŸ”

αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž–αŸαžαŸŒαž˜αžΆαž“αžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž–αž‘αžΆαž“αŸ‹αžŸαž˜αŸαž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžαžΆαž˜αžšαž™αŸˆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž―αž€αž‡αž“αŸ”

αžœαžΆαž’αžΆαž…αž˜αžΆαž“αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“ αž αžΎαž™αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αžΆαž“αžƒαžΎαž‰ αžœαžΆαž˜αž·αž“αž–αž·αž”αžΆαž€αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αŸ”

αžŸαžΆαž€αž›αŸ’αž”αž„ αž–αŸ’αž™αžΆαž™αžΆαž˜αž–αž„αŸ’αžšαžΈαž€αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αžαž§αžŸαŸ’αžŸαžΆαž αž€αž˜αŸ’αž˜αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ blockchain αž’αžΆαž…αž€αžΎαž“αž‘αžΎαž„αž‡αž·αžαžŠαž”αŸ‹αžŠαž„αž“αŸ…αž†αŸ’αž“αžΆαŸ† 2024.

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹