рдХреЛрд░рдорд▓реЗ рдирд┐рдЬреА рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрдирд╣рд░реВрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ рд░ рдзреЗрд░реИ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдпреЛрдЧ рдХреЗрд╕рд╣рд░реВ рдЫрдиреНред
рдпрд╕ рд▓реЗрдЦрдорд╛, рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдпрд╕реНрддреЛ рдкрд░рд┐рджреГрд╢реНрдпрдХреЛ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗрдЫреМрдВ - рдЧреЛрджрд╛рдордХреЛ рддрд╛рдкрдХреНрд░рдордХреЛ рдмрд╛рд░реЗрдорд╛ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдЧрд░реНрди рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рд░ рдЧреЛрджрд╛рдо рдорд╛рд▓рд┐рдХ рдмреАрдЪ рд╡рд┐рддрд░рд┐рдд рдЦрд╛рддрд╛ рдиреЗрдЯрд╡рд░реНрдХрдХреЛ рддреИрдирд╛рддреАред
рдпрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдХреЛрдб рдЫ
рд▓реЗрдЦрд▓реЗ рд╕рдореЗрдЯреНрдЫ:
- рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдз рдХреЛ рдирд┐рд░реНрдорд╛рдг;
- рдХреЛрд░рдо рд╕рдЮреНрдЬрд╛рд▓рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░
рдЪреЗрдирд╕реНрдЯреНрдпрд╛рдХ ; - рдХреЛрд░рдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди;
- рдХреЛрд░рдо рдирд┐рдЬреА рд▓реЗрдирджреЗрдиред
рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдЗрдиреНрдЯрд░рдиреЗрдЯ рдЕрдл рдерд┐рдВрдЧреНрд╕ (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
рдЕрдм рдареЗрдХреНрдХрд╛ рддрдпрд╛рд░ рднрдЗрд╕рдХреЗрдкрдЫрд┐ рд╣рд╛рдореА рд╕рдЮреНрдЬрд╛рд▓ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реЗрд░ рдареЗрдХреНрдХрд╛ рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗрдЫреМрдВред
рдиреЛрдб рдкрд░рд┐рдирд┐рдпреЛрдЬрди
рдПрдХ рдиреЛрдб рддреИрдирд╛рддреА рдзреЗрд░реИ рд╢реНрд░рдо-рдЧрд╣рди рд╣реБрди рд╕рдХреНрдЫ рд░ рдпреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ
рддрд▓ рд░рд╛рдлреНрдЯ рд╕рд╣рдорддрд┐ рд░ рддреАрди рдиреЛрдбрд╣рд░реВ рд╕рдВрдЧ рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рддреА рдХреЛ рд▓рд╛рдЧреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЫред
рдкрд╣рд┐рд▓реЗ, рдПрдЙрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ рд░ рдпрд╕рд▓рд╛рдИ рдХреЛрд░рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрдирд┐рдиреНрдЫ:
рдЧреБрдЧрд▓ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рд░рд╛рдлреНрдЯ рд╕рд╣рдорддрд┐рдХреЛ рд╕рд╛рде рдХреЛрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ:
рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдиреЛрдбрдорд╛ рджреБрдИ рдердк рдиреЛрдбрд╣рд░реВ рдердкреМрдВ:
рддреАрди рдЪрд╛рд▓реБ рдиреЛрдбрд╣рд░реВ:
рдиреЛрдб рд╡рд┐рд╡рд░рдг рдкреГрд╖реНрдард▓реЗ RPC рдЕрдиреНрддреНрдпрдмрд┐рдиреНрджреБ, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдЮреНрдЬреА, рдЖрджрд┐ рджреЗрдЦрд╛рдЙрдБрдЫред
рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рде рдЧрд░рд┐рдПрдХреЛ рдЫред рдЕрдм рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реМрдВ
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд▓реЗрдирджреЗрди
рдкреНрд░рд╕реНрдЧ
рдЧреЛрджрд╛рдордХреЛ рддрд╛рдкрдХреНрд░рдо рд▓рд╛рдЧрдд рдШрдЯрд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЙрдк-рд╢реВрдиреНрдп рддрд╛рдкрдХреНрд░рдордорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдЪрд╛рд╣рдиреЗ рдЙрддреНрдкрд╛рджрдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ред
рдХрдореНрдкрдиреАрд╣рд░реВрд▓рд╛рдИ рдЙрдиреАрд╣рд░реВрдХреЛ рднреМрдЧреЛрд▓рд┐рдХ рд╕реНрдерд╛рдирдХреЛ рдмрд╛рд╣рд┐рд░реА рддрд╛рдкрдХреНрд░рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордпрдорд╛ рд╕рд╛рдЭрд╛ рдЧрд░реНрди рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЦрд╛рддрд╛рдорд╛ рд░реЗрдХрд░реНрдб рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдПрд░, рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╣рднрд╛рдЧреАрд╣рд░реВрд▓реЗ рд▓рд╛рдЧрдд рд░ рд╕рдордп рдШрдЯрд╛рдЙрдБрдЫрдиреНред
рд╣рд╛рдореА рддреАрди рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрдиреЗрдЫреМрдВ, рд░реЗрдЦрд╛рдЪрд┐рддреНрд░рдорд╛ рдЪрд┐рддреНрд░рдг:
-
рд╣рд╛рдореА рд╕рдореНрдЭреМрддрд╛ рдорд╛рд░реНрдлрдд рддреИрдирд╛рдд рдЧрд░реНрдиреЗрдЫреМрдВ рдиреЛрдб реж:
const contractAddress = await deployContract(raft1Node); console.log(`Contract address after deployment: ${contractAddress}`);
-
рдорд╛рд░реНрдлрдд рддрд╛рдкрдорд╛рди рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдиреЛрдб реж 3 рдбрд┐рдЧреНрд░реА рджреНрд╡рд╛рд░рд╛:
const status = await setTemperature(raft2Node, contractAddress, 3); console.log(`Transaction status: ${status}`);
-
рдиреЛрдб реж рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзрдмрд╛рдЯ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫред рд╕рдореНрдЭреМрддрд╛рд▓реЗ рдорд╛рди 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}`);
-
рдмрд╛рдЯ рддрд╛рдкрдорд╛рди рд╕реЗрдЯ рдЧрд░реМрдВ рд╡рд┐рдХреНрд░реЗрддрд╛ (рдЖрдиреНрддрд░рд┐рдХ рдиреЛрдб) рд░ рддрд╛рдкрдорд╛рди рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН:
рдпрд╕ рдкрд░рд┐рджреГрд╢реНрдпрдХреЛ рддрд╛рдкрдХреНрд░рдорд▓реЗ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзрдмрд╛рдЯ рдорд╛рди резреи рдлрд░реНрдХрд╛рдЙрдиреБ рдкрд░реНрдЫред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рд╡рд┐рдХреНрд░реЗрддрд╛ рдпрд╣рд╛рдБ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзрдорд╛ рдЕрдзрд┐рдХреГрдд рдкрд╣реБрдБрдЪ рдЫред
// 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
Chainstack рдорд╛ рдХреЛрд░рдо рдЕрдиреНрд╡реЗрд╖рдХрд▓реЗ рдирд┐рдореНрди рджреЗрдЦрд╛рдЙрдиреЗрдЫ:
- рд╕рд╣рднрд╛рдЧреАрдмрд╛рдЯ рд╕рдореНрдЭреМрддрд╛рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ;
- рдкреНрд░рджрд░реНрд╢рди
SetTemperature
рджреЗрдЦрд┐ рддреЗрд╕реНрд░реЛ рдкрдХреНрд╖; - рдкреНрд░рджрд░реНрд╢рди
SetTemperature
рдПрдХ рд╕рд╣рднрд╛рдЧреАрдмрд╛рдЯ рд╡рд┐рдХреНрд░реЗрддрд╛.
рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рджреБрдмреИ рд▓реЗрдирджреЗрдирд╣рд░реВ рдкреВрд░рд╛ рднрдПрдХрд╛ рдЫрдиреН, рддрд░ рд╕рд╣рднрд╛рдЧреАрдмрд╛рдЯ рдорд╛рддреНрд░ рд▓реЗрдирджреЗрди рд╡рд┐рдХреНрд░реЗрддрд╛ рд╕рдореНрдЭреМрддрд╛рдорд╛ рддрд╛рдкрдорд╛рди рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░рд┐рдпреЛред рдпрд╕рд░реА, рдирд┐рдЬреА рд▓реЗрдирджреЗрдирд▓реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ, рддрд░ рдПрдХреИ рд╕рдордпрдорд╛ рддреЗрд╕реНрд░реЛ рдкрдХреНрд╖рд▓рд╛рдИ рдбреЗрдЯрд╛ рдкреНрд░рдХрдЯ рдЧрд░реНрджреИрдиред
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рд╣рд╛рдореАрд▓реЗ рджреБрдИ рдкрдХреНрд╖рд╣рд░реВ - рдПрдХ рд╕реБрдкрд░рдорд╛рд░реНрдХреЗрдЯ рд░ рдПрдХ рдЧреЛрджрд╛рдо рдорд╛рд▓рд┐рдХ рдмреАрдЪрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рддреИрдирд╛рде рдЧрд░реЗрд░ рдЧреЛрджрд╛рдордорд╛ рдЕрдк-рдЯреБ-рдбреЗрдЯ рддрд╛рдкрдХреНрд░рдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдЧрд░реНрди рдХреЛрд░рдордХреЛ рд▓рд╛рдЧрд┐ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдпреЛрдЧрдХреЛ рдорд╛рдорд▓рд╛ рд╣реЗрд░реНрдпреМрдВред
рд╣рд╛рдореАрд▓реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░ рдирд┐рдЬреА рджреБрд╡реИ рд▓реЗрдирджреЗрдирд╣рд░реВ рдорд╛рд░реНрдлрдд рдХрд╕рд░реА рдЕрдк-рдЯреБ-рдбреЗрдЯ рддрд╛рдкрдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рдХрд╛рдпрдо рд░рд╛рдЦреНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреЗрд░ рджреЗрдЦрд╛рдпреМрдВред
рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпрд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫрдиреН рд░, рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдпреЛ рдХреБрдиреИ рдкрдирд┐ рдЧрд╛рд╣реНрд░реЛ рдЫреИрдиред
рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЖрдлреНрдиреЛ рд▓рд┐рдкрд┐ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрд╕рдмрд╛рд╣реЗрдХ, blockchain рдкреНрд░рд╡рд┐рдзрд┐ рдЙрджреНрдпреЛрдЧ
рд╕реНрд░реЛрдд: www.habr.com