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

তুমি কি শিখবে
এই ল্যাবটি কনফিডেনশিয়াল স্পেস ব্যবহার করে MPC-সম্মত ব্লকচেইন স্বাক্ষর সম্পাদনের জন্য একটি রেফারেন্স বাস্তবায়ন প্রদান করে। ধারণাগুলি ব্যাখ্যা করার জন্য, আমরা এমন একটি দৃশ্যের মধ্য দিয়ে যাব যেখানে কোম্পানি প্রাইমাস কোম্পানি সেকান্ডাসে ডিজিটাল সম্পদ স্থানান্তর করতে চায়। এই পরিস্থিতিতে, কোম্পানি প্রাইমাস একটি MPC-সম্মত মডেল ব্যবহার করে, যার অর্থ হল পৃথক ব্যক্তিগত কী ব্যবহার করার পরিবর্তে, তারা বিতরণ করা কী শেয়ার ব্যবহার করে। এই কী শেয়ারগুলি একাধিক পক্ষের কাছে থাকে, এই ক্ষেত্রে অ্যালিস এবং বব। এই পদ্ধতিটি কোম্পানি প্রাইমাসকে সরলীকৃত ব্যবহারকারীর অভিজ্ঞতা, পরিচালনা দক্ষতা এবং তাদের ব্যক্তিগত কীগুলির উপর নিয়ন্ত্রণ সহ বেশ কয়েকটি সুবিধা প্রদান করে।
এই প্রক্রিয়ার মৌলিক দিকগুলি ব্যাখ্যা করার জন্য, আমরা প্রযুক্তিগত সেটআপটি বিস্তারিতভাবে বর্ণনা করব এবং অনুমোদন এবং স্বাক্ষর প্রক্রিয়াটি আপনাকে দেখাব যা কোম্পানি প্রাইমাস থেকে কোম্পানি সেকান্ডাসে ডিজিটাল সম্পদ স্থানান্তর শুরু করে। অনুগ্রহ করে মনে রাখবেন যে বব এবং অ্যালিস, যারা কোম্পানি প্রাইমাসের উভয় কর্মচারী, তাদের লেনদেন অনুমোদন করতে হবে।
যদিও এই রেফারেন্স বাস্তবায়ন স্বাক্ষর কার্যক্রম প্রদর্শন করে, এটি MPC কী ব্যবস্থাপনার সকল দিককে অন্তর্ভুক্ত করে না। উদাহরণস্বরূপ, আমরা কী জেনারেশন নিয়ে আলোচনা করি না। এছাড়াও, বিকল্প এবং পরিপূরক পদ্ধতি রয়েছে, যেমন সহ-স্বাক্ষর তৈরি করার জন্য নন-গুগল ক্লাউড পরিষেবা ব্যবহার করা বা সহ-স্বাক্ষরকারীদের তাদের নিজস্ব পরিবেশে ব্লকচেইন স্বাক্ষর তৈরি করা, যা একটি আরও বিকেন্দ্রীভূত স্থাপত্য। আমরা আশা করি যে এই ল্যাবটি Google ক্লাউডে MPC-এর বিভিন্ন পদ্ধতিকে অনুপ্রাণিত করবে।
আপনি একটি সহজ ওয়ার্কলোড নিয়ে কাজ করবেন যা সহ-স্বাক্ষরকারী কী উপকরণ ব্যবহার করে গোপনীয় স্থানে একটি ইথেরিয়াম লেনদেন স্বাক্ষর করে। ইথেরিয়াম লেনদেন স্বাক্ষর এমন একটি প্রক্রিয়া যার মাধ্যমে একজন ব্যবহারকারী ইথেরিয়াম ব্লকচেইনে একটি লেনদেন অনুমোদন করতে পারেন। ইথেরিয়াম লেনদেন পাঠাতে, আপনাকে আপনার ব্যক্তিগত কী দিয়ে স্বাক্ষর করতে হবে। এটি প্রমাণ করে যে আপনি অ্যাকাউন্টের মালিক এবং লেনদেন অনুমোদন করেছেন। স্বাক্ষর প্রক্রিয়াটি নিম্নরূপ:
- প্রেরক একটি লেনদেনের বস্তু তৈরি করে যা প্রাপকের ঠিকানা, পাঠানোর জন্য ETH এর পরিমাণ এবং অন্যান্য প্রাসঙ্গিক তথ্য নির্দিষ্ট করে।
- লেনদেনের তথ্য হ্যাশ করার জন্য প্রেরকের ব্যক্তিগত কী ব্যবহার করা হয়।
- এরপর হ্যাশটি প্রাইভেট কী দিয়ে স্বাক্ষরিত হয়।
- স্বাক্ষরটি লেনদেনের বস্তুর সাথে সংযুক্ত থাকে।
- লেনদেনটি ইথেরিয়াম নেটওয়ার্কে সম্প্রচারিত হয়।
যখন নেটওয়ার্কের কোন নোড কোন লেনদেন গ্রহণ করে, তখন এটি স্বাক্ষরটি যাচাই করে নিশ্চিত করে যে এটি অ্যাকাউন্টের মালিক দ্বারা স্বাক্ষরিত। যদি স্বাক্ষরটি বৈধ হয়, তাহলে নোডটি লেনদেনটি ব্লকচেইনে যুক্ত করবে।
শুরু করার জন্য, আপনাকে প্রয়োজনীয় ক্লাউড রিসোর্সগুলি কনফিগার করতে হবে। তারপর, আপনি কনফিডেনশিয়াল স্পেসে ওয়ার্কলোড চালাবেন। এই কোডল্যাব আপনাকে নিম্নলিখিত উচ্চ-স্তরের পদক্ষেপগুলির মধ্য দিয়ে পরিচালিত করবে:
- গোপন স্থান চালানোর জন্য প্রয়োজনীয় ক্লাউড রিসোর্সগুলি কীভাবে কনফিগার করবেন
- নিম্নলিখিত বৈশিষ্ট্যের উপর ভিত্তি করে সুরক্ষিত সম্পদগুলিতে অ্যাক্সেস কীভাবে অনুমোদন করবেন:
- কী : ওয়ার্কলোড কন্টেইনার
- কোথায় : গোপনীয় স্থান পরিবেশ (গোপনীয় VM-তে গোপনীয় স্থানের ছবি)
- কে : যে অ্যাকাউন্টটি ওয়ার্কলোড চালাচ্ছে
- কনফিডেনশিয়াল স্পেস ভিএম ইমেজ চালানোর সময় কনফিডেনশিয়াল ভিএম-এ কীভাবে ওয়ার্কলোড চালানো যায়
প্রয়োজনীয় API গুলি
এই নির্দেশিকাটি সম্পূর্ণ করার জন্য আপনাকে নির্দিষ্ট প্রকল্পগুলিতে নিম্নলিখিত API গুলি সক্ষম করতে হবে।
এপিআই নাম | API শিরোনাম |
ক্লাউডকেএমএস.গুগলএপিস.কম | ক্লাউড কেএমএস |
কম্পিউট.গুগল্যাপিস.কম | কম্পিউট ইঞ্জিন |
confidentialcomputing.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 সম্পর্কে | প্রাইমাস ব্যাংকের জন্য $PRIMUS_KEY এনক্রিপশন কী তৈরি করতে ব্যবহৃত KMS কীরিং। |
$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_WORKLOAD_IDENTITY_POOL) সাথে সংযুক্ত একটি পরিষেবা অ্যাকাউন্ট ($PRIMUS_SERVICEACCOUNT) যার IAM অ্যাক্সেস নিম্নলিখিত: - KMS কী ব্যবহার করে ডেটা ডিক্রিপ্ট করার জন্য
roles/cloudkms.cryptoKeyDecrypterব্যবহার করুন। - ক্লাউড স্টোরেজ বাকেট থেকে ডেটা পড়ার জন্য
objectViewer। - এই পরিষেবা-অ্যাকাউন্টটিকে ওয়ার্কলোড আইডেন্টিটি পুলের সাথে সংযুক্ত করার জন্য
roles/iam.workloadIdentityUser।
./setup_resources.sh
৩. কাজের চাপ তৈরি করুন
ওয়ার্কলোড সার্ভিস-অ্যাকাউন্ট তৈরি করুন
এখন আপনি প্রয়োজনীয় ভূমিকা এবং অনুমতি সহ ওয়ার্কলোডের জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করবেন। এটি করার জন্য, নিম্নলিখিত স্ক্রিপ্টটি চালান, যা কোম্পানি A এর জন্য একটি ওয়ার্কলোড পরিষেবা অ্যাকাউন্ট তৈরি করবে। এই পরিষেবা অ্যাকাউন্টটি ওয়ার্কলোড পরিচালনাকারী VM দ্বারা ব্যবহৃত হবে।
ওয়ার্কলোড সার্ভিস-অ্যাকাউন্ট ( $WORKLOAD_SERVICEACCOUNT ) এর নিম্নলিখিত ভূমিকা থাকবে:
-
confidentialcomputing.workloadUserএকটি প্রত্যয়ন টোকেন পাবেন - ক্লাউড লগিং-এ লগ লেখার জন্য
logging.logWriter। -
$PRIMUS_INPUT_STORAGE_BUCKETক্লাউড স্টোরেজ বাকেট থেকে ডেটা পড়ার জন্যobjectViewer। -
$PRIMUS_RESULT_STORAGE_BUCKETক্লাউড স্টোরেজ বাকেটে ওয়ার্কলোড ফলাফল লেখার জন্যobjectUser।
./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" হল ছবির লেখক দ্বারা সেট করা একটি লঞ্চ নীতি। এটি অপারেটরকে ওয়ার্কলোড কার্যকর করার সময় CMD ওভাররাইড করতে দেয়। ডিফল্টরূপে, allow_cmd_override মিথ্যাতে সেট করা থাকে। LABEL "tee.launch_policy.allow_env_override" Confidential Space কে বলে যে কোন পরিবেশ ভেরিয়েবল ইমেজ ব্যবহারকারীরা ব্যবহার করতে পারবেন।
নিম্নলিখিত স্ক্রিপ্টটি চালান যাতে একটি ওয়ার্কলোড তৈরি করা হয় যেখানে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করা হচ্ছে:
- ওয়ার্কলোড ডকার ইমেজ সংরক্ষণ করতে আর্টিফ্যাক্ট রেজিস্ট্রি (
$PRIMUS_ARTIFACT_REPOSITORY) তৈরি করুন। - প্রয়োজনীয় রিসোর্সের নাম সহ ওয়ার্কলোড কোড আপডেট করুন। এই কোডল্যাবের জন্য ব্যবহৃত ওয়ার্কলোড কোডটি এখানে দেওয়া হল।
- ওয়ার্কলোড কোডের একটি ডকার ইমেজ তৈরি করার জন্য ডকারফাইল তৈরি করুন। আপনি এখানে ডকারফাইলটি খুঁজে পেতে পারেন।
- পূর্ববর্তী ধাপে তৈরি আর্টিফ্যাক্ট রেজিস্ট্রি (
$PRIMUS_ARTIFACT_REPOSITORY) তে ডকার ইমেজটি তৈরি করুন এবং প্রকাশ করুন। -
$PRIMUS_ARTIFACT_REPOSITORYএর জন্য$WORKLOAD_SERVICEACCOUNTপড়ার অনুমতি দিন। আর্টিফ্যাক্ট রেজিস্ট্রি থেকে ওয়ার্কলোড ডকার ইমেজ টেনে আনার জন্য ওয়ার্কলোড কন্টেইনারটি যাতে ব্যবহার করা যায় তার জন্য এটি প্রয়োজনীয়।
./create_workload.sh
ব্লকচেইন নোড তৈরি করুন
গানাচে ইথেরিয়াম নোড
ওয়ার্কলোড অনুমোদন করার আগে, আমাদের Ethereum Ganache ইনস্ট্যান্স তৈরি করতে হবে। স্বাক্ষরিত লেনদেনটি এই Ganache ইনস্ট্যান্সে জমা দেওয়া হবে। অনুগ্রহ করে এই ইনস্ট্যান্সের IP ঠিকানাটি নোট করুন। নীচের কমান্ডটি চালানোর পরে, 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"
কাজের চাপ চালান
এই বিভাগে Confidential VM-এ ওয়ার্কলোড কীভাবে চালানো যায় তা ব্যাখ্যা করা হয়েছে। এটি করার জন্য, আমরা মেটাডেটা ফ্ল্যাগ ব্যবহার করে প্রয়োজনীয় TEE আর্গুমেন্টগুলি পাস করব। এছাড়াও, আমরা "tee-env-*" ফ্ল্যাগ ব্যবহার করে ওয়ার্কলোড কন্টেইনারের জন্য পরিবেশগত ভেরিয়েবল সেট করব। ছবিতে নিম্নলিখিত ভেরিয়েবলগুলি রয়েছে:
-
NODE_URL: ইথেরিয়াম নোডের 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 বন্ধ অবস্থায় থাকলে আপনি জানতে পারবেন কন্টেইনারটি সম্পন্ন হয়েছে।
- ক্লাউড স্টোরেজ ব্রাউজার পৃষ্ঠায় যান।
-
$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এর জন্য ID দিয়ে 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
যদি আপনার অন্বেষণ শেষ হয়ে যায়, তাহলে অনুগ্রহ করে আপনার প্রকল্পটি মুছে ফেলার কথা বিবেচনা করুন।
- ক্লাউড প্ল্যাটফর্ম কনসোলে যান
- আপনি যে প্রকল্পটি বন্ধ করতে চান তা নির্বাচন করুন, তারপর উপরে "মুছুন" এ ক্লিক করুন। এটি প্রকল্পটি মুছে ফেলার জন্য সময়সূচী করে।
এরপর কী?
এই ধরণের কিছু কোডল্যাব দেখুন...
- গোপন স্থানের সাথে ব্যবহার করা সুরক্ষিত শেয়ার করা ডেটা
- স্বাক্ষরিত কন্টেইনার ছবি কোডল্যাব
- গোপনীয় স্থান ব্যবহার করে গোপনীয় তথ্য বিশ্লেষণ করুন