قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

نصاب قانوني هي عبارة عن blockchain قائم على Ethereum تم تطويره بواسطة JPMorgan وأصبح مؤخرًا أول منصة لدفتر الأستاذ الموزعة التي تقدمها Microsoft Azure.

يدعم النصاب المعاملات الخاصة والعامة وله العديد من حالات الاستخدام التجاري.

في هذه المقالة، سندرس أحد هذه السيناريوهات - نشر شبكة دفتر الأستاذ الموزعة بين السوبر ماركت ومالك المستودع لتوفير معلومات محدثة حول درجة حرارة المستودع.

الكود المستخدم في هذا البرنامج التعليمي موجود مستودعات على جيثب.

تتناول المقالة:

  • إنشاء عقد ذكي؛
  • نشر شبكة النصاب باستخدام تشينستاك;
  • نصاب المعاملات العامة؛
  • النصاب القانوني للمعاملات الخاصة.

وللتوضيح، نستخدم سيناريو لمراقبة درجة الحرارة في مستودعات أعضاء شبكة Quorum ضمن إنترنت الأشياء (IoT).

السياق

تتحد مجموعة من شركات المستودعات في اتحاد لتخزين المعلومات بشكل مشترك وأتمتة العمليات على blockchain. ولهذا قررت الشركات استخدام النصاب القانوني. سنغطي في هذه المقالة سيناريوهين: المعاملات العامة والمعاملات الخاصة.

يتم إنشاء المعاملات من قبل مشاركين مختلفين للتفاعل مع الاتحاد الذي ينتمون إليه. تنشر كل معاملة عقدًا أو تستدعي وظيفة في العقد لتحميل البيانات إلى الشبكة. يتم نسخ هذه الإجراءات إلى كافة العقد الموجودة على الشبكة.

المعاملات العامة متاحة للعرض من قبل جميع المشاركين في الكونسورتيوم. تضيف المعاملات الخاصة طبقة من السرية وهي متاحة فقط للمشاركين الذين لديهم الحق في القيام بذلك.

في كلا السيناريوهين، نستخدم نفس العقد من أجل الوضوح.

عقد ذكي

فيما يلي عقد ذكي بسيط تم إنشاؤه للسيناريو الخاص بنا. لديها متغير عام 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

الآن بعد أن أصبح العقد جاهزًا، سنقوم بنشر الشبكة ونشر العقد.

نشر العقدة

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

قد يتطلب نشر العقدة عمالة كثيفة ويمكن استبدال هذه العملية باستخدام إحدى الخدمات تشينستاك.

فيما يلي عملية نشر شبكة Quorum بإجماع Raft وثلاث عقد.

أولاً، لنقم بإنشاء مشروع ونطلق عليه اسم مشروع النصاب:

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

لنقم بإنشاء شبكة Quorum بإجماع Raft على Google Cloud Platform:

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

دعونا نضيف عقدتين أخريين إلى العقدة التي تم إنشاؤها بالفعل افتراضيًا:

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

ثلاث عقد قيد التشغيل:

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

تعرض صفحة تفاصيل العقدة نقطة نهاية RPC والمفتاح العام وما إلى ذلك.

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

يتم نشر الشبكة. الآن دعونا ننشر العقود الذكية وننفذ المعاملات باستخدامها web3.js.

المعاملات العامة

السياق

تلعب درجة حرارة المستودعات أهمية كبيرة في تقليل التكاليف، خاصة بالنسبة للمنتجات المراد تخزينها في درجات حرارة تحت الصفر.

ومن خلال السماح للشركات بمشاركة درجة الحرارة الخارجية لموقعها الجغرافي في الوقت الفعلي وتسجيلها في دفتر حسابات غير قابل للتغيير، يعمل المشاركون في الشبكة على تقليل التكاليف والوقت.

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

سنقوم بتنفيذ ثلاث مهام، كما هو موضح في الرسم البياني:

  1. سنقوم بنشر العقد عبر عقدة 1:

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

  2. ضبط درجة الحرارة عن طريق عقدة 2 بمقدار 3 درجات:

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

  3. عقدة 3 سوف تتلقى معلومات من العقد الذكي. سيعيد العقد القيمة 3 درجات:

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

    بعد ذلك، سننظر في كيفية تنفيذ معاملة عامة على شبكة Quorum باستخدام 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 يتم تنفيذها على عقدة محلية ولن يتم إنشاء المعاملة على 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);
}

الآن يمكنك الركض public.js للحصول على النتيجة التالية:

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

بعد ذلك، يمكننا عرض الإدخالات في مستكشف Quorum في لوحة Chainstack، كما هو موضح أدناه.

تفاعلت العقد الثلاث وتم تحديث المعاملات:

  1. نشرت المعاملة الأولى العقد.
  2. الصفقة الثانية حددت درجة حرارة العقد بـ 3 درجات.
  3. يتم تلقي درجة الحرارة من خلال عقدة محلية، لذلك لا يتم إنشاء أي معاملة.

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

المعاملات الخاصة

السياق

أحد المتطلبات الشائعة للمنظمات هو حماية البيانات. على سبيل المثال، فكر في السيناريو الذي سوبر ماركت يستأجر مساحة مستودع لتخزين المأكولات البحرية من مكان منفصل بائع:

  • بائع باستخدام مستشعرات إنترنت الأشياء، يقرأ قيم درجة الحرارة كل 30 ثانية وينقلها إلى السوبرماركت;
  • يجب أن تكون هذه القيم متاحة فقط إلى البائع и إلى السوبرماركت، متصل بالشبكة من قبل كونسورتيوم.

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

سوف نقوم بإكمال المهام الأربع الموضحة في الرسم البياني أعلاه.

  • نستخدم نفس العقد الثلاث من السيناريو السابق لإظهار المعاملات الخاصة:
  • سوبر ماركت ينشر عقدًا ذكيًا خاصًا بـ سوبر ماركت и بائع.
  • الجانب الثالث ليس لديه الحق في الوصول إلى العقد الذكي.

سوف نسمي الطرق 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، ولكن الجانب الثالث لا يستطيع الوصول إلى العقد الذكي. لذلك يجب أن تكون قيمة الإرجاع فارغة.

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

    بعد ذلك، سنلقي نظرة فاحصة على إجراء المعاملات الخاصة على شبكة Quorum باستخدام 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 من أحد المشاركين بائع.

قم بإجراء المعاملات العامة والخاصة على سلسلة JPMorgan Quorum blockchain باستخدام Web3

كما ترون، تم إكمال كلا المعاملتين، ولكن المعاملة من المشارك فقط بائع تم تحديث درجة الحرارة في العقد. وبالتالي، توفر المعاملات الخاصة الثبات، ولكنها في الوقت نفسه لا تكشف عن البيانات لطرف ثالث.

اختتام

لقد نظرنا في حالة الاستخدام التجاري لـ Quorum لتوفير معلومات حديثة عن درجة الحرارة في أحد المستودعات من خلال نشر شبكة بين طرفين - سوبر ماركت ومالك المستودع.

لقد أظهرنا كيف يمكن الحفاظ على معلومات درجة الحرارة الحديثة من خلال المعاملات العامة والخاصة.

يمكن أن يكون هناك الكثير من سيناريوهات التطبيق، وكما ترون، فالأمر ليس صعبًا على الإطلاق.

التجربة، حاول توسيع البرنامج النصي الخاص بك. علاوة على ذلك، صناعة تكنولوجيا blockchain يمكن أن تنمو بمقدار عشرة أضعاف تقريبًا بحلول عام 2024.

المصدر: www.habr.com

إضافة تعليق