মাল্টি-পার্টি কম্পিউটেশন এবং গোপনীয় স্থানের সাথে কীভাবে ডিজিটাল সম্পদ লেনদেন করবেন, মাল্টি-পার্টি কম্পিউটেশন এবং গোপনীয় স্থানের সাথে কীভাবে ডিজিটাল সম্পদ লেনদেন করবেন

1. ওভারভিউ

আমরা শুরু করার আগে, যদিও সম্পূর্ণরূপে প্রয়োজনীয় নয়, নিম্নলিখিত বৈশিষ্ট্য এবং ধারণাগুলির একটি কার্যকরী জ্ঞান এই কোডল্যাবে সহায়ক প্রমাণিত হবে।

4670cd5427aa39a6.png

আপনি কি শিখবেন

এই ল্যাবটি গোপনীয় স্থান ব্যবহার করে MPC-সম্মত ব্লকচেইন স্বাক্ষর করার জন্য একটি রেফারেন্স বাস্তবায়ন প্রদান করে। ধারণাগুলিকে ব্যাখ্যা করার জন্য, আমরা এমন একটি দৃশ্যের মধ্য দিয়ে যাব যেখানে কোম্পানি প্রাইমাস কোম্পানি সেকেন্ডাসে ডিজিটাল সম্পদ স্থানান্তর করতে চায়। এই পরিস্থিতিতে, কোম্পানি প্রাইমাস একটি MPC-সঙ্গতিপূর্ণ মডেল ব্যবহার করে, যার অর্থ পৃথক ব্যক্তিগত কী ব্যবহার করার পরিবর্তে, তারা বিতরণ করা কী শেয়ার ব্যবহার করে। এই মূল শেয়ারগুলি একাধিক পক্ষের হাতে রয়েছে, এক্ষেত্রে অ্যালিস এবং বব৷ এই পদ্ধতিটি কোম্পানি প্রাইমাসকে সরলীকৃত ব্যবহারকারীর অভিজ্ঞতা, অপারেশনাল দক্ষতা এবং তাদের ব্যক্তিগত কীগুলির উপর নিয়ন্ত্রণ সহ বিভিন্ন সুবিধা প্রদান করে।

এই প্রক্রিয়ার মৌলিক দিকগুলি ব্যাখ্যা করার জন্য, আমরা প্রযুক্তিগত সেটআপের বিশদ বিবরণ দেব এবং আপনাকে অনুমোদন এবং স্বাক্ষর প্রক্রিয়ার মধ্য দিয়ে নিয়ে যাব যা কোম্পানি প্রাইমাস থেকে কোম্পানি সেকেন্ডাসে ডিজিটাল সম্পদ স্থানান্তর শুরু করে। অনুগ্রহ করে মনে রাখবেন যে বব এবং অ্যালিস, যারা উভয় কোম্পানি প্রাইমাসের কর্মচারী, তাদের অবশ্যই লেনদেন অনুমোদন করতে হবে।

যদিও এই রেফারেন্স বাস্তবায়ন স্বাক্ষর ক্রিয়াকলাপ প্রদর্শন করে, এটি MPC কী ব্যবস্থাপনার সমস্ত দিককে কভার করে না। উদাহরণস্বরূপ, আমরা মূল প্রজন্ম নিয়ে আলোচনা করি না। উপরন্তু, বিকল্প এবং পরিপূরক পদ্ধতি রয়েছে, যেমন সহ-স্বাক্ষর তৈরি করতে নন-Google ক্লাউড পরিষেবাগুলি ব্যবহার করা বা সহ-স্বাক্ষরকারীদের তাদের নিজস্ব পরিবেশে ব্লকচেইন স্বাক্ষর তৈরি করা, যা আরও বিকেন্দ্রীভূত স্থাপত্য। আমরা আশা করি যে এই ল্যাবটি Google ক্লাউডে MPC-তে বিভিন্ন পদ্ধতির জন্য অনুপ্রাণিত করবে।

আপনি একটি সাধারণ কাজের চাপের সাথে কাজ করবেন যা সহ-স্বাক্ষরকারী কী উপকরণ ব্যবহার করে গোপনীয় স্থানে একটি Ethereum লেনদেন স্বাক্ষর করে। ইথেরিয়াম লেনদেন স্বাক্ষর একটি প্রক্রিয়া যার মাধ্যমে একজন ব্যবহারকারী ইথেরিয়াম ব্লকচেইনে একটি লেনদেন অনুমোদন করতে পারে। একটি Ethereum লেনদেন পাঠাতে, আপনাকে আপনার ব্যক্তিগত কী দিয়ে এটিতে স্বাক্ষর করতে হবে। এটি প্রমাণ করে যে আপনি অ্যাকাউন্টের মালিক এবং লেনদেন অনুমোদন করেন। স্বাক্ষর প্রক্রিয়া নিম্নরূপ:

  1. প্রেরক একটি লেনদেন বস্তু তৈরি করে যা প্রাপকের ঠিকানা, পাঠানোর জন্য ETH-এর পরিমাণ এবং অন্যান্য প্রাসঙ্গিক ডেটা নির্দিষ্ট করে।
  2. লেনদেনের ডেটা হ্যাশ করতে প্রেরকের ব্যক্তিগত কী ব্যবহার করা হয়।
  3. হ্যাশ তারপর ব্যক্তিগত কী দিয়ে স্বাক্ষরিত হয়।
  4. স্বাক্ষরটি লেনদেন বস্তুর সাথে সংযুক্ত করা হয়।
  5. লেনদেনটি Ethereum নেটওয়ার্কে সম্প্রচার করা হয়।

