Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

чуулгын нь JPMorgan-ийн боловсруулсан Ethereum-д суурилсан блокчэйн бөгөөд хамгийн сүүлд Microsoft Azure-аас санал болгож буй анхны тархсан дэвтэр платформ болсон.

Чуулга нь хувийн болон олон нийтийн гүйлгээг дэмждэг бөгөөд арилжааны зориулалтаар ашиглах олон тохиолдол байдаг.

Энэ нийтлэлд бид агуулахын температурын талаарх хамгийн сүүлийн үеийн мэдээллээр хангахын тулд супермаркет ба агуулахын эзэмшигчийн хооронд тархсан бүртгэлийн сүлжээг байрлуулах нэг хувилбарыг авч үзэх болно.

Энэ зааварт ашигласан код нь энд байна GitHub дээрх агуулахууд.

Нийтлэлд:

  • ухаалаг гэрээ байгуулах;
  • ашиглан Чуулгын сүлжээг байршуулах Гинжний овоолго;
  • Чуулгын олон нийтийн гүйлгээ;
  • Чуулгын хувийн гүйлгээ.

Үүнийг харуулахын тулд бид Чуулгын сүлжээний гишүүдийн агуулах дахь температурыг хянах хувилбарыг ашигладаг.

Агуулга

Блокчейн дээр мэдээлэл хадгалах, үйл явцыг автоматжуулах зорилгоор агуулахын бүлэг компаниуд консорциумд нэгдэж байна. Үүний тулд компаниуд Чуулга ашиглахаар шийдсэн. Энэ нийтлэлд бид нийтийн гүйлгээ болон хувийн гүйлгээ гэсэн хоёр хувилбарыг авч үзэх болно.

Гүйлгээг өөр өөр оролцогчид харьяалагддаг консорциумтайгаа харилцахын тулд хийдэг. Гүйлгээ бүр нь гэрээ байгуулдаг эсвэл сүлжээнд өгөгдөл байршуулахын тулд гэрээн дэх функцийг дууддаг. Эдгээр үйлдлүүд нь сүлжээн дэх бүх цэгүүдэд давтагддаг.

Нийтийн гүйлгээг консорциумын бүх оролцогчид үзэх боломжтой. Хувийн гүйлгээ нь нууцлалын давхаргыг нэмдэг бөгөөд үүнийг хийх эрхтэй оролцогчдод л боломжтой.

Хоёр хувилбарын хувьд бид тодорхой болгохын тулд ижил гэрээг ашигладаг.

Ухаалаг гэрээ

Доорх нь бидний хувилбарт зориулж бүтээсэн энгийн ухаалаг гэрээ юм. Энэ нь нийтийн хувьсагчтай 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;
  }
}

Гэрээтэй ажиллахын тулд web3.js, үүнийг ABI формат болон байт код руу хөрвүүлсэн байх ёстой. Функцийг ашиглах formatContractашиглан гэрээг доор эмхэтгэсэн solc-js.

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

Одоо гэрээ бэлэн болсон тул бид сүлжээгээ байрлуулж, гэрээгээ байрлуулна.

Зангилаа байршуулалт

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Зангилаа байршуулах нь нэлээд хөдөлмөр их шаарддаг бөгөөд энэ процессыг үйлчилгээг ашиглан сольж болно Гинжний овоолго.

Raft consensus болон гурван зангилаа бүхий Чуулгын сүлжээг байрлуулах үйл явцыг доор харуулав.

Эхлээд төсөл үүсгээд түүнийг Чуулгын төсөл гэж нэрлэе:

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Google Cloud Platform дээр Raft зөвшилцөлтэй Чуулгын сүлжээг үүсгэцгээе:

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Өгөгдмөлөөр үүсгэсэн зангилаа руу дахиад хоёр зангилаа нэмье:

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Гурван ажиллаж байгаа зангилаа:

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Зангилааны дэлгэрэнгүй хуудас нь RPC төгсгөлийн цэг, нийтийн түлхүүр гэх мэтийг харуулдаг.

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Сүлжээг байрлуулсан байна. Одоо ухаалаг гэрээг байрлуулж, ашиглан гүйлгээ хийцгээе web3.js.

Нийтийн гүйлгээ

Агуулга

Агуулахын температур нь зардлыг бууруулахад чухал ач холбогдолтой бөгөөд ялангуяа XNUMX-ээс доош температурт хадгалах зориулалттай бүтээгдэхүүний хувьд.

