Quorum เบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเปเบญเบเบฐเบเบปเบเปเบฅเบฐเบชเบฒเบเบฒเบฅเบฐเบเบฐเปเบฅเบฐเบกเบตเบเปเบฅเบฐเบเบตเบเบฒเบเบเปเบฒเปเบเปเบเบฒเบเบเบฒเบเบเปเบฒเบซเบผเบฒเบ.
เปเบเบเบปเบเบเบงเบฒเบกเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบดเบเบฒเบฅเบฐเบเบฒเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบฑเปเบเบเปเบฒเบง - เบเบฒเบเปเบเปเปเบเบทเบญเบเปเบฒเบเบเบฑเบเบเบตเบฅเบฒเบเบเบฒเบเบเบตเปเปเบเบเบขเบฒเบเบฅเบฐเบซเบงเปเบฒเบเบฎเปเบฒเบเบชเบฑเบเบเบฐเบชเบดเบเบเปเบฒเปเบฅเบฐเปเบเบปเปเบฒเบเบญเบเบชเบฒเบเปเบเบทเปเบญเปเบซเปเบเปเปเบกเบนเบเบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเบเปเบฝเบงเบเบฑเบเบญเบธเบเบซเบฐเบเบนเบกเบเบญเบเบชเบฒเบ.
เบฅเบฐเบซเบฑเบเบเบตเปเปเบเปเปเบเบเบฒเบเบชเบญเบเบเบตเปเปเบกเปเบเบขเบนเปเปเบ
เบเบปเบเบเบงเบฒเบกเบเบงเบกเปเบญเบปเบฒ:
- เบเบฒเบเบชเปเบฒเบเบชเบฑเบเบเบฒเบชเบฐเบซเบกเบฒเบ;
- เบเบฒเบเบเบณเปเบเปเปเบเบทเบญเบเปเบฒเบเบเบญเบเบเบธเปเบกเปเบเบฃเบณเปเบเบเปเบเป
เบเปเบญเบเปเบชเป ; - เบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเบฒเบเบฒเบฅเบฐเบเบฐเบเบญเบเบเบธเปเบก;
- เบเบธเบฅเบฐเบเบณเบชเปเบงเบเบเบปเบงเบเบญเบเบเบธเปเบก.
เปเบเบทเปเบญเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบดเบเบเบฒเบกเบญเบธเบเบซเบฐเบเบนเบกเปเบเบชเบฒเบเบเบญเบเบชเบฐเบกเบฒเบเบดเบเบเบญเบเปเบเบทเบญเบเปเบฒเบ Quorum เบเบฒเบเปเบเบญเบดเบเปเบเบตเปเบเบฑเบเบเบญเบเบชเบดเปเบเบเปเบฒเบเป (IoT).
เบชเบฐเบเบฒเบเบเบฒเบ
เบเบธเปเบกเบเปเบฅเบดเบชเบฑเบเบชเบฒเบเบชเบดเบเบเปเบฒเบเบณเบฅเบฑเบเบฎเบงเบกเบเบปเบงเบเบฑเบเบขเบนเปเปเบเบเบธเปเบกเบเปเบฅเบดเบชเบฑเบเปเบเบทเปเบญเบฎเปเบงเบกเบเบฑเบเปเบเบฑเบเบเปเปเบกเบนเบ เปเบฅเบฐเบเบฐเบเบงเบเบเบฒเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบ blockchain. เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป, เบเปเบฅเบดเบชเบฑเบเปเบเปเบเบฑเบเบชเบดเบเปเบเปเบเป Quorum. เปเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบเบงเบกเปเบญเบปเบฒเบชเบญเบเบชเบฐเบเบฒเบเบฐเบเบฒเบ: เบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเบฒเบเบฒเบฅเบฐเบเบฐเปเบฅเบฐเบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเปเบงเบเบเบปเบง.
เบเบธเบฅเบฐเบเปเบฒเปเบกเปเบเบชเปเบฒเบเบเบถเปเบเปเบเบเบเบนเปเปเบเบปเปเบฒเบฎเปเบงเบกเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเปเบเบทเปเบญเบเบปเบงเบเบฑเบเบเบฑเบเบเบธเปเบกเบเบตเปเปเบเบปเบฒเปเบเบปเปเบฒเบเบถเปเบเบเบฑเบ. เปเบเปเบฅเบฐเบเบธเบฅเบฐเบเปเบฒเบเบฐเบเบฐเบเบดเบเบฑเบเบชเบฑเบเบเบฒเบซเบผเบทเปเบเบซเบฒเบซเบเปเบฒเบเบตเปเปเบเบชเบฑเบเบเบฒเปเบเบทเปเบญเบญเบฑเบเปเบซเบฅเบเบเปเปเบกเบนเบเปเบชเปเปเบเบทเบญเบเปเบฒเบ. เบเบฒเบเบเบฐเบเบณเปเบซเบผเบปเปเบฒเบเบตเปเบเบทเบเบเบณเบฅเบญเบเบเบฑเบเบเบธเบ nodes เปเบเปเบเบทเบญเบเปเบฒเบ.
เบเบธเบฅเบฐเบเปเบฒเบชเบฒเบเบฒเบฅเบฐเบเบฐเปเบกเปเบเบกเบตเปเบซเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบดเปเบเปเบเบเบเบนเปเปเบเบปเปเบฒเบฎเปเบงเบกเบชเบฐเบกเบฒเบเบปเบกเบเบฑเบเบซเบกเบปเบ. เบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเปเบงเบเบเบปเบงเปเบเบตเปเบกเบเบฑเปเบเบเบญเบเบเบงเบฒเบกเบฅเบฑเบเปเบฅเบฐเบกเบตเปเบซเปเบเบฝเบเปเบเปเบเบนเปเปเบเบปเปเบฒเบฎเปเบงเบกเบเบนเปเบเบตเปเบกเบตเบชเบดเบเบเบตเปเบเบฐเปเบฎเบฑเบเปเบเบงเบเบฑเปเบ.
เบชเปเบฒเบฅเบฑเบเบเบฑเบเบชเบญเบเบชเบฐเบเบฒเบเบฐเบเบฒเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบชเบฑเบเบเบฒเบเบฝเบงเบเบฑเบเปเบเบทเปเบญเบเบงเบฒเบกเบเบฑเบเปเบเบ.
เบชเบฑเบเบเบฒเบชเบฐเบซเบกเบฒเบ
เบเปเบฒเบเบฅเบธเปเบกเบเบตเปเปเบกเปเบเบชเบฑเบเบเบฒเบชเบฐเบซเบกเบฒเบเบเบตเปเบเปเบฒเบเบเบฒเบเบเบตเปเบชเปเบฒเบเบเบถเปเบเบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ. เบกเบฑเบเบกเบตเบเบปเบงเปเบเบชเบฒเบเบฒเบฅเบฐเบเบฐ 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
เปเบเบเบฑเบเบเบธเบเบฑเบเบชเบฑเบเบเบฒเปเบกเปเบเบเบฝเบกเบเปเบญเบก, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบฒเปเบเปเปเบเบทเบญเบเปเบฒเบเปเบฅเบฐเบเบฐเบเบดเบเบฑเบเบชเบฑเบเบเบฒ.
เบเบฒเบเบเบณเปเบเปเปเบเบ
เบเบฒเบเบเบดเบเบเบฑเปเบ node เบชเบฒเบกเบฒเบเบเปเบญเบเบเปเบฒเบเปเบเปเปเบฎเบเบเบฒเบเบซเบผเบฒเบเปเบฅเบฐเบเบฐเบเบงเบเบเบฒเบเบเบตเปเบชเบฒเบกเบฒเบเบเบทเบเบเบปเบเปเบเบเปเบเบเบเบฒเบเบเปเบฅเบดเบเบฒเบ
เบเปเบฒเบเบฅเบธเปเบกเบเบตเปเปเบกเปเบเบเบฐเบเบงเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฒเปเบเปเปเบเบทเบญเบเปเบฒเบ Quorum เบเบตเปเบกเบต Raft consensus เปเบฅเบฐเบชเบฒเบก nodes.
เบเปเบญเบเบญเบทเปเบ, เปเบซเปเบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเปเบเบเบเบฒเบเปเบฅเบฐเปเบเบซเบฒเบกเบฑเบเปเบเบเบเบฒเบ Quorum:
เบกเบฒเบชเปเบฒเบเปเบเบทเบญเบเปเบฒเบ Quorum เบเบฑเบ Raft consensus เปเบ Google Cloud Platform:
เบเปเปเบซเปเปเบเบตเปเบกเบชเบญเบเปเบซเบเบเปเบเบตเปเบกเปเบเบตเบกเปเบชเปเปเบซเบเบเบเบตเปเบชเปเบฒเบเปเบฅเปเบงเปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ:
เบชเบฒเบก nodes เปเบฅเปเบ:
เบซเบเปเบฒเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเบญเบ node เบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเบเบธเบเบชเบดเปเบเบชเบธเบ RPC, เบฅเบฐเบซเบฑเบเบชเบฒเบเบฒเบฅเบฐเบเบฐ, เปเบฅเบฐเบญเบทเปเบเป.
เปเบเบทเบญเบเปเบฒเบเบเบทเบเบเบณเปเบเป. เบเบญเบเบเบตเปเปเบซเปเบเบณเปเบเปเบชเบฑเบเบเบฒเบชเบฐเบซเบกเบฒเบ เปเบฅเบฐเปเบฎเบฑเบเบเบธเบฅเบฐเบเบณเปเบเบเปเบเป
เบเบธเบฅเบฐเบเปเบฒเบชเบฒเบเบฒเบฅเบฐเบเบฐ
เบชเบฐเบเบฒเบเบเบฒเบ
เบญเบธเบเบซเบฐเบเบนเบกเปเบเบชเบฒเบเปเบกเปเบเบกเบตเบเบงเบฒเบกเบชเปเบฒเบเบฑเบเบซเบผเบฒเบเปเบเบเบฒเบเบซเบผเบธเบเบเปเบญเบเบเปเบฒเปเบเปเบเปเบฒเบ, เปเบเบเบชเบฐเปเบเบฒเบฐเปเบกเปเบเบเบฐเบฅเบดเบเบเบฐเบเบฑเบเบเบตเปเบกเบตเบเบธเบเบเบฐเบชเบปเบเปเบเบทเปเบญเปเบเบฑเบเบฎเบฑเบเบชเบฒเปเบงเปเปเบเบญเบธเบเบซเบฐเบเบนเบกเบเปเบญเบเบชเบนเบ.
เปเบเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบฅเบดเบชเบฑเบเปเบเปเบเบเบฑเบเบญเบธเบเบซเบฐเบเบนเบกเบเบฒเบเบเบญเบเบเบญเบเบชเบฐเบเบฒเบเบเบตเปเบเบฑเปเบเบเบนเบกเบชเบฒเบเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเปเบงเบฅเบฒเบเบตเปเปเบเปเบเบดเบเปเบฅเบฐเบเบฑเบเบเบถเบเบกเบฑเบเบขเบนเปเปเบเบเบฑเบเบเบตเบฅเบฒเบเบเบฒเบเบเบตเปเบเปเปเบเปเบฝเบเปเบเบเปเบเป, เบเบนเปเปเบเบปเปเบฒเบฎเปเบงเบกเปเบเบทเบญเบเปเบฒเบเบซเบผเบธเบเบเปเบญเบเบเปเบฒเปเบเปเบเปเบฒเบเปเบฅเบฐเปเบงเบฅเบฒ.
เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบฐเบเบดเบเบฑเบเบงเบฝเบเบเบฒเบเบชเบฒเบกเบขเปเบฒเบ, เบชเบฐเปเบเบเบขเบนเปเปเบเปเบเบเบงเบฒเบ:
-
เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบฐเบเบดเบเบฑเบเบชเบฑเบเบเบฒเปเบเบเบเปเบฒเบ 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 เบชเปเบฒเบฅเบฑเบเบชเบฒเบก nodes:
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
เบเบทเบเบเบฐเบเบดเบเบฑเบเบขเบนเปเปเบ node เบเปเบญเบเบเบดเปเบเปเบฅเบฐเบเบธเบฅเบฐเบเปเบฒเบเบฐเบเปเปเบเบทเบเบชเปเบฒเบเบเบทเปเบเปเบ 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);
}
เปเบเบเบฑเบเบเบธเบเบฑเบเบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบ
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3
เบเปเปเปเบ, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบเบดเปเบเบฅเบฒเบเบเบฒเบเปเบ Quorum explorer เปเบเบเบฐเบเบฒเบ Chainstack, เบเบฑเปเบเบเบตเปเบชเบฐเปเบเบเบเปเบฒเบเบฅเบธเปเบกเบเบตเป.
เบเบฑเบเบชเบฒเบก nodes เปเบเปเบเบญเบเบเบฑเบเปเบฅเบฐเบเบธเบฅเบฐเบเปเบฒเปเบเปเบเบทเบเบเบฑเบเบเบธเบ:
- เบเบธเบฅเบฐเบเปเบฒเบเปเบฒเบญเบดเบเปเบเปเบเปเบฒเปเบเปเบชเบฑเบเบเบฒ.
- เบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบเบตเบชเบญเบเบเปเบฒเบเบปเบเบญเบธเบเบซเบฐเบเบนเบกเบชเบฑเบเบเบฒเปเบเบฑเบ 3 เบญเบปเบเบชเบฒ.
- เบญเบธเบเบซเบฐเบเบนเบกเปเบกเปเบเปเบเปเบฎเบฑเบเปเบเบเบเปเบฒเบ node เบเปเบญเบเบเบดเปเบ, เบเบฑเปเบเบเบฑเปเบเบเปเปเบกเบตเบเบฒเบเบชเปเบฒเบเบเบธเบฅเบฐเบเปเบฒ.
เบเบธเบฅเบฐเบเปเบฒเบชเปเบงเบเบเบปเบง
เบชเบฐเบเบฒเบเบเบฒเบ
เบเบงเบฒเบกเบเปเบญเบเบเบฒเบเบเบปเปเบงเปเบเบเบญเบเบญเบปเบเบเบฒเบเบเบฑเบเบเบฑเปเบเปเบกเปเบเบเบฒเบเบเบปเบเบเปเบญเบเบเปเปเบกเบนเบ. เบชเปเบฒเบฅเบฑเบเบเบปเบงเบขเปเบฒเบ, เบเบดเบเบฒเบฅเบฐเบเบฒเบชเบฐเบเบฒเบเบฐเบเบฒเบเปเบเบซเบเบถเปเบ เบชเบฑเบเบเบฐเบชเบดเบเบเปเบฒ เปเบเบปเปเบฒเบเบทเปเบเบเบตเปเบชเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเบญเบฒเบซเบฒเบเบเบฐเปเบฅเบเบฒเบเปเบเบเบเปเบฒเบเบซเบฒเบ เบเบนเปเบเบฒเบ:
- เบเบนเปเบเบฒเบ เบเบฒเบเบเปเบฒเปเบเปเปเบเบฑเบเปเบเบต 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, เปเบเป เบเปเบฒเบเบเบตเบชเบฒเบก เบเปเปเบกเบตเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบชเบฑเบเบเบฒเบชเบฐเบซเบกเบฒเบ. เบเบฑเปเบเบเบฑเปเบเบเปเบฒเบเบฑเบเบเบทเบเบเปเบญเบเปเบเบฑเบ null.
// This returns null const temp3 = await getTemperature(raft3Node, contractAddress); console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);
เบเปเปเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบดเบเบฒเบฅเบฐเบเบฒเบขเปเบฒเบเปเบเปเบเบดเบเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเปเบงเบเบเบปเบงเปเบเปเบเบทเบญเบเปเบฒเบ Quorum เบเบฑเบ
web3.js . เปเบเบทเปเบญเบเบเบฒเบเบฅเบฐเบซเบฑเบเบชเปเบงเบเปเบซเบเปเปเบกเปเบเบเบทเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเบฒเบเบฒเบฅเบฐเบเบฐ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบฑเปเบเปเบชเปเบเบฝเบเปเบเปเบชเปเบงเบเบเบตเปเปเบเบเบเปเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเปเบงเบเบเบปเบง.
เบเบปเปเบเบเบทเปเปเบงเปเบงเปเบฒเบชเบฑเบเบเบฒเบเบตเปเบญเบฑเบเปเบซเบฅเบเปเบเบเบฑเบเปเบเบทเบญเบเปเบฒเบเปเบกเปเบเบเปเปเบชเบฒเบกเบฒเบเบเปเบฝเบเปเบเบเปเบเป, เบเบฑเปเบเบเบฑเปเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบเบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบฑเบ nodes เบเบตเปเปเบซเบกเบฒเบฐเบชเบปเบกเปเบเบเบเบฒเบเปเบเบตเบเปเบเปเบชเบฑเบเบเบฒเบชเบฒเบเบฒเบฅเบฐเบเบฐเปเบเปเบงเบฅเบฒเบเบตเปเบชเบฑเบเบเบฒเบเบทเบเบเปเบฒเปเบเป, เบเปเปเปเบกเปเบเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ.
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 explorer เปเบ Chainstack เบเบฐเบชเบฐเปเบเบเบเบฑเปเบเบเปเปเปเบเบเบตเป:
- เบเบฒเบเบเบฐเบเบดเบเบฑเบเบชเบฑเบเบเบฒเบเบฒเบเบเบนเปเปเบเบปเปเบฒเบฎเปเบงเบก เบชเบฑเบเบเบฐเบชเบดเบเบเปเบฒ;
- เบเบฒเบเบเบฐเบเบดเบเบฑเบ
SetTemperature
เบเบฒเบ เบเบธเบโเบเบปเบโเบเบตเปโเบชเบฒเบก; - เบเบฒเบเบเบฐเบเบดเบเบฑเบ
SetTemperature
เบเบฒเบโเบเบนเปโเปเบเบปเปเบฒโเบฎเปเบงเบก เบเบนเปเบเบฒเบ.
เบเบฑเปเบเบเบตเปเปเบเบปเปเบฒเบชเบฒเบกเบฒเบเปเบซเบฑเบเปเบเป, เบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบเบฑเบเบชเบญเบเปเบกเปเบเบชเปเบฒเปเบฅเบฑเบ, เปเบเปเบงเปเบฒเบเบฝเบเปเบเปเบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบเบฒเบเบเบนเปเปเบเบปเปเบฒเบฎเปเบงเบก เบเบนเปเบเบฒเบ เบเบฑเบเบเบธเบเบญเบธเบเบซเบฐเบเบนเบกเปเบเบชเบฑเบเบเบฒ. เบเบฑเปเบเบเบฑเปเบ, เบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเปเบงเบเบเบปเบงเบชเบฐเบซเบเบญเบเบเบงเบฒเบกเบเปเปเบเปเบฝเบเปเบเบ, เปเบเปเปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบเบเปเปเปเบเปเปเบเบตเบเปเบเบตเบเบเปเปเบกเบนเบเปเบซเปเบเบฑเบเบเบธเบเบเบปเบเบเบตเบชเบฒเบก.
เบชเบฐเบซเบฅเบธเบ
เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบเบดเปเบเบเปเบฅเบฐเบเบตเบเบฒเบเบเปเบฒเปเบเปเบเบฒเบเบเบฒเบเบเปเบฒเบชเปเบฒเบฅเบฑเบ Quorum เปเบเบทเปเบญเบชเบฐเบซเบเบญเบเบเปเปเบกเบนเบเบญเบธเบเบซเบฐเบเบนเบกเบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเบขเบนเปเปเบเบชเบฒเบเปเบเบเบเบฒเบเบเปเบฒเปเบเปเปเบเบทเบญเบเปเบฒเบเบฅเบฐเบซเบงเปเบฒเบเบชเบญเบเบเบฒเบเบชเปเบงเบ - เบชเบฑเบเบเบฐเบชเบดเบเบเปเบฒเปเบฅเบฐเปเบเบปเปเบฒเบเบญเบเบชเบฒเบ.
เบเบงเบเปเบฎเบปเบฒเปเบเปเบชเบฐเปเบเบเบงเบดเบเบตเบเบฒเบเบฎเบฑเบเบชเบฒเบเปเปเบกเบนเบเบญเบธเบเบซเบฐเบเบนเบกเบเบตเปเบเบฑเบเบชเบฐ เปเป เปเบเบเบเปเบฒเบเบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐ เบเบณ เบเบฑเบเบเบฒเบเบฅเบฑเบเปเบฅเบฐเปเบญเบเบฐเบเบปเบ.
เบกเบฑเบเบชเบฒเบกเบฒเบเบกเบตเบซเบผเบฒเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเปเบฅเบฐ, เบเบฒเบกเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบดเปเบ, เบกเบฑเบเบเปเปเปเบกเปเบเบกเบตเบเบงเบฒเบกเบซเบเบธเปเบเบเบฒเบเบเบฑเบเบซเบกเบปเบ.
เบเบปเบเบฅเบญเบ, เบเบฐเบเบฒเบเบฒเบกเบเบฐเบซเบเบฒเบ script เบเบญเบเบเปเบฒเบ. เบเบดเปเบเปเบเบเบงเปเบฒเบเบฑเปเบ, เบญเบธเบเบชเบฒเบซเบฐเบเปเบฒเปเบเบเปเบเปเบฅเบเบต blockchain
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com