যখন নেটওয়ার্কে একটি নোড একটি লেনদেন পায়, তখন এটি অ্যাকাউন্টের মালিক দ্বারা স্বাক্ষরিত হয়েছে তা নিশ্চিত করতে স্বাক্ষরটি যাচাই করে৷ স্বাক্ষর বৈধ হলে, নোড ব্লকচেইনে লেনদেন যোগ করবে।

শুরু করার জন্য, আপনি প্রয়োজনীয় ক্লাউড সংস্থানগুলি কনফিগার করবেন। তারপর, আপনি গোপনীয় স্থানে কাজের চাপ চালাবেন। এই কোডল্যাব আপনাকে নিম্নোক্ত উচ্চ-স্তরের পদক্ষেপের মাধ্যমে গাইড করবে:

  • গোপনীয় স্থান চালানোর জন্য প্রয়োজনীয় ক্লাউড সংস্থানগুলি কীভাবে কনফিগার করবেন
  • কীভাবে এর বৈশিষ্ট্যগুলির উপর ভিত্তি করে সুরক্ষিত সংস্থানগুলিতে অ্যাক্সেস অনুমোদন করবেন:
  • কি : কাজের চাপের ধারক
  • কোথায় : গোপনীয় স্থানের পরিবেশ (গোপনীয় ভিএম-এ গোপন স্থানের চিত্র)
  • কে : যে অ্যাকাউন্টটি কাজের চাপ চালাচ্ছে
  • গোপনীয় স্থান VM ইমেজ চলমান একটি গোপনীয় ভিএম-এ কাজের চাপ কীভাবে চালাবেন

প্রয়োজনীয় API

এই নির্দেশিকাটি সম্পূর্ণ করতে সক্ষম হতে আপনাকে অবশ্যই নির্দিষ্ট প্রকল্পগুলিতে নিম্নলিখিত APIগুলি সক্রিয় করতে হবে৷

API নাম

API শিরোনাম

cloudkms.googleapis.com

ক্লাউড কেএমএস

compute.googleapis.com

কম্পিউট ইঞ্জিন

confidentialcomputing.googleapis.com

গোপনীয় কম্পিউটিং

iamcredentials.googleapis.com

আইএএম

artifactregistry.googleapis.com

আর্টিফ্যাক্ট রেজিস্ট্রি

2. ক্লাউড রিসোর্স সেট আপ করুন৷

আপনি শুরু করার আগে

  • এই কোডল্যাবের অংশ হিসাবে ব্যবহৃত প্রয়োজনীয় স্ক্রিপ্টগুলি পেতে নীচের কমান্ডটি ব্যবহার করে এই সংগ্রহস্থলটি ক্লোন করুন।
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • এই কোডল্যাবের জন্য ডিরেক্টরি পরিবর্তন করুন।
cd confidential-space/codelabs/digital_asset_transaction_codelab/scripts
  • নিশ্চিত করুন যে আপনি নীচে দেখানো হিসাবে প্রয়োজনীয় প্রকল্প পরিবেশ ভেরিয়েবল সেট করেছেন। একটি GCP প্রকল্প সেট আপ সম্পর্কে আরও তথ্যের জন্য, অনুগ্রহ করে এই কোডল্যাবটি পড়ুন। কিভাবে প্রজেক্ট আইডি পুনরুদ্ধার করা যায় এবং এটি কিভাবে প্রজেক্টের নাম এবং প্রোজেক্ট নম্বর থেকে আলাদা সে সম্পর্কে বিস্তারিত জানতে আপনি এটি উল্লেখ করতে পারেন। .
export PRIMUS_PROJECT_ID=<GCP project id>
  • আপনার প্রকল্পগুলির জন্য বিলিং সক্ষম করুন
  • উভয় প্রকল্পের জন্য গোপনীয় কম্পিউটিং API এবং অনুসরণকারী API সক্ষম করুন৷
gcloud services enable \
   cloudapis.googleapis.com \
    cloudkms.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • সম্পদের নামের জন্য ভেরিয়েবল সেট করতে, আপনি নিম্নলিখিত কমান্ড ব্যবহার করতে পারেন। মনে রাখবেন যে এটি কোম্পানি A-এর জন্য আপনার GCP প্রকল্পের নির্দিষ্ট রিসোর্স নামগুলিকে ওভাররাইড করবে, উদাহরণস্বরূপ, export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket'
  • কোম্পানি A-তে আপনার GCP প্রকল্পের জন্য নিম্নলিখিত ভেরিয়েবল সেট করা যেতে পারে:

$PRIMUS_INPUT_STORAGE_BUCKET

যে বালতি এনক্রিপ্ট করা কী সংরক্ষণ করে।

$PRIMUS_RESULT_STORAGE_BUCKET

MPC লেনদেনের ফলাফল সঞ্চয় করে এমন বালতি।

$PRIMUS_KEY

প্রাইমাস ব্যাঙ্কের জন্য $PRIMUS_INPUT_STORAGE_BUCKET-এ সঞ্চিত ডেটা এনক্রিপ্ট করতে ব্যবহৃত KMS কী।

$PRIMUS_KEYRING

KMS কীরিং যা প্রাইমাস ব্যাঙ্কের জন্য $PRIMUS_KEY এনক্রিপশন কী তৈরি করতে ব্যবহার করা হবে।

$PRIMUS_WIP_PROVIDER

ওয়ার্কলোড আইডেন্টিটি পুল প্রদানকারী যা MPC ওয়ার্কলোড পরিষেবা দ্বারা স্বাক্ষরিত টোকেনের জন্য ব্যবহার করার জন্য বৈশিষ্ট্য শর্ত অন্তর্ভুক্ত করে।

$PRIMUS_SERVICEACCOUNT

পরিষেবা অ্যাকাউন্ট যা $PRIMUS_WORKLOAD_IDENTITY_POOL সুরক্ষিত সংস্থানগুলি অ্যাক্সেস করতে ব্যবহার করে৷ এই পরিষেবা অ্যাকাউন্টে $PRIMUS_INPUT_STORAGE_BUCKET বালতিতে সংরক্ষিত এনক্রিপ্ট করা কীগুলি দেখার অনুমতি থাকবে৷

$PRIMUS_ARTIFACT_REPOSITORY

ওয়ার্কলোড কন্টেইনার ইমেজ সংরক্ষণের জন্য আর্টিফ্যাক্ট ভান্ডার।

$WORKLOAD_SERVICEACCOUNT

যে পরিষেবা অ্যাকাউন্টের গোপনীয় VM অ্যাক্সেস করার অনুমতি রয়েছে যা কাজের চাপ চালায়।

$WORKLOAD_CONTAINER

ডকার কন্টেইনার যা কাজের চাপ চালায়।

$WORKLOAD_IMAGE_NAME

ওয়ার্কলোড কন্টেইনার ইমেজের নাম।

$WORKLOAD_IMAGE_TAG

ওয়ার্কলোড কন্টেইনার ছবির ট্যাগ।

  • সম্পদের নামের জন্য আপনার প্রকল্প আইডির উপর ভিত্তি করে মানগুলিতে অবশিষ্ট পরিবর্তনশীল নাম সেট করতে নিম্নলিখিত স্ক্রিপ্টটি চালান।
source config_env.sh

ক্লাউড সংস্থান সেট আপ করুন

এই পদক্ষেপের অংশ হিসাবে, আপনি বহু-দলীয় গণনার জন্য প্রয়োজনীয় ক্লাউড সংস্থানগুলি সেট আপ করবেন৷ এই ল্যাবের জন্য, আপনি নিম্নলিখিত ব্যক্তিগত কী ব্যবহার করবেন: 0000000000000000000000000000000000000000000000000000000000000001

একটি উত্পাদন পরিবেশে, আপনি আপনার নিজের ব্যক্তিগত কী তৈরি করবেন। যাইহোক, এই ল্যাবের উদ্দেশ্যে, আমরা এই ব্যক্তিগত কীটিকে দুটি ভাগে ভাগ করব এবং প্রতিটি এনক্রিপ্ট করব। একটি উত্পাদন দৃশ্যে, কীগুলি কখনই প্লেইনটেক্সট ফাইলগুলিতে সংরক্ষণ করা উচিত নয়। পরিবর্তে, ব্যক্তিগত কী Google ক্লাউডের বাইরে তৈরি করা যেতে পারে (অথবা সম্পূর্ণভাবে এড়িয়ে যাওয়া এবং কাস্টম MPC কী শার্ড তৈরির সাথে প্রতিস্থাপিত) এবং তারপর এনক্রিপ্ট করা যেতে পারে যাতে কেউ ব্যক্তিগত কী বা কী শেয়ারগুলিতে অ্যাক্সেস না পায়৷ এই ল্যাবের উদ্দেশ্যে আমরা Gcloud CLI ব্যবহার করব।

প্রয়োজনীয় ক্লাউড সংস্থান সেট আপ করতে নিম্নলিখিত স্ক্রিপ্টটি চালান। এই পদক্ষেপগুলির অংশ হিসাবে, নীচে উল্লিখিত সংস্থানগুলি তৈরি করা হবে:

  • একটি ক্লাউড স্টোরেজ বালতি ( $PRIMUS_INPUT_STORAGE_BUCKET ) এনক্রিপ্ট করা ব্যক্তিগত কী শেয়ার সংরক্ষণ করতে।
  • একটি ক্লাউড স্টোরেজ বাকেট ( $PRIMUS_RESULT_STORAGE_BUCKET ) ডিজিটাল সম্পদ লেনদেনের ফলাফল সংরক্ষণ করতে।
  • ব্যক্তিগত কী শেয়ার এনক্রিপ্ট করতে KMS-এ একটি এনক্রিপশন কী ( $PRIMUS_KEY ) এবং কীরিং ( $PRIMUS_KEYRING )৷
  • একটি ওয়ার্কলোড আইডেন্টিটি পুল ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) এটির প্রদানকারীর অধীনে কনফিগার করা বৈশিষ্ট্যের শর্তগুলির উপর ভিত্তি করে দাবিগুলি যাচাই করতে৷
  • একটি পরিষেবা অ্যাকাউন্ট ( $PRIMUS_SERVICEACCOUNT ) উপরে উল্লিখিত ওয়ার্কলোড আইডেন্টিটি পুল ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) এর সাথে নিম্নলিখিত IAM অ্যাক্সেস সহ সংযুক্ত:
  • KMS কী ব্যবহার করে ডেটা ডিক্রিপ্ট করতে roles/cloudkms.cryptoKeyDecrypter
  • ক্লাউড স্টোরেজ বাকেট থেকে ডেটা পড়ার জন্য objectViewer
  • এই পরিষেবা-অ্যাকাউন্টটিকে ওয়ার্কলোড আইডেন্টিটি পুলের সাথে সংযুক্ত করার জন্য roles/iam.workloadIdentityUser
./setup_resources.sh

3. কাজের চাপ তৈরি করুন

কাজের চাপ পরিষেবা-অ্যাকাউন্ট তৈরি করুন

আপনি এখন প্রয়োজনীয় ভূমিকা এবং অনুমতি সহ কাজের চাপের জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করবেন। এটি করার জন্য, নিম্নলিখিত স্ক্রিপ্টটি চালান, যা কোম্পানি A-এর জন্য একটি ওয়ার্কলোড পরিষেবা অ্যাকাউন্ট তৈরি করবে৷ এই পরিষেবা অ্যাকাউন্টটি VM দ্বারা ব্যবহৃত হবে যা কাজের চাপ চালায়৷

কাজের চাপ পরিষেবা-অ্যাকাউন্ট ( $WORKLOAD_SERVICEACCOUNT ) এর নিম্নলিখিত ভূমিকা থাকবে:

  • একটি প্রত্যয়ন টোকেন পেতে confidentialcomputing.workloadUser
  • logging.logWriter ক্লাউড লগিং-এ লগ লিখতে।
  • objectViewer $PRIMUS_INPUT_STORAGE_BUCKET ক্লাউড স্টোরেজ বাকেট থেকে ডেটা পড়ার জন্য।
  • objectUser $PRIMUS_RESULT_STORAGE_BUCKET ক্লাউড স্টোরেজ বালতিতে কাজের চাপের ফলাফল লিখতে।
./create_workload_service_account.sh

কাজের চাপ তৈরি করুন

এই ধাপে একটি ওয়ার্কলোড ডকার ইমেজ তৈরি করা জড়িত। এই কোডল্যাবে কাজের চাপ হল একটি সাধারণ Node.js MPC অ্যাপ্লিকেশন যা এনক্রিপ্ট করা ব্যক্তিগত কী শেয়ার ব্যবহার করে সম্পদ স্থানান্তরের জন্য ডিজিটাল লেনদেনের স্বাক্ষর করে। এখানে কাজের চাপ প্রকল্প কোড. কাজের চাপ প্রকল্প নিম্নলিখিত ফাইল অন্তর্ভুক্ত.

package.json: এই ফাইলটিতে প্যাকেজগুলির তালিকা রয়েছে যা কাজের চাপ MPC অ্যাপ্লিকেশনের জন্য ব্যবহার করা উচিত। এই ক্ষেত্রে, আমরা @google-cloud/kms, @google-cloud/storage, ethers এবং fast-crc32c লাইব্রেরি ব্যবহার করছি। এখানে package.json ফাইলটি রয়েছে যা আমরা এই কোডল্যাবের জন্য ব্যবহার করব।

index.js: এটি ওয়ার্কলোড অ্যাপ্লিকেশনের একটি এন্ট্রিপয়েন্ট এবং ওয়ার্কলোড কন্টেইনার শুরু হলে কোন কমান্ডগুলি চালানো উচিত তা নির্দিষ্ট করে। আমরা একটি নমুনা স্বাক্ষরবিহীন লেনদেনও অন্তর্ভুক্ত করেছি যা সাধারণত একটি অবিশ্বস্ত অ্যাপ্লিকেশন দ্বারা সরবরাহ করা হবে যা ব্যবহারকারীদের তাদের স্বাক্ষরের জন্য জিজ্ঞাসা করে। এই index.js ফাইলটি mpc.js থেকে ফাংশন ইম্পোর্ট করে, যা আমরা পরবর্তীতে তৈরি করব। নীচে index.js ফাইলের বিষয়বস্তু রয়েছে এবং আপনি এটি এখানেও খুঁজে পেতে পারেন।