Сүлжээнд оролцогчид өөрсдийн газарзүйн байршлын гаднах температурыг бодит цаг хугацаанд нь хуваалцаж, өөрчлөгддөггүй дэвтэрт бүртгэх боломжийг олгосноор сүлжээний оролцогчид зардал, цаг хугацааг багасгадаг.

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Бид диаграммд үзүүлсэн гурван даалгаврыг гүйцэтгэнэ.

  1. Бид гэрээгээр дамжуулан байршуулах болно Node 1:

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

  2. Температурыг тохируулна уу Node 2 3 градусаар:

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

  3. Node 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;
  });
}

web3.js гэрээтэй харилцах хоёр аргыг санал болгодог: 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);
}

Одоо та гүйж болно public.js дараах үр дүнг авахын тулд:

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

Дараа нь бид доор үзүүлсэн шиг Chainstack самбар дээрх Чуулгын судлаачийн оруулгуудыг харж болно.

Бүх гурван зангилаа харилцан үйлчилж, гүйлгээг шинэчилсэн:

  1. Эхний гүйлгээ нь гэрээг байршуулсан.
  2. Хоёр дахь гүйлгээ нь гэрээний температурыг 3 градусаар тогтоосон.
  3. Температурыг орон нутгийн зангилаагаар хүлээн авдаг тул гүйлгээ үүсэхгүй.

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Хувийн гүйлгээ

Агуулга

Байгууллагын нийтлэг шаардлага бол мэдээллийн хамгаалалт юм. Жишээ болгон, ямар хувилбарыг авч үзье Супермаркет Тусдаа далайн хоол хадгалах агуулах түрээслүүлнэ Худалдагч:

  • Худалдагч IoT мэдрэгч ашиглан температурын утгыг 30 секунд тутамд уншиж, дамжуулдаг Супермаркет руу;
  • Эдгээр утгууд нь зөвхөн боломжтой байх ёстой Худалдагч руу и Супермаркет руу, консорциумаар сүлжээнд холбогдсон.

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Бид дээрх диаграммд үзүүлсэн дөрвөн даалгаврыг гүйцээнэ.

  • Хувийн гүйлгээг харуулахын тулд бид өмнөх хувилбарын ижил гурван зангилааг ашигладаг:
  • Супермаркет хувийн ухаалаг гэрээг байрлуулдаг Супермаркет и Худалдагч.
  • Гурав дахь тал ухаалаг гэрээнд хандах эрхгүй.

Бид аргуудыг дуудах болно get и set нэрийн өмнөөс Супермаркет и Худалдагч Чуулгын хувийн гүйлгээг харуулах.

  1. Бид оролцогчдод хувийн гэрээ байгуулна Супермаркет и Худалдагч оролцогчоор дамжуулан Супермаркет:

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

  2. -аас температурыг тохируулъя Гуравдагч этгээд (гадаад зангилаа) ба температурын утгыг авна уу:

    // 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. -аас температурыг тохируулъя Худалдагч (дотоод зангилаа) ба температурын утгыг авна уу:

    Энэ хувилбарын температур нь ухаалаг гэрээнээс 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}`);

  4. Бид температурыг авдаг Гуравдагч этгээд (гадаад зангилаа):

    3-р алхамд температурыг 12 болгож тохируулсан боловч Гурав дахь тал ухаалаг гэрээнд хандах эрхгүй. Тиймээс буцах утга нь null байх ёстой.

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

Одоо бид гүйж болно private.js дараах үр дүнтэй:

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 оролцогчоос Худалдагч.

Web3 ашиглан JPMorgan чуулгын блокчейн дээр нийтийн болон хувийн гүйлгээг хийх

Таны харж байгаагаар гүйлгээ хоёулаа дууссан, гэхдээ зөвхөн оролцогчийн гүйлгээ Худалдагч гэрээнд температурыг шинэчилсэн. Тиймээс хувийн гүйлгээ нь өөрчлөгддөггүй байдлыг хангадаг боловч үүнтэй зэрэгцэн мэдээллийг гуравдагч этгээдэд ил гаргадаггүй.

дүгнэлт

Бид супермаркет болон агуулахын эзэн гэсэн хоёр талын сүлжээг байршуулан агуулахад хамгийн сүүлийн үеийн температурын мэдээллээр хангах зорилгоор Чуулгын арилжааны хэрэглээний жишээг авч үзсэн.

Температурын талаарх хамгийн сүүлийн үеийн мэдээллийг төрийн болон хувийн гүйлгээгээр хэрхэн хадгалах боломжтойг бид харуулсан.

Хэрэглээний олон хувилбар байж болох бөгөөд таны харж байгаагаар энэ нь тийм ч хэцүү биш юм.

Туршилт хийж, скриптээ өргөжүүлэхийг хичээгээрэй. Түүнээс гадна блокчейн технологийн салбар 2024 он гэхэд бараг арав дахин өсөх боломжтой.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх