рдХреЛрд░рдо рдЦрд╛рдЬрдЧреА рдЖрдгрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдЕрдиреЗрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд╛рдкрд░ рдкреНрд░рдХрд░рдгреЗ рдЖрд╣реЗрдд.
рдпрд╛ рд▓реЗрдЦрд╛рдд, рдЖрдореНрд╣реА рдЕрд╢рд╛рдЪ рдПрдХрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░реВ - рд╡реЗрдЕрд░рд╣рд╛рдКрд╕рдЪреНрдпрд╛ рддрд╛рдкрдорд╛рдирд╛рдмрджреНрджрд▓ рдЕрджреНрдпрдпрд╛рд╡рдд рдорд╛рд╣рд┐рддреА рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рдЖрдгрд┐ рд╡реЗрдЕрд░рд╣рд╛рдКрд╕ рдорд╛рд▓рдХ рдпрд╛рдВрдЪреНрдпрд╛рдд рд╡рд┐рддрд░рд┐рдд рдЦрд╛рддреЗрд╡рд╣реА рдиреЗрдЯрд╡рд░реНрдХрдЪреА рддреИрдирд╛рддреА.
рдпрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗрд▓рд╛ рдХреЛрдб рдЖрд╣реЗ
рд▓реЗрдЦрд╛рдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ:
- рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░рд╛рдЪреА рдирд┐рд░реНрдорд┐рддреА;
- рд╡рд╛рдкрд░реВрди рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХрдЪреА рддреИрдирд╛рддреА
рдЪреЗрдирд╕реНрдЯреЕрдХ ; - рдХреЛрд░рдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░;
- рдХреЛрд░рдо рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░.
рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЗрдВрдЯрд░рдиреЗрдЯ рдСрдл рдерд┐рдВрдЧреНрдЬ (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;
}
}
рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд░рд╛рд░рд╛рд╕рд╛рдареА 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
рдЖрддрд╛ рдХрд░рд╛рд░ рддрдпрд╛рд░ рдЭрд╛рд▓рд╛ рдЖрд╣реЗ, рдЖрдореНрд╣реА рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рдд рдХрд░реВ рдЖрдгрд┐ рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХрд░реВ.
рдиреЛрдб рдЙрдкрдпреЛрдЬрди
рдиреЛрдб рддреИрдирд╛рдд рдХрд░рдгреЗ рдЦреВрдк рд╢реНрд░рдо-рдХреЗрдВрджреНрд░рд┐рдд рдЕрд╕реВ рд╢рдХрддреЗ рдЖрдгрд┐ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░реВрди рдмрджрд▓рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ
рдЦрд╛рд▓реА рд░рд╛рдлреНрдЯ рдПрдХрдордд рдЖрдгрд┐ рддреАрди рдиреЛрдбреНрд╕рд╕рд╣ рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╣реЗ.
рдкреНрд░рдердо, рдПрдХ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░реВ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ рдХреЛрд░рдо рдкреНрд░рдХрд▓реНрдк рдореНрд╣рдгреВ:
рдЪрд▓рд╛ Google рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рд░рд╛рдлреНрдЯ рдПрдХрдорддрд╛рдиреЗ рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рддрдпрд╛рд░ рдХрд░реВрдпрд╛:
рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдЖрдзреАрдЪ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдиреЛрдбрдордзреНрдпреЗ рдЖрдгрдЦреА рджреЛрди рдиреЛрдб рдЬреЛрдбреВрдпрд╛:
рддреАрди рдЪрд╛рд▓реВ рдиреЛрдбреНрд╕:
рдиреЛрдб рддрдкрд╢реАрд▓ рдкреГрд╖реНрда RPC рдПрдВрдбрдкреЙрдЗрдВрдЯ, рдкрдмреНрд▓рд┐рдХ рдХреА рдЗ. рджрд╛рдЦрд╡рддреЗ.
рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рдд рдХреЗрд▓реЗ рдЖрд╣реЗ. рдЪрд▓рд╛ рдЖрддрд╛ рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯ рд▓рд╛рдЧреВ рдХрд░реВ рдЖрдгрд┐ рд╡рд╛рдкрд░реВрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реВ
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░
рд╕рдВрджрд░реНрдн
рдЦрд░реНрдЪ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЧреЛрджрд╛рдорд╛рдЪреЗ рддрд╛рдкрдорд╛рди рдЦреВрдк рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ, рд╡рд┐рд╢реЗрд╖рдд: рдЙрдк-рд╢реВрдиреНрдп рддрд╛рдкрдорд╛рдирд╛рдд рд╕рд╛рдард╡рд┐рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рдЙрддреНрдкрд╛рджрдирд╛рдВрд╕рд╛рдареА.
рдХрдВрдкрдиреНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рднреМрдЧреЛрд▓рд┐рдХ рд╕реНрдерд╛рдирд╛рдЪреЗ рдмрд╛рд╣реЗрд░реАрд▓ рддрд╛рдкрдорд╛рди рд░рд┐рдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рддреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд▓реЗрдЬрд░рдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдб рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрдКрди, рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╣рднрд╛рдЧреА рдЦрд░реНрдЪ рдЖрдгрд┐ рд╡реЗрд│ рдХрдореА рдХрд░рддрд╛рдд.
рдЖрдореНрд╣реА рддреАрди рдХрд╛рд░реНрдпреЗ рдХрд░реВ, рдЬреЗ рдЖрдХреГрддреАрдордзреНрдпреЗ рд╕реНрдкрд╖реНрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ:
-
рджреНрд╡рд╛рд░реЗ рдЖрдореНрд╣реА рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХрд░реВ рдиреЛрдб 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;
});
}
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
рдкреБрдвреЗ, рдЦрд╛рд▓реА рджрд╛рдЦрд╡рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдЖрдкрдг рдЪреЗрдирд╕реНрдЯреЕрдХ рдкреЕрдиреЗрд▓рдордзреАрд▓ рдХреЛрд░рдо рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░рдордзреАрд▓ рдиреЛрдВрджреА рдкрд╛рд╣реВ рд╢рдХрддреЛ.
рд╕рд░реНрд╡ рддреАрди рдиреЛрдбреНрд╕рдиреЗ рдкрд░рд╕реНрдкрд░ рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрд▓рд╛ рдЖрдгрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ:
- рдкрд╣рд┐рд▓реНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдиреЗ рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХреЗрд▓рд╛.
- рджреБрд╕рд▒реНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдиреЗ рдХреЙрдиреНрдЯреНрд░реЕрдХреНрдЯ рддрд╛рдкрдорд╛рди 3 рдЕрдВрд╢рд╛рдВрд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ.
- рддрд╛рдкрдорд╛рди рд╕реНрдерд╛рдирд┐рдХ рдиреЛрдбрджреНрд╡рд╛рд░реЗ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рдХреЛрдгрддрд╛рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рддрдпрд╛рд░ рд╣реЛрдд рдирд╛рд╣реА.
рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░
рд╕рдВрджрд░реНрдн
рд╕рдВрд╕реНрдерд╛рдВрдЪреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореНрд╣рдгрдЬреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдХреНрд╖рдг. рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди, рдПрдХ рдкрд░рд┐рд╕реНрдерд┐рддреА рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреНрдпрд╛ рдЬреНрдпрд╛рдордзреНрдпреЗ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рд╕реАрдлреВрдб рд╕рд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрдЕрд░рд╣рд╛рдКрд╕ рдЬрд╛рдЧрд╛ рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддреЗ рд╡рд┐рдХреНрд░реЗрддрд╛:
- рд╡рд┐рдХреНрд░реЗрддрд╛ IoT рд╕реЗрдиреНрд╕рд░ рд╡рд╛рдкрд░реВрди, рджрд░ 30 рд╕реЗрдХрдВрджрд╛рдВрдиреА рддрд╛рдкрдорд╛рди рдореВрд▓реНрдпреЗ рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЛ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯрд▓рд╛;
- рд╣реА рдореВрд▓реНрдпреЗ рдлрдХреНрдд рдЙрдкрд▓рдмреНрдз рдЕрд╕рд╛рд╡реАрдд рд╡рд┐рдХреНрд░реЗрддреНрдпрд╛рд▓рд╛ ╨╕ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯрд▓рд╛, рдПрдХрд╛ рд╕рдВрдШрд╛рджреНрд╡рд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗрд▓реЗрд▓реЗ.
рд╡рд░реАрд▓ рдЖрдХреГрддреАрдд рджрд╛рдЦрд╡рд▓реЗрд▓реА рдЪрд╛рд░ рдХрд╛рд░реНрдпреЗ рдЖрдкрдг рдкреВрд░реНрдг рдХрд░реВ.
- рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдорд╛рдЧреАрд▓ рдкрд░рд┐рд╕реНрдерд┐рддреАрддреАрд▓ рд╕рдорд╛рди рддреАрди рдиреЛрдбреНрд╕ рд╡рд╛рдкрд░рддреЛ:
- рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХрд░рддреЗ рдЬреЗ рдЦрд╛рдЬрдЧреА рдЖрд╣реЗ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ ╨╕ рд╡рд┐рдХреНрд░реЗрддрд╛.
- рддрд┐рд╕рд░реА рдмрд╛рдЬреВ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░рд╛рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЕрдзрд┐рдХрд╛рд░ рдирд╛рд╣реА.
рдЖрдореНрд╣реА рдкрджреНрдзрддреА рдХреЙрд▓ рдХрд░реВ get
╨╕ set
рдЪреНрдпрд╛ рд╡рддреАрдиреЗ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ ╨╕ рд╡рд┐рдХреНрд░реЗрддрд╛ рдЦрд╛рдЬрдЧреА рдХреЛрд░рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.
-
рдЖрдореНрд╣реА рд╕рд╣рднрд╛рдЧреАрдВрд╕рд╛рдареА рдПрдХ рдЦрд╛рдЬрдЧреА рдХрд░рд╛рд░ рддреИрдирд╛рдд рдХрд░реВ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ ╨╕ рд╡рд┐рдХреНрд░реЗрддрд╛ рд╕рд╣рднрд╛рдЧреАрджреНрд╡рд╛рд░реЗ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ:
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 рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ, рдкрд░рдВрддреБ рддрд┐рд╕рд░реА рдмрд╛рдЬреВ рд╕реНрдорд╛рд░реНрдЯ рдХрд░рд╛рд░рд╛рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдирд╛рд╣реА. рдореНрд╣рдгреВрди рдкрд░рддрд╛рд╡рд╛ рдореВрд▓реНрдп рд╢реВрдиреНрдп рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
// 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
рд╕рд╣рднрд╛рдЧреА рдХрдбреВрди рд╡рд┐рдХреНрд░реЗрддрд╛.
рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рджреЛрдиреНрд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдкреВрд░реНрдг рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рдХреЗрд╡рд│ рд╕рд╣рднрд╛рдЧреАрдХрдбреВрди рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рдХреНрд░реЗрддрд╛ рдХрд░рд╛рд░рд╛рдордзреНрдпреЗ рддрд╛рдкрдорд╛рди рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЦрд╛рдЬрдЧреА рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛рдд, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪ рд╡реЗрд│реА рддреГрддреАрдп рдкрдХреНрд╖рд╛рд▓рд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрдЯ рдХрд░рдд рдирд╛рд╣реАрдд.
рдирд┐рд╖реНрдХрд░реНрд╖
рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рдЖрдгрд┐ рд╡реЗрдЕрд░рд╣рд╛рдКрд╕ рдорд╛рд▓рдХ - рджреЛрди рдкрдХреНрд╖рд╛рдВрдордзреНрдпреЗ рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рдд рдХрд░реВрди рд╡реЗрдЕрд░рд╣рд╛рдКрд╕рдордзреНрдпреЗ рдЕрджреНрдпрдпрд╛рд╡рдд рддрд╛рдкрдорд╛рди рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрд░рдорд╕рд╛рдареА рдЖрдореНрд╣реА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд╛рдкрд░ рдкреНрд░рдХрд░рдг рдкрд╛рд╣рд┐рд▓реЗ.
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЖрдгрд┐ рдЦрд╛рдЬрдЧреА рджреЛрдиреНрд╣реА рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрджреНрд╡рд╛рд░реЗ рддрд╛рдкрдорд╛рдирд╛рдЪреА рдЕрджреНрдпрдпрд╛рд╡рдд рдорд╛рд╣рд┐рддреА рдХрд╢реА рд░рд╛рдЦрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рд╣реЗ рдЖрдореНрд╣реА рджрд╛рдЦрд╡рд▓реЗ.
рддреЗрдереЗ рдмрд░реЗрдЪ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рд┐рд╕реНрдерд┐рддреА рдЕрд╕реВ рд╢рдХрддрд╛рдд рдЖрдгрд┐ рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рддреЗ рдЕрдЬрд┐рдмрд╛рдд рдХрдареАрдг рдирд╛рд╣реА.
рдкреНрд░рдпреЛрдЧ рдХрд░рд╛, рддреБрдордЪреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рд╕реНрддреГрдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛. рд╢рд┐рд╡рд╛рдп, рдмреНрд▓реЙрдХрдЪреЗрди рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдЙрджреНрдпреЛрдЧ
рд╕реНрддреНрд░реЛрдд: www.habr.com