import {signTransaction, submitTransaction, uploadFromMemory} from './mpc.js';

const signAndSubmitTransaction = async () => {
  try {
    // Create the unsigned transaction object
    const unsignedTransaction = {
      nonce: 0,
      gasLimit: 21000,
      gasPrice: '0x09184e72a000',
      to: '0x0000000000000000000000000000000000000000',
      value: '0x00',
      data: '0x',
    };

    // Sign the transaction
    const signedTransaction = await signTransaction(unsignedTransaction);

    // Submit the transaction to Ganache
    const transaction = await submitTransaction(signedTransaction);

    // Write the transaction receipt
    uploadFromMemory(transaction);

    return transaction;
  } catch (e) {
    console.log(e);
    uploadFromMemory(e);
  }
};

await signAndSubmitTransaction();

mpc.js: এখানেই লেনদেন স্বাক্ষর হয়। এটি kms-decrypt এবং credential-config থেকে ফাংশন আমদানি করে, যা আমরা পরবর্তী কভার করব। নীচে mpc.js ফাইলের বিষয়বস্তু রয়েছে এবং আপনি এটি এখানেও খুঁজে পেতে পারেন।

import {Storage} from '@google-cloud/storage';
import {ethers} from 'ethers';

import {credentialConfig} from './credential-config.js';
import {decryptSymmetric} from './kms-decrypt.js';

const providers = ethers.providers;
const Wallet = ethers.Wallet;

// The ID of the GCS bucket holding the encrypted keys
const bucketName = process.env.KEY_BUCKET;

// Name of the encrypted key files.
const encryptedKeyFile1 = 'alice_encrypted_key_share';
const encryptedKeyFile2 = 'bob_encrypted_key_share';

// Create a new storage client with the credentials
const storageWithCreds = new Storage({
  credentials: credentialConfig,
});

// Create a new storage client without the credentials
const storage = new Storage();

const downloadIntoMemory = async (keyFile) => {
  // Downloads the file into a buffer in memory.
  const contents =
      await storageWithCreds.bucket(bucketName).file(keyFile).download();

  return contents;
};

const provider =
    new providers.JsonRpcProvider(`http://${process.env.NODE_URL}:80`);

export const signTransaction = async (unsignedTransaction) => {
  /* Check if Alice and Bob have both approved the transaction
  For this example, we're checking if their encrypted keys are available. */
  const encryptedKey1 =
      await downloadIntoMemory(encryptedKeyFile1).catch(console.error);
  const encryptedKey2 =
      await downloadIntoMemory(encryptedKeyFile2).catch(console.error);

  // For each key share, make a call to KMS to decrypt the key
  const privateKeyshare1 = await decryptSymmetric(encryptedKey1[0]);
  const privateKeyshare2 = await decryptSymmetric(encryptedKey2[0]);

  /* Perform the MPC calculations
  In this example, we're combining the private key shares
  Alternatively, you could import your mpc calculations here */
  const wallet = new Wallet(privateKeyshare1 + privateKeyshare2);

  // Sign the transaction
  const signedTransaction = await wallet.signTransaction(unsignedTransaction);

  return signedTransaction;
};

export const submitTransaction = async (signedTransaction) => {
  // This can now be sent to Ganache
  const hash = await provider.sendTransaction(signedTransaction);
  return hash;
};

export const uploadFromMemory = async (contents) => {
  // Upload the results to the bucket without service account impersonation
  await storage.bucket(process.env.RESULTS_BUCKET)
      .file('transaction_receipt_' + Date.now())
      .save(JSON.stringify(contents));
};

kms-decrypt.js: এই ফাইলটিতে KMS-এ পরিচালিত কী ব্যবহার করে ডিক্রিপশনের কোড রয়েছে। নিচে kms-decrypt.js ফাইলের বিষয়বস্তু রয়েছে এবং আপনি এটি এখানেও খুঁজে পেতে পারেন।

import {KeyManagementServiceClient} from '@google-cloud/kms';
import crc32c from 'fast-crc32c';

import {credentialConfig} from './credential-config.js';

const projectId = process.env.PRIMUS_PROJECT_ID;
const locationId = process.env.PRIMUS_LOCATION;
const keyRingId = process.env.PRIMUS_ENC_KEYRING;
const keyId = process.env.PRIMUS_ENC_KEY;

// Instantiates a client
const client = new KeyManagementServiceClient({
  credentials: credentialConfig,
});

// Build the key name
const keyName = client.cryptoKeyPath(projectId, locationId, keyRingId, keyId);

export const decryptSymmetric = async (ciphertext) => {
  const ciphertextCrc32c = crc32c.calculate(ciphertext);
  const [decryptResponse] = await client.decrypt({
    name: keyName,
    ciphertext,
    ciphertextCrc32c: {
      value: ciphertextCrc32c,
    },
  });

  // Optional, but recommended: perform integrity verification on
  // decryptResponse. For more details on ensuring E2E in-transit integrity to
  // and from Cloud KMS visit:
  // https://cloud.google.com/kms/docs/data-integrity-guidelines
  if (crc32c.calculate(decryptResponse.plaintext) !==
      Number(decryptResponse.plaintextCrc32c.value)) {
    throw new Error('Decrypt: response corrupted in-transit');
  }

  const plaintext = decryptResponse.plaintext.toString();

  return plaintext;
};

credential-config.js: ফাইলটি ওয়ার্কলোড আইডেন্টিটি পুল পাথ এবং পরিষেবা অ্যাকাউন্টের ছদ্মবেশের জন্য বিশদ সংরক্ষণ করে। এখানে credential-config.js ফাইল রয়েছে যা আমরা এই কোডল্যাবের জন্য ব্যবহার করব।

ডকারফাইল: অবশেষে, আমরা আমাদের ডকারফাইল তৈরি করব যা ওয়ার্কলোড ডকার ইমেজ তৈরি করতে ব্যবহার করা হবে। এখানে উল্লেখ করা ডকারফাইলকে সংজ্ঞায়িত করে।

FROM node:16.18.0

ENV NODE_ENV=production

WORKDIR /app

COPY ["package.json", "package-lock.json*", "./"]

RUN npm install --production

COPY . .

LABEL "tee.launch_policy.allow_cmd_override"="true"
LABEL "tee.launch_policy.allow_env_override"="NODE_URL,RESULTS_BUCKET,KEY_BUCKET,PRIMUS_PROJECT_NUMBER,PRIMUS_PROJECT_ID,PRIMUS_WORKLOAD_IDENTITY_POOL,PRIMUS_WIP_PROVIDER,PRIMUS_SERVICEACCOUNT,PRIMUS_ENC_KEYRING,PRIMUS_ENC_KEY"

CMD [ "node", "index.js" ]

দ্রষ্টব্য: ডকারফাইলে LABEL "tee.launch_policy.allow_cmd_override"="true" হল ছবির লেখক দ্বারা সেট করা একটি লঞ্চ নীতি৷ এটি অপারেটরকে কাজের চাপ নির্বাহ করার সময় সিএমডিকে ওভাররাইড করার অনুমতি দেয়। ডিফল্টরূপে, allow_cmd_override মিথ্যা সেট করা আছে। LABEL "tee.launch_policy.allow_env_override" কনফিডেন্সিয়াল স্পেসকে বলে যে কোন পরিবেশের ভেরিয়েবল ইমেজ ব্যবহারকারীরা ব্যবহার করতে পারবেন।

একটি কাজের চাপ তৈরি করতে নিম্নলিখিত স্ক্রিপ্টটি চালান যেখানে নিম্নলিখিত পদক্ষেপগুলি সঞ্চালিত হচ্ছে:

  • ওয়ার্কলোড ডকার ইমেজ সংরক্ষণ করতে আর্টিফ্যাক্ট রেজিস্ট্রি ( $PRIMUS_ARTIFACT_REPOSITORY ) তৈরি করুন।
  • প্রয়োজনীয় সম্পদের নাম সহ ওয়ার্কলোড কোড আপডেট করুন। এখানে এই কোডল্যাবের জন্য ব্যবহৃত ওয়ার্কলোড কোড।
  • ওয়ার্কলোড কোডের একটি ডকার ইমেজ তৈরির জন্য ডকারফাইল তৈরি করুন। আপনি এখানে ডকারফাইলটি খুঁজে পেতে পারেন।
  • আগের ধাপে তৈরি করা আর্টিফ্যাক্ট রেজিস্ট্রিতে ( $PRIMUS_ARTIFACT_REPOSITORY ) ডকার ইমেজ তৈরি করুন এবং প্রকাশ করুন।
  • $PRIMUS_ARTIFACT_REPOSITORY এর জন্য $WORKLOAD_SERVICEACCOUNT পড়ার অনুমতি দিন। এটি প্রয়োজনীয় যাতে কাজের চাপের ধারকটি আর্টিফ্যাক্ট রেজিস্ট্রি থেকে ওয়ার্কলোড ডকার ইমেজ টানতে পারে।
./create_workload.sh

ব্লকচেইন নোড তৈরি করুন

গণচে ইথেরিয়াম নোড

কাজের চাপ অনুমোদন করার আগে, আমাদের Ethereum Ganache উদাহরণ তৈরি করতে হবে। স্বাক্ষরিত লেনদেন এই Ganache উদাহরণে জমা দেওয়া হবে. অনুগ্রহ করে এই উদাহরণের আইপি ঠিকানার একটি নোট নিন। নীচের কমান্ডটি চালানোর পরে, আপনাকে API সক্ষম করতে y লিখতে হতে পারে।

gcloud compute instances create-with-container ${ETHEREUM_NODE} \
  --zone=${PRIMUS_PROJECT_ZONE} \
  --tags=http-server \
  --project=${PRIMUS_PROJECT_ID} \
  --shielded-secure-boot \
  --shielded-vtpm \
  --shielded-integrity-monitoring \
  --container-image=docker.io/trufflesuite/ganache:v7.7.3 \
--container-arg=--wallet.accounts=\"0x0000000000000000000000000000000000000000000000000000000000000001,0x21E19E0C9BAB2400000\" \
  --container-arg=--port=80

