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

আপনি যা শিখবেন
এই ল্যাবটি কনফিডেনশিয়াল স্পেস ব্যবহার করে এমপিসি-সম্মত ব্লকচেইন সাইনিং সম্পাদনের জন্য একটি রেফারেন্স ইমপ্লিমেন্টেশন প্রদান করে। ধারণাগুলো ব্যাখ্যা করার জন্য, আমরা এমন একটি পরিস্থিতি পর্যালোচনা করব যেখানে কোম্পানি প্রাইমাস, কোম্পানি সেকেন্ডাস-এর কাছে ডিজিটাল সম্পদ হস্তান্তর করতে চায়। এই পরিস্থিতিতে, কোম্পানি প্রাইমাস একটি এমপিসি-সম্মত মডেল ব্যবহার করে, যার অর্থ হলো তারা স্বতন্ত্র প্রাইভেট কী ব্যবহার করার পরিবর্তে ডিস্ট্রিবিউটেড কী শেয়ার ব্যবহার করে। এই কী শেয়ারগুলো একাধিক পক্ষের কাছে থাকে, এক্ষেত্রে অ্যালিস এবং ববের কাছে। এই পদ্ধতিটি কোম্পানি প্রাইমাসকে বেশ কিছু সুবিধা প্রদান করে, যার মধ্যে রয়েছে সরলীকৃত ইউজার এক্সপেরিয়েন্স, অপারেশনাল দক্ষতা এবং তাদের প্রাইভেট কীগুলোর উপর নিয়ন্ত্রণ।
এই প্রক্রিয়ার মৌলিক দিকগুলো ব্যাখ্যা করার জন্য, আমরা প্রযুক্তিগত বিন্যাসটি বিস্তারিতভাবে বর্ণনা করব এবং আপনাকে অনুমোদন ও স্বাক্ষর প্রক্রিয়াটি ধাপে ধাপে দেখাব, যার মাধ্যমে কোম্পানি প্রাইমাস থেকে কোম্পানি সেকেন্ডাসে ডিজিটাল সম্পদ হস্তান্তর শুরু হয়। অনুগ্রহ করে মনে রাখবেন যে, বব এবং অ্যালিস, যারা উভয়েই কোম্পানি প্রাইমাসের কর্মচারী, তাদের অবশ্যই এই লেনদেনটি অনুমোদন করতে হবে।
যদিও এই রেফারেন্স ইমপ্লিমেন্টেশনটি সিগনেচার অপারেশনগুলো প্রদর্শন করে, এটি এমপিসি কী ম্যানেজমেন্টের সমস্ত দিক অন্তর্ভুক্ত করে না। উদাহরণস্বরূপ, আমরা কী জেনারেশন নিয়ে আলোচনা করি না। এছাড়াও, বিকল্প এবং পরিপূরক পদ্ধতি রয়েছে, যেমন কো-সিগনেচার তৈরি করার জন্য নন-গুগল ক্লাউড পরিষেবা ব্যবহার করা অথবা কো-সাইনারদের তাদের নিজস্ব পরিবেশে ব্লকচেইন সিগনেচার তৈরি করতে দেওয়া, যা একটি অধিক বিকেন্দ্রীভূত আর্কিটেকচার। আমরা আশা করি যে এই ল্যাবটি গুগল ক্লাউডে এমপিসি-র জন্য বিভিন্ন পদ্ধতির অনুপ্রেরণা জোগাবে।
আপনাকে একটি সহজ কাজ করতে হবে, যেখানে কনফিডেনশিয়াল স্পেসে কো-সাইনার কী ম্যাটেরিয়াল ব্যবহার করে একটি ইথেরিয়াম ট্রানজ্যাকশন সাইন করতে হবে। ইথেরিয়াম ট্রানজ্যাকশন সাইনিং হলো এমন একটি প্রক্রিয়া যার মাধ্যমে একজন ব্যবহারকারী ইথেরিয়াম ব্লকচেইনে একটি ট্রানজ্যাকশন অনুমোদন করতে পারেন। একটি ইথেরিয়াম ট্রানজ্যাকশন পাঠাতে, আপনাকে আপনার প্রাইভেট কী দিয়ে এটি সাইন করতে হবে। এটি প্রমাণ করে যে আপনিই অ্যাকাউন্টটির মালিক এবং ট্রানজ্যাকশনটি অনুমোদন করছেন। সাইনিং প্রক্রিয়াটি নিম্নরূপ:
- প্রেরক একটি ট্রানজ্যাকশন অবজেক্ট তৈরি করেন, যেখানে প্রাপকের ঠিকানা, প্রেরণের জন্য ETH-এর পরিমাণ এবং অন্য যেকোনো প্রাসঙ্গিক তথ্য উল্লেখ করা থাকে।
- প্রেরকের ব্যক্তিগত কী ব্যবহার করে লেনদেনের ডেটা হ্যাশ করা হয়।
- এরপর হ্যাশটি প্রাইভেট কী দিয়ে স্বাক্ষর করা হয়।
- স্বাক্ষরটি ট্রানজ্যাকশন অবজেক্টের সাথে সংযুক্ত থাকে।
- লেনদেনটি ইথেরিয়াম নেটওয়ার্কে সম্প্রচার করা হয়।
যখন নেটওয়ার্কের কোনো নোড একটি ট্রানজ্যাকশন গ্রহণ করে, তখন এটি স্বাক্ষরটি যাচাই করে নিশ্চিত হয় যে সেটি অ্যাকাউন্টের মালিক দ্বারা স্বাক্ষরিত হয়েছে। স্বাক্ষরটি বৈধ হলে, নোডটি ট্রানজ্যাকশনটি ব্লকচেইনে যুক্ত করে।
শুরুতে, আপনাকে প্রয়োজনীয় ক্লাউড রিসোর্সগুলো কনফিগার করতে হবে। তারপর, কনফিডেনশিয়াল স্পেসে ওয়ার্কলোডটি চালাতে হবে। এই কোডল্যাবটি আপনাকে নিম্নলিখিত উচ্চ-স্তরের ধাপগুলোর মাধ্যমে পথ দেখাবে:
- কনফিডেনশিয়াল স্পেস চালানোর জন্য প্রয়োজনীয় ক্লাউড রিসোর্সগুলি কীভাবে কনফিগার করবেন
- নিম্নলিখিত বৈশিষ্ট্যগুলির উপর ভিত্তি করে সুরক্ষিত সম্পদে প্রবেশাধিকার কীভাবে অনুমোদন করবেন:
- কী : ওয়ার্কলোড কন্টেইনার
- কোথায় : গোপনীয় স্থান পরিবেশ (গোপনীয় ভিএম-এ থাকা গোপনীয় স্থানের চিত্র)
- কে : যে অ্যাকাউন্টটি ওয়ার্কলোডটি চালাচ্ছে
- কনফিডেনশিয়াল স্পেস ভিএম ইমেজ চালিত একটি কনফিডেনশিয়াল ভিএম-এ কীভাবে ওয়ার্কলোড চালাবেন
প্রয়োজনীয় এপিআই
এই নির্দেশিকাটি সম্পন্ন করতে আপনাকে নির্দিষ্ট প্রজেক্টগুলিতে নিম্নলিখিত API গুলি সক্রিয় করতে হবে।
এপিআই নাম | এপিআই শিরোনাম |
cloudkms.googleapis.com | ক্লাউড কেএমএস |
compute.googleapis.com | কম্পিউটার ইঞ্জিন |
confidentialcomputing.googleapis.com | গোপনীয় কম্পিউটিং |
iamcredentials.googleapis.com | আইএএম |
artifactregistry.googleapis.com | প্রত্নবস্তু রেজিস্ট্রি |
২. ক্লাউড রিসোর্স সেট আপ করুন
শুরু করার আগে
- এই কোডল্যাবের অংশ হিসেবে ব্যবহৃত প্রয়োজনীয় স্ক্রিপ্টগুলো পেতে নিচের কমান্ডটি ব্যবহার করে এই রিপোজিটরিটি ক্লোন করুন।
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>
- আপনার প্রোজেক্টগুলোর জন্য বিলিং চালু করুন ।
- উভয় প্রোজেক্টের জন্য কনফিডেনশিয়াল কম্পিউটিং এপিআই এবং নিম্নলিখিত এপিআইগুলো সক্রিয় করুন।
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 | কেএমএস কী-রিং যা প্রাইমাস ব্যাংকের জন্য $PRIMUS_KEY এনক্রিপশন কী তৈরি করতে ব্যবহৃত হবে। |
$PRIMUS_WIP_PROVIDER | ওয়ার্কলোড আইডেন্টিটি পুল প্রোভাইডার, যেটিতে এমপিসি ওয়ার্কলোড সার্ভিস দ্বারা স্বাক্ষরিত টোকেনগুলির জন্য ব্যবহারযোগ্য অ্যাট্রিবিউট কন্ডিশন অন্তর্ভুক্ত থাকে। |
$PRIMUS_SERVICEACCOUNT | $PRIMUS_WORKLOAD_IDENTITY_POOL সুরক্ষিত রিসোর্সগুলো অ্যাক্সেস করার জন্য যে সার্ভিস অ্যাকাউন্টটি ব্যবহার করে। এই সার্ভিস অ্যাকাউন্টটির $PRIMUS_INPUT_STORAGE_BUCKET বাকেটে সংরক্ষিত এনক্রিপ্টেড কীগুলো দেখার অনুমতি থাকবে। |
$PRIMUS_ARTIFACT_REPOSITORY | ওয়ার্কলোড কন্টেইনার ইমেজ সংরক্ষণের জন্য আর্টিফ্যাক্ট রিপোজিটরি। |
$WORKLOAD_SERVICEACCOUNT | যে সার্ভিস অ্যাকাউন্টের কাছে ওয়ার্কলোড চালনাকারী গোপনীয় ভিএম-টি অ্যাক্সেস করার অনুমতি আছে। |
$WORKLOAD_CONTAINER | ডকার কন্টেইনারটি যা ওয়ার্কলোডটি চালায়। |
$WORKLOAD_IMAGE_NAME | ওয়ার্কলোড কন্টেইনার ইমেজটির নাম। |
$WORKLOAD_IMAGE_TAG | ওয়ার্কলোড কন্টেইনার ইমেজের ট্যাগ। |
- রিসোর্স নামগুলোর জন্য আপনার প্রজেক্ট আইডির উপর ভিত্তি করে বাকি ভেরিয়েবল নামগুলোর মান সেট করতে নিম্নলিখিত স্ক্রিপ্টটি চালান।
source config_env.sh
ক্লাউড রিসোর্স সেট আপ করুন
এই ধাপের অংশ হিসেবে, আপনি মাল্টি-পার্টি কম্পিউটেশনের জন্য প্রয়োজনীয় ক্লাউড রিসোর্সগুলো সেট আপ করবেন। এই ল্যাবের জন্য, আপনি নিম্নলিখিত প্রাইভেট কী ব্যবহার করবেন: 0000000000000000000000000000000000000000000000000000000000000001
প্রোডাকশন এনভায়রনমেন্টে, আপনি আপনার নিজস্ব প্রাইভেট কী তৈরি করবেন। তবে, এই ল্যাবের জন্য, আমরা এই প্রাইভেট কী-টিকে দুটি শেয়ারে ভাগ করে প্রতিটি এনক্রিপ্ট করব। প্রোডাকশন পরিস্থিতিতে, কী-গুলো কখনোই প্লেইনটেক্সট ফাইলে সংরক্ষণ করা উচিত নয়। এর পরিবর্তে, প্রাইভেট কী-টি গুগল ক্লাউডের বাইরে তৈরি করা যেতে পারে (অথবা এটি পুরোপুরি বাদ দিয়ে কাস্টম এমপিসি কী শার্ড তৈরি করা যেতে পারে) এবং তারপর এনক্রিপ্ট করা যেতে পারে, যাতে প্রাইভেট কী বা কী শেয়ারগুলোতে কারও অ্যাক্সেস না থাকে। এই ল্যাবের জন্য আমরা Gcloud CLI ব্যবহার করব।
প্রয়োজনীয় ক্লাউড রিসোর্সগুলো সেট আপ করার জন্য নিম্নলিখিত স্ক্রিপ্টটি চালান। এই ধাপগুলোর অংশ হিসেবে, নিচে উল্লেখিত রিসোর্সগুলো তৈরি হবে:
- এনক্রিপ্টেড প্রাইভেট কী শেয়ারগুলো সংরক্ষণের জন্য একটি ক্লাউড স্টোরেজ বাকেট (
$PRIMUS_INPUT_STORAGE_BUCKET)। - ডিজিটাল অ্যাসেট লেনদেনের ফলাফল সংরক্ষণের জন্য একটি ক্লাউড স্টোরেজ বাকেট (
$PRIMUS_RESULT_STORAGE_BUCKET)। - প্রাইভেট কী শেয়ারগুলো এনক্রিপ্ট করার জন্য KMS-এ একটি এনক্রিপশন কী (
$PRIMUS_KEY) এবং কী-রিং ($PRIMUS_KEYRING)। - এর প্রোভাইডারের অধীনে কনফিগার করা অ্যাট্রিবিউট শর্তাবলীর উপর ভিত্তি করে ক্লেইম যাচাই করার জন্য একটি ওয়ার্কলোড আইডেন্টিটি পুল (
$PRIMUS_WORKLOAD_IDENTITY_POOL)। - উপরে উল্লিখিত ওয়ার্কলোড আইডেন্টিটি পুল (
$PRIMUS_WORKLOAD_IDENTITY_POOL)-এর সাথে সংযুক্ত একটি সার্ভিস অ্যাকাউন্ট ($PRIMUS_SERVICEACCOUNT)-এর নিম্নলিখিত IAM অ্যাক্সেস রয়েছে: - KMS কী ব্যবহার করে ডেটা ডিক্রিপ্ট করার জন্য
roles/cloudkms.cryptoKeyDecrypterব্যবহার করা হয়। - ক্লাউড স্টোরেজ বাকেট থেকে ডেটা পড়ার জন্য
objectViewer। - এই সার্ভিস-অ্যাকাউন্টটিকে ওয়ার্কলোড আইডেন্টিটি পুলে সংযুক্ত করার জন্য
roles/iam.workloadIdentityUser।
./setup_resources.sh
৩. কাজের চাপ তৈরি করুন
ওয়ার্কলোড পরিষেবা-অ্যাকাউন্ট তৈরি করুন
এখন আপনি প্রয়োজনীয় রোল এবং পারমিশন সহ ওয়ার্কলোডের জন্য একটি সার্ভিস অ্যাকাউন্ট তৈরি করবেন। এটি করার জন্য, নিম্নলিখিত স্ক্রিপ্টটি চালান, যা কোম্পানি A-এর জন্য একটি ওয়ার্কলোড সার্ভিস অ্যাকাউন্ট তৈরি করবে। যে ভিএম-টি ওয়ার্কলোডটি চালায়, সেটি এই সার্ভিস অ্যাকাউন্টটি ব্যবহার করবে।
ওয়ার্কলোড সার্ভিস-অ্যাকাউন্ট ( $WORKLOAD_SERVICEACCOUNT )-এর নিম্নলিখিত ভূমিকাগুলো থাকবে:
-
confidentialcomputing.workloadUserএকটি প্রত্যয়ন টোকেন পেতে হবে। - ক্লাউড লগিং-এ লগ লেখার জন্য
logging.logWriterব্যবহার করা হয়। -
$PRIMUS_INPUT_STORAGE_BUCKETক্লাউড স্টোরেজ বাকেট থেকে ডেটা পড়ার জন্যobjectViewer। -
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" ]
দ্রষ্টব্য: Dockerfile-এ থাকা LABEL "tee.launch_policy.allow_cmd_override"="true" হলো ইমেজ লেখকের দ্বারা সেট করা একটি লঞ্চ পলিসি। এটি অপারেটরকে ওয়ার্কলোড এক্সিকিউট করার সময় CMD ওভাররাইড করার অনুমতি দেয়। ডিফল্টরূপে, allow_cmd_override-এর মান false সেট করা থাকে। LABEL "tee.launch_policy.allow_env_override" Confidential Space-কে জানিয়ে দেয় যে ইমেজ ব্যবহারকারীরা কোন কোন এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করতে পারবেন।
এমন একটি ওয়ার্কলোড তৈরি করতে নিম্নলিখিত স্ক্রিপ্টটি চালান, যেখানে নিম্নলিখিত ধাপগুলি সম্পাদন করা হবে:
- ওয়ার্কলোড ডকার ইমেজ সংরক্ষণের জন্য আর্টিফ্যাক্ট রেজিস্ট্রি (
$PRIMUS_ARTIFACT_REPOSITORY) তৈরি করুন। - প্রয়োজনীয় রিসোর্সের নামগুলো দিয়ে ওয়ার্কলোড কোডটি আপডেট করুন। এই কোডল্যাবের জন্য ব্যবহৃত ওয়ার্কলোড কোডটি নিচে দেওয়া হলো।
- ওয়ার্কলোড কোডের ডকার ইমেজ তৈরির জন্য একটি ডকারফাইল তৈরি করুন। ডকারফাইলটি আপনি এখানে পাবেন।
- পূর্ববর্তী ধাপে তৈরি করা আর্টিফ্যাক্ট রেজিস্ট্রি (
$PRIMUS_ARTIFACT_REPOSITORY)-তে ডকার ইমেজটি বিল্ড এবং পাবলিশ করুন। -
$PRIMUS_ARTIFACT_REPOSITORYএর জন্য$WORKLOAD_SERVICEACCOUNTরিড পারমিশন দিন। এটি প্রয়োজনীয়, যাতে ওয়ার্কলোড কন্টেইনারটি আর্টিফ্যাক্ট রেজিস্ট্রি থেকে ওয়ার্কলোড ডকার ইমেজটি পুল করতে পারে।
./create_workload.sh
ব্লকচেইন নোড তৈরি করুন
গানাশ ইথেরিয়াম নোড
ওয়ার্কলোড অনুমোদন করার আগে, আমাদের একটি ইথেরিয়াম গ্যানাশ ইনস্ট্যান্স তৈরি করতে হবে। স্বাক্ষরিত ট্রানজ্যাকশনটি এই গ্যানাশ ইনস্ট্যান্সে জমা দেওয়া হবে। অনুগ্রহ করে এই ইনস্ট্যান্সটির আইপি অ্যাড্রেসটি লিখে রাখুন। নিচের কমান্ডটি চালানোর পর, এপিআই (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
৪. ওয়ার্কলোড অনুমোদন ও চালনা করুন
ওয়ার্কলোড অনুমোদন করুন
এই ধাপের অংশ হিসেবে, আমরা ওয়ার্কলোড আইডেন্টিটি পুল ( $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"
রান ওয়ার্কলোড
এই অংশে কনফিডেনশিয়াল ভিএম-এ ওয়ার্কলোড কীভাবে চালাতে হয় তা ব্যাখ্যা করা হয়েছে। এটি করার জন্য, আমরা মেটাডেটা ফ্ল্যাগ ব্যবহার করে প্রয়োজনীয় TEE আর্গুমেন্টগুলো পাস করব। এছাড়াও, আমরা "tee-env-*" ফ্ল্যাগ ব্যবহার করে ওয়ার্কলোড কন্টেইনারের জন্য এনভায়রনমেন্ট ভেরিয়েবল সেট করব। ইমেজটিতে নিম্নলিখিত ভেরিয়েবলগুলো রয়েছে:
-
NODE_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}"
ক্লাউড স্টোরেজের ফলাফল যাচাই করুন
আপনি ক্লাউড স্টোরেজে লেনদেনের রসিদ দেখতে পারবেন। কনফিডেনশিয়াল স্পেস বুট হতে এবং ফলাফল প্রদর্শিত হতে কয়েক মিনিট সময় লাগতে পারে। যখন ভিএমটি স্টপড অবস্থায় থাকবে, তখন আপনি বুঝবেন যে কন্টেইনারটির কাজ শেষ হয়েছে।
- ক্লাউড স্টোরেজ ব্রাউজার পৃষ্ঠায় যান।
-
$PRIMUS_RESULT_STORAGE_BUCKETক্লিক করুন। -
transaction_receiptফাইলটিতে ক্লিক করুন। - লেনদেনের প্রতিক্রিয়া ডাউনলোড ও দেখার জন্য ডাউনলোড-এ ক্লিক করুন।
বিকল্পভাবে, ফলাফল দেখার জন্য আপনি নিম্নলিখিত কমান্ডগুলো চালাতে পারেন।
gcloud config set project $PRIMUS_PROJECT_ID
gsutil cat gs://$PRIMUS_RESULT_STORAGE_BUCKET/transaction_receipt
দ্রষ্টব্য: যদি ফলাফল দেখা না যায়, তাহলে আপনি Compute Engine Cloud Console পৃষ্ঠার $WORKLOAD_VM-এ গিয়ে "Serial port 1 (console)"-এ ক্লিক করে লগগুলো দেখতে পারেন।
গানাশ ব্লকচেইন লেনদেন যাচাই করুন
আপনি ব্লকচেইন লগেও লেনদেনটি দেখতে পারেন।
- ক্লাউড কম্পিউট ইঞ্জিন পৃষ্ঠায় যান।
-
${ETHEREUM_NODE}VMটিতে ক্লিক করুন। - SSH-ইন-ব্রাউজার উইন্ডোটি খুলতে
SSHক্লিক করুন। - SSH উইন্ডোতে, চলমান Ganache কন্টেইনারটি দেখতে
sudo docker psলিখুন। -
trufflesuite/ganache:v7.7.3এর জন্য কন্টেইনার আইডি খুঁজুন। -
trufflesuite/ganache:v7.7.3এর আইডি দিয়ে CONTAINER_ID প্রতিস্থাপন করেsudo docker logs CONTAINER_IDলিখুন। - Ganache-এর লগগুলো দেখুন এবং নিশ্চিত করুন যে লগগুলোতে একটি ট্রানজ্যাকশন তালিকাভুক্ত আছে।
৫. পরিষ্কার করুন
এই কোডল্যাবের অংশ হিসেবে আমরা যে রিসোর্সগুলো তৈরি করেছি, সেগুলো পরিষ্কার করার জন্য এই স্ক্রিপ্টটি ব্যবহার করা যেতে পারে। এই পরিষ্কার-পরিচ্ছন্নতার অংশ হিসেবে, নিম্নলিখিত রিসোর্সগুলো মুছে ফেলা হবে:
- এনক্রিপ্টেড কী শেয়ার সংরক্ষণের জন্য ব্যবহৃত ইনপুট স্টোরেজ বাকেট (
$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
আপনার অনুসন্ধান শেষ হলে, অনুগ্রহ করে আপনার প্রজেক্টটি মুছে ফেলার কথা বিবেচনা করুন।
- ক্লাউড প্ল্যাটফর্ম কনসোলে যান
- যে প্রজেক্টটি বন্ধ করতে চান, সেটি নির্বাচন করুন, তারপর উপরে থাকা 'ডিলিট' বোতামে ক্লিক করুন। এটি প্রজেক্টটিকে মুছে ফেলার জন্য নির্ধারিত করে দেবে।
এরপর কী?
এই ধরনের কয়েকটি কোডল্যাব দেখে নিন...
- গোপনীয় স্থানে ব্যবহৃত সুরক্ষিত শেয়ার করা ডেটা
- স্বাক্ষরিত কন্টেইনার ইমেজ কোডল্যাব
- গোপনীয় স্থান ব্যবহার করে গোপনীয় তথ্য বিশ্লেষণ করুন