Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Kowòm se yon blockchain ki baze sou Ethereum devlope pa JPMorgan ak pi resamman te vin premye platfòm distribiye Ledger yo dwe ofri pa Microsoft Azure.

Quorum sipòte tranzaksyon prive ak piblik epi li gen anpil ka itilizasyon komèsyal yo.

Nan atik sa a, nou pral egzamine yon sèl senaryo sa yo - deplwaman yon rezo distribiye Ledger ant yon makèt ak yon pwopriyetè depo pou bay enfòmasyon ajou sou tanperati depo a.

Kòd yo itilize nan leson patikilye sa a se nan depo sou GitHub.

Atik la kouvri:

  • kreyasyon yon kontra entelijan;
  • deplwaman rezo Quorum lè l sèvi avèk Chainstack;
  • Tranzaksyon piblik kowòm;
  • Kowòm tranzaksyon prive.

Pou ilistre, nou itilize yon senaryo pou kontwole tanperati nan depo manm rezo Kolèj la nan Entènèt bagay yo (IoT).

Kontèks

Yon gwoup konpayi depo ap ini nan yon consortium pou estoke enfòmasyon ansanm ak otomatize pwosesis sou blockchain la. Pou sa, konpayi yo deside sèvi ak Quorum. Nan atik sa a nou pral kouvri de senaryo: tranzaksyon piblik ak tranzaksyon prive.

Tranzaksyon yo kreye pa diferan patisipan yo kominike avèk consortium kote yo fè pati. Chak tranzaksyon swa deplwaye yon kontra oswa rele yon fonksyon nan kontra a pou telechaje done sou rezo a. Aksyon sa yo repwodui nan tout nœuds sou rezo a.

Tranzaksyon piblik yo disponib pou wè pa tout patisipan konsòsyòm yo. Tranzaksyon prive yo ajoute yon kouch konfidansyalite epi yo disponib sèlman pou patisipan yo ki gen dwa pou yo fè sa.

Pou tou de senaryo yo, nou itilize menm kontra a pou klè.

Kontra entelijan

Anba a se yon senp kontra entelijan ki te kreye pou senaryo nou an. Li gen yon varyab piblik temperature, ki ka chanje lè l sèvi avèk set epi resevwa pa metòd 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;
  }
}

Nan lòd pou kontra a travay ak web3.js, li dwe tradui nan fòma ABI ak bytecode. Sèvi ak fonksyon an formatContractpi ba a konpile kontra a lè l sèvi avèk solc-js.

function formatContract() {
  const path = './contracts/temperatureMonitor.sol';
  const source = fs.readFileSync(path,'UTF8');
return solc.compile(source, 1).contracts[':TemperatureMonitor'];
}

Kontra fini an sanble sa a:

// 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

Kounye a ke kontra a pare, nou pral deplwaye rezo a epi deplwaye kontra a.

Deplwaman ne

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Deplwaye yon ne kapab byen travay-entansif ak pwosesis sa a ka ranplase lè l sèvi avèk yon sèvis Chainstack.

Anba a se pwosesis pou deplwaye rezo Kolèj la avèk konsansis Raft ak twa nœuds.

Premyèman, ann kreye yon pwojè epi rele li Pwojè Kowòm:

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Ann kreye yon rezo kowòm ak konsansis Raft sou Google Cloud Platform:

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Ann ajoute de plis nœuds nan ne ki deja kreye pa default:

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Twa nœuds kouri:

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Paj detay ne yo montre pwen final RPC, kle piblik, elatriye.

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Rezo a deplwaye. Koulye a, kite a deplwaye kontra entelijan ak fè tranzaksyon lè l sèvi avèk web3.js.

Tranzaksyon piblik yo

Kontèks

Tanperati depo gen anpil enpòtans nan diminye depans, espesyalman pou pwodwi ki gen entansyon yo dwe estoke nan tanperati ki anba zewo.

Lè yo pèmèt konpayi yo pataje tanperati deyò kote jeyografik yo an tan reyèl epi anrejistre li nan yon Ledger imuiabl, patisipan rezo yo diminye depans ak tan.

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Nou pral fè twa travay, ilistre nan dyagram nan:

  1. Nou pral deplwaye kontra a atravè Nod lan:

    const contractAddress = await deployContract(raft1Node);
    console.log(`Contract address after deployment: ${contractAddress}`);

  2. Mete tanperati a atravè Nod lan pa 3 degre:

    const status = await setTemperature(raft2Node, contractAddress, 3);
    console.log(`Transaction status: ${status}`);

  3. Nod lan pral resevwa enfòmasyon nan kontra entelijan an. Kontra a pral retounen valè a 3 degre:

    const temp = await getTemperature(raft3Node, contractAddress);
    console.log(‘Retrieved contract Temperature’, temp);

    Apre sa, nou pral gade kijan pou egzekite yon tranzaksyon piblik sou rezo Kolèj la lè l sèvi avèk web3.js.

Nou kòmanse yon egzanp atravè RPC pou twa nœuds:

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,
 },
);

Ann deplwaye kontra entelijan an:

// 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;
  });
}

web3.js bay de metòd pou kominike avèk kontra a: call и send.

Ann mete ajou tanperati kontra a pa egzekite set lè l sèvi avèk metòd 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;
  });
}