4. অনুমোদন এবং কাজের চাপ চালান

কাজের চাপ অনুমোদন করুন

এই পদক্ষেপের অংশ হিসাবে, আমরা ওয়ার্কলোড আইডেন্টিটি পুল ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) এর অধীনে ওয়ার্কলোড আইডেন্টিটি পুল প্রদানকারী সেট আপ করব৷ নিচে দেখানো হিসাবে কাজের চাপ পরিচয়ের জন্য কনফিগার করা বৈশিষ্ট্য-শর্ত আছে। শর্তগুলির মধ্যে একটি হল প্রত্যাশিত আর্টিফ্যাক্ট রিপোজিটরি থেকে কাজের চাপের চিত্রটি টেনে নেওয়া হচ্ছে তা যাচাই করা।

gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc ${PRIMUS_WIP_PROVIDER} \
 --location="${PRIMUS_PROJECT_LOCATION}" \
 --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
 --issuer-uri="https://confidentialcomputing.googleapis.com/" \
 --allowed-audiences="https://sts.googleapis.com" \
 --attribute-mapping="google.subject='assertion.sub'" \
 --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 'STABLE' in assertion.submods.confidential_space.support_attributes && assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && '$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

কাজের চাপ চালান

এই বিভাগটি কীভাবে গোপনীয় VM-এ কাজের চাপ চালাতে হয় তা ব্যাখ্যা করে। এটি করার জন্য, আমরা মেটাডেটা পতাকা ব্যবহার করে প্রয়োজনীয় TEE আর্গুমেন্ট পাস করব। অতিরিক্তভাবে, আমরা "tee-env-*" পতাকা ব্যবহার করে ওয়ার্কলোড কন্টেইনারের জন্য পরিবেশের ভেরিয়েবল সেট করব। চিত্রটিতে নিম্নলিখিত ভেরিয়েবল রয়েছে:

  • NODE_URL : Ethereum নোডের URL যা স্বাক্ষরিত লেনদেন প্রক্রিয়া করবে।
  • RESULTS_BUCKET : বালতি যা mpc লেনদেনের ফলাফল সংরক্ষণ করে।
  • KEY_BUCKET : বালতি যা mpc এনক্রিপ্ট করা কী সংরক্ষণ করে।
  • PRIMUS_PROJECT_NUMBER : শংসাপত্র কনফিগার ফাইলের জন্য ব্যবহৃত প্রকল্প নম্বর।
  • PRIMUS_PROJECT_ID : প্রজেক্ট আইডি ক্রেডেনশিয়াল কনফিগারেশন ফাইলের জন্য ব্যবহৃত হয়। ওয়ার্কলোড এক্সিকিউশনের ফলাফল $PRIMUS_RESULT_STORAGE_BUCKET এ প্রকাশিত হবে।
  • PRIMUS_WORKLOAD_IDENTITY_POOL : ওয়ার্কলোড আইডেন্টিটি পুল দাবি যাচাই করতে ব্যবহৃত হয়।
  • PRIMUS_WIP_POROVIDER : ওয়ার্কলোড আইডেন্টিটি পুল প্রদানকারী যা কাজের চাপ দ্বারা উপস্থাপিত টোকেন যাচাই করার জন্য ব্যবহার করার জন্য বৈশিষ্ট্য শর্তাবলী অন্তর্ভুক্ত করে।
  • WORKLOAD_SERVICEACCOUNT : কাজের চাপের পরিষেবা-অ্যাকাউন্ট।
gcloud compute instances create $WORKLOAD_VM \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform \
 --zone=${PRIMUS_PROJECT_ZONE} \
 --project=${PRIMUS_PROJECT_ID} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG~tee-restart-policy=Never~tee-env-NODE_URL=$(gcloud compute instances describe ${ETHEREUM_NODE} --format='get(networkInterfaces[0].networkIP)' --zone=${PRIMUS_PROJECT_ZONE})~tee-env-RESULTS_BUCKET=$PRIMUS_RESULT_STORAGE_BUCKET~tee-env-KEY_BUCKET=$PRIMUS_INPUT_STORAGE_BUCKET~tee-env-PRIMUS_PROJECT_ID=$PRIMUS_PROJECT_ID~tee-env-PRIMUS_PROJECT_NUMBER=$(gcloud projects describe $PRIMUS_PROJECT_ID --format="value(projectNumber)")~tee-env-PRIMUS_WORKLOAD_IDENTITY_POOL=$PRIMUS_WORKLOAD_IDENTITY_POOL~tee-env-PRIMUS_PROJECT_LOCATION=${PRIMUS_PROJECT_LOCATION}~tee-env-PRIMUS_WIP_PROVIDER=$PRIMUS_WIP_PROVIDER~tee-env-PRIMUS_SERVICEACCOUNT=$PRIMUS_SERVICEACCOUNT~tee-env-PRIMUS_KEY=${PRIMUS_KEY}~tee-env-PRIMUS_KEYRING=${PRIMUS_KEYRING}"

