Quorum ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠ΅ ΠΈ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΈ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΊΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² β ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Π΅ΡΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅ΡΠΎΠΌ ΠΈ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΡΠΊΠ»Π°Π΄Π° Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΠ΅ ΡΠΊΠ»Π°Π΄ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅, Π»Π΅ΠΆΠΈΡ Π²
Π‘ΡΠ°ΡΡΡ ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ:
- ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°;
- ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠΈ 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;
}
}
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΡΠ°Π±ΠΎΡΠ°Π» Ρ formatContract
, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ
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
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ Π³ΠΎΡΠΎΠ², ΠΌΡ ΡΠ°Π·Π²Π΅ΡΠ½Π΅ΠΌ ΡΠ΅ΡΡ ΠΈ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΠΌ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ.
Π Π°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ΄
Π Π°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ΄Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΡΡΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΌ ΠΈ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠΈ Quorum Ρ ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡΠΎΠΌ Raft ΠΈ ΡΡΠ΅ΠΌΡ Π½ΠΎΠ΄Π°ΠΌΠΈ.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π·Π°Π²Π΅Π΄Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ Quorum Project:
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ΅ΡΡ Quorum Ρ ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡΠΎΠΌ Raft Π½Π° Google Cloud Platform:
Π ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½ΠΎΠ΄Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΡΠ΅ Π΄Π²Π΅ Π½ΠΎΠ΄Ρ:
Π’ΡΠΈ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ Π½ΠΎΠ΄Ρ:
Π‘ΡΡΠ°Π½ΠΈΡΠ° Π΄Π΅ΡΠ°Π»Π΅ΠΉ Π½ΠΎΠ΄Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ RPC endpoint, ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΠΈ Ρ. Π΄.
Π‘Π΅ΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΠ°. Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΉΠΌΠ΅ΠΌΡΡ Π΄Π΅ΠΏΠ»ΠΎΠ΅ΠΌ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠ² ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ
ΠΡΠ±Π»ΠΈΡΠ½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ
Π’Π΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΠ° ΡΠΊΠ»Π°Π΄ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ Π·Π°ΡΡΠ°Ρ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ², ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΡΠΈ ΠΌΠΈΠ½ΡΡΠΎΠ²ΠΎΠΉ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΠ΅.
ΠΠ°Π²Π°Ρ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π΅Π»ΠΈΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΈΡ Π³Π΅ΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π² Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΡΠ΅Π΅ΡΡΡ, ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΡΠ΅ΡΠΈ ΡΠΎΠΊΡΠ°ΡΠ°ΡΡ ΡΠ°ΡΡ ΠΎΠ΄Ρ ΠΈ Π²ΡΠ΅ΠΌΡ.
ΠΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ ΡΡΠΈ Π·Π°Π΄Π°ΡΠΈ, ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ΅:
-
ΠΠ°Π΄Π΅ΠΏΠ»ΠΎΠΈΠΌ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΡΠ΅ΡΠ΅Π· Node 1:
const contractAddress = await deployContract(raft1Node); console.log(`Contract address after deployment: ${contractAddress}`);
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· Node 2 Π½Π° 3 Π³ΡΠ°Π΄ΡΡΠ°:
const status = await setTemperature(raft2Node, contractAddress, 3); console.log(`Transaction status: ${status}`);
-
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;
});
}
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);
}
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3
ΠΠ°Π»Π΅Π΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠΊΡΠΏΠ»ΠΎΡΠ΅ΡΠ΅ Quorum Π² ΠΏΠ°Π½Π΅Π»ΠΈ Chainstack, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.
ΠΡΠ΅ ΡΡΠΈ Π½ΠΎΠ΄Ρ ΠΏΡΠΎΠ²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π»ΠΈ ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡ:
- ΠΠ΅ΡΠ²Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΠ»Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ.
- ΠΡΠΎΡΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»Π° ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° Π² 3 Π³ΡΠ°Π΄ΡΡΠ°.
- ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ Π½ΠΎΠ΄Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π½Π΅ ΡΠΎΠ·Π΄Π°Π½Π°.
ΠΡΠΈΠ²Π°ΡΠ½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ
Π§Π°ΡΡΡΠΌ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΡΠΈΡΠ° Π΄Π°Π½Π½ΡΡ . Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ CΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅Ρ Π°ΡΠ΅Π½Π΄ΡΠ΅Ρ ΡΠΊΠ»Π°Π΄ΡΠΊΠΎΠ΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΌΠΎΡΠ΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ² Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΠ΅Π½Π΄ΠΎΡΠ°:
- ΠΠ΅Π½Π΄ΠΎΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ IoT-Π΄Π°ΡΡΠΈΠΊΠΎΠ² ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΡΠ΅ 30 ΡΠ΅ΠΊΡΠ½Π΄ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΠΈΡ CΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅ΡΡ;
- Π΄Π°Π½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΠ΅Π½Π΄ΠΎΡΡ ΠΈ Π‘ΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅ΡΡ, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΌ Π² ΡΠ΅ΡΡ ΠΊΠΎΠ½ΡΠΎΡΡΠΈΡΠΌ.
ΠΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ΅ΡΡΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ΅ Π²ΡΡΠ΅.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ΅ ΠΆΠ΅ ΡΡΠΈ Π½ΠΎΠ΄Ρ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ:
- Π‘ΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅Ρ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΌ Π΄Π»Ρ Π‘ΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅ΡΠ° ΠΈ ΠΠ΅Π½Π΄ΠΎΡΠ°.
- Π’ΡΠ΅ΡΡΡ ΡΡΠΎΡΠΎΠ½Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡ.
ΠΡ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Ρ get
ΠΈ set
ΠΎΡ Π»ΠΈΡΠ° Π‘ΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅ΡΠ° ΠΈ ΠΠ΅Π½Π΄ΠΎΡΠ° Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Quorum.
-
ΠΠ°Π΄Π΅ΠΏΠ»ΠΎΠΈΠΌ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ Π΄Π»Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² Π‘ΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅Ρ ΠΈ ΠΠ΅Π½Π΄ΠΎΡ ΡΠ΅ΡΠ΅Π· ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ° Π‘ΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅Ρ:
const contractAddress = await deployContract( raft1Node, process.env.PK2, ); console.log(`Contract address after deployment: ${contractAddress}`);
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΎΡ Π’ΡΠ΅ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ (Π²Π½Π΅ΡΠ½ΡΡ Π½ΠΎΠ΄Π°) ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ:
// 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}`);
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΎΡ ΠΠ΅Π½Π΄ΠΎΡΠ° (Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ Π½ΠΎΠ΄Π°) ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ:
Π’Π΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΠ° Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅ΡΠ½ΡΡΡ ΠΈΠ· ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 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}`);
-
ΠΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΎΡ Π’ΡΠ΅ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ (Π²Π½Π΅ΡΠ½ΡΡ Π½ΠΎΠ΄Π°):
ΠΠ° ΡΠ°Π³Π΅ 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;
});
}
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ
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
ΠΎΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ° ΠΠ΅Π½Π΄ΠΎΡ.
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΎΠ±Π΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΎΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ° ΠΠ΅Π½Π΄ΠΎΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π° ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ Π² ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈ Π½Π΅ Π²ΡΠ΄Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Quorum Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΠ΅ Π² ΡΠΊΠ»Π°Π΄ΡΠΊΠΎΠΌ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΏΡΡΠ΅ΠΌ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΡΡΠΎΡΠΎΠ½Π°ΠΌΠΈ β ΡΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅ΡΠΎΠΌ ΠΈ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΡΠΊΠ»Π°Π΄Π°.
ΠΡ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ ΠΊΠ°ΠΊ Π°ΠΊΡΡΠ°Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠ΅, ΡΠ°ΠΊ ΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
Π‘ΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎ.
ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΡΠΎ ΠΈΠ½Π΄ΡΡΡΡΠΈΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½-ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com