Apre sa, nou itilize metòd web3 call pou jwenn tanperati kontra a. Tanpri sonje ke metòd la call se egzekite sou yon ne lokal epi tranzaksyon an pa pral kreye sou blockchain la.

// 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);
}

Koulye a, ou ka kouri public.js pou jwenn rezilta sa a:

// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3

Apre sa, nou ka wè antre yo nan eksploratè Kowòm nan nan panèl Chainstack, jan yo montre anba a.

Tout twa nœuds te kominike epi tranzaksyon yo te mete ajou:

  1. Premye tranzaksyon an te deplwaye kontra a.
  2. Dezyèm tranzaksyon an mete tanperati kontra a 3 degre.
  3. Tanperati a resevwa atravè yon ne lokal, kidonk pa gen okenn tranzaksyon kreye.

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Tranzaksyon prive

Kontèks

Yon kondisyon komen nan òganizasyon se pwoteksyon done. Kòm yon egzanp, konsidere yon senaryo nan ki Makèt lwe yon espas depo pou estoke fwidmè nan yon separe Vandè:

  • Vandè lè l sèvi avèk detèktè IoT, li valè tanperati chak 30 segonn epi transmèt yo Nan makèt la;
  • valè sa yo ta dwe disponib sèlman Pou vandè a и Nan makèt la, rezo pa yon consortium.

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Nou pral ranpli kat travay yo ilistre nan dyagram ki anwo a.

  • Nou itilize menm twa nœuds nan senaryo anvan an pou demontre tranzaksyon prive yo:
  • Makèt deplwaye yon kontra entelijan ki prive Makèt и Vandè.
  • Twazyèm bò a pa gen dwa jwenn aksè nan kontra entelijan an.

Nou pral rele metòd yo get и set sou non Makèt и Vandè pou demontre yon tranzaksyon Kowòm prive.

  1. Nou pral deplwaye yon kontra prive pou patisipan yo Makèt и Vandè atravè yon patisipan Makèt:

    const contractAddress = await deployContract(
    raft1Node,
    process.env.PK2,
    );
    console.log(`Contract address after deployment: ${contractAddress}`);

  2. Ann mete tanperati a soti Twazyèm pati (ne ekstèn) epi jwenn valè tanperati a:

    // 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}`);

  3. Ann mete tanperati a soti Vandè (nœud entèn) epi jwenn valè tanperati a:

    Tanperati a nan senaryo sa a ta dwe retounen valè 12 nan kontra entelijan an. Tanpri sonje sa Vandè isit la gen aksè otorize nan kontra a entelijan.

    // 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}`);

  4. Nou jwenn tanperati a soti nan Twazyèm pati (nœud ekstèn):

    Nan etap 3 tanperati a te fikse a 12, men Twazyèm bò a pa gen aksè a kontra entelijan an. Se poutèt sa valè retounen a dwe nil.

    // This returns null
    const temp3 = await getTemperature(raft3Node, contractAddress);
    console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);

    Apre sa, nou pral pran yon gade pi pre nan fè tranzaksyon prive sou rezo Kolèj la ak web3.js. Piske pifò nan kòd la se menm bagay la tou pou tranzaksyon piblik yo, nou pral mete aksan sou sèlman pati sa yo ki diferan pou tranzaksyon prive.

Remake byen ke kontra a telechaje sou rezo a se imuiabl, kidonk aksè pèmisyon dwe akòde nan nœuds ki apwopriye yo lè yo pèmèt kontra piblik la nan moman kontra a deplwaye, pa apre.

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;
  });
}

Tranzaksyon prive yo fèt nan yon fason menm jan an - lè yo enkli kle piblik la nan patisipan yo nan moman an nan ekzekisyon.

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;
  });
}

Koulye a, nou ka kouri prive.js ak rezilta sa yo:

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

Eksploratè kowòm nan nan Chainstack pral montre bagay sa yo:

  • deplwaman nan kontra a soti nan patisipan an Makèt;
  • Akonplisman SetTemperature soti nan Twazyèm pati;
  • Akonplisman SetTemperature soti nan yon patisipan Vandè.

Fè tranzaksyon piblik ak prive sou blockchain JPMorgan Quorum lè l sèvi avèk Web3

Kòm ou ka wè, tou de tranzaksyon yo fini, men se sèlman tranzaksyon an soti nan patisipan an Vandè mete ajou tanperati a nan kontra a. Kidonk, tranzaksyon prive bay imuabilite, men an menm tan an pa revele done bay yon twazyèm pati.

Konklizyon

Nou te gade yon ka itilizasyon komèsyal pou Quorum pou bay enfòmasyon ajou sou tanperati nan yon depo lè nou deplwaye yon rezo ant de pati - yon makèt ak yon pwopriyetè depo.

Nou te montre kouman yo ka kenbe enfòmasyon sou tanperati ajou atravè tranzaksyon piblik ak prive.

Ka gen yon anpil nan senaryo aplikasyon epi, kòm ou ka wè, li pa ditou difisil.

Eksperyans, eseye elaji script ou a. Anplis, endistri teknoloji blockchain ta ka grandi prèske de fwa pa 2024.

Sous: www.habr.com

Add nouvo kòmantè