ক্লাউড স্টোরেজ ফলাফল পরীক্ষা করুন

আপনি ক্লাউড স্টোরেজে লেনদেনের রসিদ দেখতে পারেন। গোপনীয় স্থান বুট হতে এবং ফলাফলগুলি প্রদর্শিত হতে কয়েক মিনিট সময় লাগতে পারে৷ আপনি জানতে পারবেন যখন VM বন্ধ অবস্থায় থাকে তখন ধারকটি সম্পন্ন হয়।

  1. ক্লাউড স্টোরেজ ব্রাউজার পৃষ্ঠায় যান।
  2. $PRIMUS_RESULT_STORAGE_BUCKET ক্লিক করুন।
  3. transaction_receipt ফাইলটিতে ক্লিক করুন।
  4. লেনদেনের প্রতিক্রিয়া ডাউনলোড এবং দেখতে ডাউনলোড ক্লিক করুন।

বিকল্পভাবে, আপনি ফলাফল দেখতে নিম্নলিখিত কমান্ড চালাতে পারেন।

gcloud config set project $PRIMUS_PROJECT_ID
gsutil cat gs://$PRIMUS_RESULT_STORAGE_BUCKET/transaction_receipt

দ্রষ্টব্য: ফলাফল না দেখালে, আপনি কম্পিউট ইঞ্জিন ক্লাউড কনসোল পৃষ্ঠায় $WORKLOAD_VM-এ যেতে পারেন এবং লগগুলি দেখতে "সিরিয়াল পোর্ট 1 (কনসোল)" এ ক্লিক করতে পারেন৷

Ganache Blockchain লেনদেন চেক করুন

এছাড়াও আপনি ব্লকচেইন লগে লেনদেন দেখতে পারেন।

  1. ক্লাউড কম্পিউট ইঞ্জিন পৃষ্ঠায় যান।
  2. ${ETHEREUM_NODE} VM এ ক্লিক করুন।
  3. SSH-ইন-ব্রাউজার উইন্ডো খুলতে SSH ক্লিক করুন।
  4. SSH উইন্ডোতে, চলমান Ganache কন্টেইনার দেখতে sudo docker ps লিখুন।
  5. trufflesuite/ganache:v7.7.3
  6. trufflesuite/ganache:v7.7.3 জন্য ID দিয়ে CONTAINER_ID প্রতিস্থাপন করে sudo docker logs CONTAINER_ID :v7.7.3।
  7. Ganache-এর লগগুলি দেখুন এবং নিশ্চিত করুন যে লগগুলিতে তালিকাভুক্ত একটি লেনদেন আছে৷

5. পরিষ্কার করুন

এই কোডল্যাবের অংশ হিসাবে আমরা যে সংস্থানগুলি তৈরি করেছি তা পরিষ্কার করতে এখানে স্ক্রিপ্টটি ব্যবহার করা যেতে পারে। এই পরিষ্কারের অংশ হিসাবে, নিম্নলিখিত সংস্থানগুলি মুছে ফেলা হবে:

  • এনক্রিপ্ট করা কী শেয়ার ( $PRIMUS_INPUT_STORAGE_BUCKET) সংরক্ষণ করতে ব্যবহৃত ইনপুট স্টোরেজ বালতি।
  • এনক্রিপশন কী ( $PRIMUS_KEY )।
  • সংরক্ষিত সংস্থানগুলি অ্যাক্সেস করতে ব্যবহৃত পরিষেবা-অ্যাকাউন্ট ( $PRIMUS_SERVICEACCOUNT )।
  • কাজের চাপের পরিচয় পুল ( $PRIMUS_WORKLOAD_IDENTITY_POOL )।
  • কাজের চাপ পরিষেবা অ্যাকাউন্ট ( $WORKLOAD_SERVICEACCOUNT )।
  • ওয়ার্কলোড কম্পিউট ইনস্ট্যান্স ( $WORKLOAD_VM & $ETHEREUM_NODE )।
  • লেনদেনের ফলাফল সঞ্চয় করতে ব্যবহৃত ফলাফল স্টোরেজ বাকেট।( $PRIMUS_RESULT_STORAGE_BUCKET )।
  • আর্টিফ্যাক্ট রেজিস্ট্রি ওয়ার্কলোড ইমেজ ( $PRIMUS_ARTIFACT_REPOSITORY ) সংরক্ষণ করতে ব্যবহৃত হয়।
./cleanup.sh

আপনি যদি অন্বেষণ শেষ করে থাকেন, তাহলে অনুগ্রহ করে আপনার প্রকল্প মুছে ফেলার কথা বিবেচনা করুন।

  • ক্লাউড প্ল্যাটফর্ম কনসোলে যান
  • আপনি যে প্রকল্পটি বন্ধ করতে চান তা নির্বাচন করুন, তারপরে শীর্ষে "মুছুন" এ ক্লিক করুন৷ এটি মুছে ফেলার জন্য প্রকল্পের সময়সূচী।

এরপর কি?

এই অনুরূপ কোডল্যাবগুলির কিছু পরীক্ষা করে দেখুন...

আরও পড়া