เชเซเชฐเชฎ เชเชพเชจเชเซ เช เชจเซ เชเชพเชนเซเชฐ เชตเซเชฏเชตเชนเชพเชฐเซเชจเซ เชธเชฎเชฐเซเชฅเชจ เชเชชเซ เชเซ เช เชจเซ เชคเซเชฎเชพเช เชเชฃเชพ เชตเซเชฏเชตเชธเชพเชฏเชฟเช เชเชชเชฏเซเชเชจเชพ เชเซเชธ เชเซ.
เช เชฒเซเชเชฎเชพเช, เช เชฎเซ เชเชตเชพ เชเช เชฆเซเชถเซเชฏเชจเซ เชคเชชเชพเชธ เชเชฐเซเชถเซเช - เชตเซเชฐเชนเชพเชเชธเชจเชพ เชคเชพเชชเชฎเชพเชจ เชตเชฟเชถเซ เช เชช-เชเซ-เชกเซเช เชฎเชพเชนเชฟเชคเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเชตเชพ เชฎเชพเชเซ เชธเซเชชเชฐเชฎเชพเชฐเซเชเซเช เช เชจเซ เชตเซเชฐเชนเชพเชเชธ เชฎเชพเชฒเชฟเช เชตเชเซเชเซ เชตเชฟเชคเชฐเชฟเชค เชเชพเชคเชพเชตเชนเซ เชจเซเชเชตเชฐเซเชเชจเซ เชเชฎเชพเชตเช.
เช เชเซเชฏเซเชเซเชฐเซเชฏเชฒเชฎเชพเช เชตเชชเชฐเชพเชฏเซเชฒ เชเซเชก เชเซ
เชฒเซเช เชเชตเชฐเซ เชฒเซ เชเซ:
- เชธเซเชฎเชพเชฐเซเช เชเชฐเชพเชฐเชจเซ เชฐเชเชจเชพ;
- เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเชฐเชฎ เชจเซเชเชตเชฐเซเชเชจเซ เชเชฎเชพเชตเช
เชเซเชเชจเชธเซเชเซเช ; - เชเซเชฐเชฎ เชเชพเชนเซเชฐ เชตเซเชฏเชตเชนเชพเชฐเซ;
- เชเซเชฐเชฎ เชเชพเชจเชเซ เชตเซเชฏเชตเชนเชพเชฐเซ.
เชธเชฎเชเชพเชตเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชเชจเซเชเชฐเชจเซเช เชเชซ เชฅเชฟเชเชเซเชธ (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