1. Tổng quan
Trước khi bắt đầu, mặc dù không hoàn toàn cần thiết, nhưng kiến thức thực tế về các tính năng và khái niệm sau đây sẽ hữu ích trong lớp học lập trình này.
- Cloud Storage, cụ thể là các bộ chứa
- Compute Engine, cụ thể là Máy ảo bảo mật
- Tài khoản dịch vụ
- Vùng chứa và kho lưu trữ từ xa
- Mạng liên kết danh tính cho khối lượng công việc và điều kiện thuộc tính
Kiến thức bạn sẽ học được
Lớp học này cung cấp một cách triển khai tham khảo để thực hiện việc ký chuỗi khối tuân thủ MPC bằng cách sử dụng Không gian bảo mật. Để minh hoạ các khái niệm này, chúng ta sẽ xem xét một tình huống trong đó Công ty Primus muốn chuyển tài sản kỹ thuật số cho Công ty Secundus. Trong trường hợp này, Công ty Primus sử dụng mô hình tuân thủ MPC, nghĩa là thay vì sử dụng khoá riêng tư riêng lẻ, họ sử dụng phần chia khoá được phân phối. Các phần chia khoá này do nhiều bên nắm giữ, trong trường hợp này là Alice và Bob. Phương pháp này mang lại cho Company Primus một số lợi ích, bao gồm trải nghiệm người dùng đơn giản, hiệu quả hoạt động và quyền kiểm soát các khoá riêng tư của họ.
Để giải thích các khía cạnh cơ bản của quy trình này, chúng tôi sẽ trình bày chi tiết về việc thiết lập kỹ thuật và hướng dẫn bạn thực hiện quy trình phê duyệt và ký để bắt đầu quá trình chuyển tài sản kỹ thuật số từ Công ty Primus sang Công ty Secundus. Xin lưu ý rằng Bob và Alice, cả hai đều là nhân viên của Công ty Primus, phải phê duyệt giao dịch.
Mặc dù cách triển khai tham chiếu này minh hoạ các thao tác ký, nhưng không bao gồm tất cả khía cạnh của việc quản lý khoá MPC. Ví dụ: chúng tôi không thảo luận về việc tạo khoá. Ngoài ra, còn có các phương pháp thay thế và bổ sung, chẳng hạn như sử dụng các dịch vụ không phải của Google Cloud để tạo chữ ký đồng sở hữu hoặc yêu cầu người ký đồng sở hữu tạo chữ ký blockchain trong môi trường của riêng họ. Đây là một cấu trúc phân quyền hơn. Chúng tôi hy vọng lớp học này sẽ truyền cảm hứng cho nhiều phương pháp khác nhau về MPC trên Google Cloud.
Bạn sẽ làm việc với một khối lượng công việc đơn giản để ký một giao dịch Ethereum trong Không gian bảo mật bằng cách sử dụng tài liệu khoá của người ký cùng. Ký giao dịch Ethereum là một quy trình mà người dùng có thể uỷ quyền cho một giao dịch trên chuỗi khối Ethereum. Để gửi một giao dịch Ethereum, bạn cần ký giao dịch đó bằng khoá riêng tư. Điều này chứng minh rằng bạn là chủ sở hữu tài khoản và uỷ quyền cho giao dịch. Quy trình ký như sau:
- Người gửi tạo một đối tượng giao dịch chỉ định địa chỉ người nhận, số ETH cần gửi và mọi dữ liệu liên quan khác.
- Khoá riêng tư của người gửi được dùng để băm dữ liệu giao dịch.
- Sau đó, hàm băm được ký bằng khoá riêng tư.
- Chữ ký được đính kèm vào đối tượng giao dịch.
- Giao dịch được truyền đến mạng Ethereum.
Khi nhận được một giao dịch, nút trên mạng sẽ xác minh chữ ký để đảm bảo rằng giao dịch đó do chủ sở hữu tài khoản ký. Nếu chữ ký hợp lệ, nút sẽ thêm giao dịch vào chuỗi khối.
Để bắt đầu, bạn sẽ định cấu hình các tài nguyên cần thiết trên Google Cloud. Sau đó, bạn sẽ chạy khối lượng công việc trong Không gian bảo mật. Lớp học lập trình này sẽ hướng dẫn bạn thực hiện các bước tổng quan sau:
- Cách định cấu hình các tài nguyên cần thiết trên đám mây để chạy Không gian bảo mật
- Cách uỷ quyền truy cập vào các tài nguyên được bảo vệ dựa trên các thuộc tính của:
- Nội dung: vùng chứa khối lượng công việc
- Vị trí: môi trường Không gian bảo mật (hình ảnh Không gian bảo mật trên máy ảo bảo mật)
- Ai: tài khoản đang chạy khối lượng công việc
- Cách chạy khối lượng công việc trong một máy ảo bảo mật chạy hình ảnh máy ảo không gian bảo mật
API bắt buộc
Bạn phải bật các API sau trong các dự án được chỉ định để có thể hoàn thành hướng dẫn này.
Tên API | Tiêu đề API |
cloudkms.googleapis.com | Cloud KMS |
compute.googleapis.com | Compute Engine |
confidentialcomputing.googleapis.com | Điện toán bảo mật |
iamcredentials.googleapis.com | IAM |
artifactregistry.googleapis.com | Artifact Registry |
2. Thiết lập tài nguyên trên đám mây
Trước khi bắt đầu
- Sao chép kho lưu trữ này bằng lệnh dưới đây để lấy các tập lệnh bắt buộc được dùng trong lớp học lập trình này.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- Thay đổi thư mục cho lớp học lập trình này.
cd confidential-space/codelabs/digital_asset_transaction_codelab/scripts
- Đảm bảo bạn đã thiết lập các biến môi trường dự án bắt buộc như minh hoạ dưới đây. Để biết thêm thông tin về cách thiết lập dự án GCP, vui lòng tham khảo lớp học lập trình này. Bạn có thể tham khảo đây để biết thông tin chi tiết về cách truy xuất mã dự án và sự khác biệt giữa mã dự án với tên dự án và số dự án. .
export PRIMUS_PROJECT_ID=<GCP project id>
- Bật tính năng Thanh toán cho các dự án của bạn.
- Bật API điện toán bảo mật và các API sau cho cả hai dự án.
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
- Để đặt biến cho tên tài nguyên, bạn có thể sử dụng lệnh sau. Xin lưu ý rằng việc này sẽ ghi đè tên tài nguyên dành riêng cho dự án GCP của công ty A, ví dụ:
export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket'
- Bạn có thể đặt các biến sau cho dự án GCP trong Công ty A:
$PRIMUS_INPUT_STORAGE_BUCKET | Bộ chứa lưu trữ các khoá đã mã hoá. |
$PRIMUS_RESULT_STORAGE_BUCKET | Bộ chứa lưu trữ kết quả giao dịch MPC. |
$PRIMUS_KEY | Khoá KMS dùng để mã hoá dữ liệu được lưu trữ trong $PRIMUS_INPUT_STORAGE_BUCKET cho Ngân hàng Primus. |
$PRIMUS_KEYRING | Kho khoá KMS sẽ được dùng để tạo khoá mã hoá $PRIMUS_KEY cho Ngân hàng Primus. |
$PRIMUS_WIP_PROVIDER | Nhà cung cấp Workload Identity Pool (WIP) bao gồm điều kiện thuộc tính để sử dụng cho mã thông báo do dịch vụ tải trọng MPC ký. |
$PRIMUS_SERVICEACCOUNT | Tài khoản dịch vụ mà $PRIMUS_WORKLOAD_IDENTITY_POOL sử dụng để truy cập vào các tài nguyên được bảo vệ. Tài khoản dịch vụ này sẽ có quyền xem các khoá đã mã hoá được lưu trữ trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET. |
$PRIMUS_ARTIFACT_REPOSITORY | Kho lưu trữ cấu phần phần mềm để lưu trữ hình ảnh vùng chứa khối lượng công việc. |
$WORKLOAD_SERVICEACCOUNT | Tài khoản dịch vụ có quyền truy cập vào Máy ảo bảo mật chạy khối lượng công việc. |
$WORKLOAD_CONTAINER | Vùng chứa Docker chạy khối lượng công việc. |
$WORKLOAD_IMAGE_NAME | Tên của hình ảnh vùng chứa khối lượng công việc. |
$WORKLOAD_IMAGE_TAG | Thẻ của hình ảnh vùng chứa khối lượng công việc. |
- Chạy tập lệnh sau để đặt tên biến còn lại thành giá trị dựa trên mã dự án của bạn cho tên tài nguyên.
source config_env.sh
Thiết lập tài nguyên trên đám mây
Trong bước này, bạn sẽ thiết lập các tài nguyên trên đám mây cần thiết cho việc tính toán nhiều bên. Trong lớp học lập trình này, bạn sẽ sử dụng khoá riêng tư sau: 0000000000000000000000000000000000000000000000000000000000000001
Trong môi trường sản xuất, bạn sẽ tạo khoá riêng tư của riêng mình. Tuy nhiên, cho mục đích của lớp học này, chúng ta sẽ chia khoá riêng tư này thành hai phần và mã hoá từng phần. Trong trường hợp phát hành chính thức, bạn không bao giờ được lưu trữ khoá trong tệp văn bản thuần tuý. Thay vào đó, bạn có thể tạo khoá riêng tư bên ngoài Google Cloud (hoặc bỏ qua hoàn toàn và thay thế bằng việc tạo mảnh khoá MPC tuỳ chỉnh), sau đó mã hoá để không ai có quyền truy cập vào khoá riêng tư hoặc phần khoá. Trong lớp học lập trình này, chúng ta sẽ sử dụng Gcloud CLI.
Chạy tập lệnh sau để thiết lập các tài nguyên đám mây bắt buộc. Trong các bước này, các tài nguyên được đề cập bên dưới sẽ được tạo:
- Một bộ chứa Cloud Storage (
$PRIMUS_INPUT_STORAGE_BUCKET
) để lưu trữ các phần chia sẻ khoá riêng tư đã mã hoá. - Một bộ chứa Cloud Storage (
$PRIMUS_RESULT_STORAGE_BUCKET
) để lưu trữ kết quả của giao dịch tài sản kỹ thuật số. - Khoá mã hoá (
$PRIMUS_KEY
) và khoá truy cập ($PRIMUS_KEYRING
) trong KMS để mã hoá các phần chia sẻ khoá riêng tư. - Một nhóm danh tính tải (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) để xác thực các tuyên bố dựa trên các điều kiện thuộc tính được định cấu hình trong nhà cung cấp của nhóm danh tính đó. - Một tài khoản dịch vụ (
$PRIMUS_SERVICEACCOUNT
) được đính kèm vào nhóm danh tính theo tải trọng ($PRIMUS_WORKLOAD_IDENTITY_POOL
) được đề cập ở trên với quyền truy cập IAM sau đây: roles/cloudkms.cryptoKeyDecrypter
để giải mã dữ liệu bằng khoá KMS.objectViewer
để đọc dữ liệu từ bộ chứa trên Cloud Storage.roles/iam.workloadIdentityUser
để kết nối tài khoản dịch vụ này với nhóm danh tính tải.
./setup_resources.sh
3. Tạo khối lượng công việc
Tạo tài khoản dịch vụ cho khối lượng công việc
Bây giờ, bạn sẽ tạo một tài khoản dịch vụ cho khối lượng công việc với các vai trò và quyền bắt buộc. Để thực hiện việc này, hãy chạy tập lệnh sau đây. Tập lệnh này sẽ tạo một tài khoản dịch vụ tải công việc cho Công ty A. Tài khoản dịch vụ này sẽ được máy ảo chạy khối lượng công việc sử dụng.
Tài khoản dịch vụ khối lượng công việc ($WORKLOAD_SERVICEACCOUNT
) sẽ có các vai trò sau:
confidentialcomputing.workloadUser
để nhận mã thông báo chứng thựclogging.logWriter
để ghi nhật ký vào Cloud Logging.objectViewer
để đọc dữ liệu từ bộ chứa Cloud Storage$PRIMUS_INPUT_STORAGE_BUCKET
.objectUser
để ghi kết quả tải công việc vào bộ chứa Cloud Storage$PRIMUS_RESULT_STORAGE_BUCKET
.
./create_workload_service_account.sh
Tạo mức tải
Bước này bao gồm việc tạo hình ảnh Docker cho khối lượng công việc. Công việc trong lớp học lập trình này là một ứng dụng MPC Node.js đơn giản, ký các giao dịch kỹ thuật số để chuyển tài sản bằng cách sử dụng phần chia khoá riêng tư đã mã hoá. Tại đây là mã dự án khối lượng công việc. Dự án khối lượng công việc bao gồm các tệp sau.
package.json: Tệp này chứa danh sách các gói cần dùng cho ứng dụng MPC về khối lượng công việc. Trong trường hợp này, chúng ta sẽ sử dụng các thư viện @google-cloud/kms, @google-cloud/storage, ethers và fast-crc32c. Dưới đây là tệp package.json mà chúng ta sẽ sử dụng cho lớp học lập trình này.
index.js: Đây là điểm truy cập của ứng dụng tải trọng và chỉ định những lệnh cần chạy khi vùng chứa tải trọng khởi động. Chúng tôi cũng đã đưa vào một giao dịch chưa ký mẫu thường do một ứng dụng không đáng tin cậy cung cấp và yêu cầu người dùng ký. Tệp index.js này cũng nhập các hàm từ mpc.js mà chúng ta sẽ tạo tiếp theo. Dưới đây là nội dung của tệp index.js và bạn cũng có thể tìm thấy tệp này tại đây.
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: Đây là nơi diễn ra quá trình ký giao dịch. Tệp này nhập các hàm từ kms-decrypt và credential-config mà chúng ta sẽ đề cập đến trong phần tiếp theo. Dưới đây là nội dung của tệp mpc.js và bạn cũng có thể tìm thấy tệp này tại đây.
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: Tệp này chứa mã để giải mã bằng các khoá được quản lý trong KMS. Dưới đây là nội dung của tệp kms-decrypt.js và bạn cũng có thể tìm thấy tệp này tại đây.
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: Tệp này lưu trữ đường dẫn và thông tin chi tiết về nhóm danh tính tải cho hoạt động mạo danh tài khoản dịch vụ. Tại đây là tệp credential-config.js mà chúng ta sẽ sử dụng cho lớp học lập trình này.
Dockerfile: Cuối cùng, chúng ta sẽ tạo Dockerfile để tạo hình ảnh docker cho khối lượng công việc. xác định Dockerfile như đã chỉ định tại đây.
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" ]
Lưu ý: LABEL "tee.launch_policy.allow_cmd_override"="true" trong Dockerfile là chính sách khởi chạy do tác giả hình ảnh đặt. Cho phép toán tử ghi đè CMD khi thực thi khối lượng công việc. Theo mặc định, allow_cmd_override được đặt thành false. LABEL "tee.launch_policy.allow_env_override" cho Confidential Space biết người dùng hình ảnh có thể sử dụng biến môi trường nào .
Chạy tập lệnh sau để tạo một khối lượng công việc trong đó các bước sau đang được thực hiện:
- Tạo Artifact Registry(
$PRIMUS_ARTIFACT_REPOSITORY
) để lưu trữ hình ảnh docker của tải trọng. - Cập nhật mã khối lượng công việc bằng tên tài nguyên bắt buộc. Dưới đây là mã khối lượng công việc dùng cho lớp học lập trình này.
- Tạo Dockerfile để tạo hình ảnh Docker của mã khối lượng công việc. Bạn có thể tìm thấy Dockerfile tại đây.
- Tạo và phát hành hình ảnh Docker lên Cấu phần phần mềm (
$PRIMUS_ARTIFACT_REPOSITORY
) được tạo ở bước trước. - Cấp quyền đọc
$WORKLOAD_SERVICEACCOUNT
cho$PRIMUS_ARTIFACT_REPOSITORY
. Điều này là cần thiết để vùng chứa khối lượng công việc lấy hình ảnh docker khối lượng công việc từ Cấu phần phần mềm.
./create_workload.sh
Tạo nút Blockchain
Nút Ethereum Ganache
Trước khi uỷ quyền cho khối lượng công việc, chúng ta cần tạo thực thể Ethereum Ganache. Giao dịch đã ký sẽ được gửi đến thực thể Ganache này. Vui lòng ghi lại địa chỉ IP của thực thể này. Sau khi chạy lệnh bên dưới, bạn có thể cần nhập y
để bật API.
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. Uỷ quyền và chạy khối lượng công việc
Uỷ quyền cho Workload
Trong bước này, chúng ta sẽ thiết lập nhà cung cấp nhóm danh tính tải trong nhóm danh tính tải ($PRIMUS_WORKLOAD_IDENTITY_POOL
). Có các điều kiện thuộc tính được định cấu hình cho danh tính tải như minh hoạ bên dưới. Một trong các điều kiện là xác thực hình ảnh tải trọng đang được lấy từ kho lưu trữ cấu phần phần mềm dự kiến.
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"
Chạy khối lượng công việc
Phần này giải thích cách chạy khối lượng công việc trên Máy ảo bảo mật. Để làm việc này, chúng ta sẽ truyền các đối số TEE bắt buộc bằng cờ siêu dữ liệu. Ngoài ra, chúng ta sẽ đặt biến môi trường cho vùng chứa khối lượng công việc bằng cách sử dụng cờ "tee-env-*". Hình ảnh có các biến sau:
NODE_URL
: URL của nút Ethereum sẽ xử lý giao dịch đã ký.RESULTS_BUCKET
: Bộ chứa lưu trữ kết quả giao dịch mpc.KEY_BUCKET
: Bộ chứa lưu trữ các khoá đã mã hoá mpc.PRIMUS_PROJECT_NUMBER
: Số dự án dùng cho tệp cấu hình thông tin xác thực.PRIMUS_PROJECT_ID
: Mã dự án dùng cho tệp cấu hình thông tin xác thực. Kết quả thực thi khối lượng công việc sẽ được xuất bản lên$PRIMUS_RESULT_STORAGE_BUCKET
.PRIMUS_WORKLOAD_IDENTITY_POOL
: Nhóm danh tính tải dùng để xác thực các thông báo xác nhận.PRIMUS_WIP_POROVIDER
: Nhà cung cấp nhóm danh tính tải bao gồm các điều kiện thuộc tính để sử dụng cho việc xác thực mã thông báo do tải trọng trình bày.WORKLOAD_SERVICEACCOUNT
: Tài khoản dịch vụ của khối lượng công việc.
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}"
Kiểm tra kết quả trên Cloud Storage
Bạn có thể xem biên nhận giao dịch trong Cloud Storage. Có thể mất vài phút để khởi động Không gian bảo mật và để kết quả xuất hiện. Bạn sẽ biết vùng chứa đã hoàn tất khi máy ảo ở trạng thái dừng.
- Chuyển đến trang Trình duyệt Cloud Storage.
- Nhấp vào
$PRIMUS_RESULT_STORAGE_BUCKET
. - Nhấp vào tệp
transaction_receipt
. - Nhấp vào Tải xuống để tải và xem phản hồi giao dịch.
Ngoài ra, bạn có thể chạy các lệnh sau để xem kết quả.
gcloud config set project $PRIMUS_PROJECT_ID
gsutil cat gs://$PRIMUS_RESULT_STORAGE_BUCKET/transaction_receipt
Lưu ý: Nếu không thấy kết quả, bạn có thể chuyển đến $WORKLOAD_VM trên trang Compute Engine Cloud Console rồi nhấp vào "Cổng nối tiếp 1 (bảng điều khiển)" để xem nhật ký.
Kiểm tra giao dịch Blockchain Ganache
Bạn cũng có thể xem giao dịch này trong nhật ký blockchain.
- Chuyển đến trang Cloud Compute Engine.
- Nhấp vào
${ETHEREUM_NODE}
VM
. - Nhấp vào
SSH
để mở cửa sổ SSH-in-browser (SSH trong trình duyệt). - Trong cửa sổ SSH, hãy nhập
sudo docker ps
để xem vùng chứa Ganache đang chạy. - Tìm mã vùng chứa cho
trufflesuite/ganache:v7.7.3
- Nhập
sudo docker logs CONTAINER_ID
, thay thế CONTAINER_ID bằng mã nhận dạng chotrufflesuite/ganache:v7.7.3
. - Xem nhật ký của Ganache và xác nhận rằng có một giao dịch được liệt kê trong nhật ký.
5. Dọn dẹp
Dưới đây là tập lệnh có thể dùng để dọn dẹp các tài nguyên mà chúng ta đã tạo trong lớp học lập trình này. Trong quá trình dọn dẹp này, các tài nguyên sau sẽ bị xoá:
- Bộ chứa bộ nhớ đầu vào dùng để lưu trữ các phần chia sẻ khoá đã mã hoá (
$PRIMUS_INPUT_STORAGE_BUCKET)
. - Khoá mã hoá (
$PRIMUS_KEY
). - Tài khoản dịch vụ dùng để truy cập vào các tài nguyên được bảo vệ (
$PRIMUS_SERVICEACCOUNT
). - Nhóm Workload Identity (
$PRIMUS_WORKLOAD_IDENTITY_POOL
). - Tài khoản dịch vụ Workload (
$WORKLOAD_SERVICEACCOUNT
). - Thực thể điện toán tải trọng (
$WORKLOAD_VM
và$ETHEREUM_NODE
). - Bộ chứa bộ nhớ kết quả dùng để lưu trữ kết quả giao dịch.(
$PRIMUS_RESULT_STORAGE_BUCKET
). - Cấu phần phần mềm dùng để lưu trữ hình ảnh khối lượng công việc (
$PRIMUS_ARTIFACT_REPOSITORY
).
./cleanup.sh
Nếu bạn đã khám phá xong, vui lòng cân nhắc xoá dự án của mình.
- Truy cập vào Bảng điều khiển Cloud Platform
- Chọn dự án mà bạn muốn đóng, rồi nhấp vào "Xoá" ở trên cùng. Thao tác này sẽ lên lịch xoá dự án.
Tiếp theo là gì?
Hãy xem một số lớp học lập trình tương tự sau đây...
- Dữ liệu dùng chung được bảo mật đang được sử dụng với Không gian bảo mật
- Lớp học lập trình về hình ảnh vùng chứa đã ký
- Phân tích dữ liệu mật bằng Không gian bảo mật
Tài liệu đọc thêm
- Bạn cảm thấy bị cô lập? Điện toán bảo mật sẽ giúp bạn giải quyết vấn đề này
- Tính năng điện toán bảo mật trên GCP
- Không gian bảo mật: Tương lai của hoạt động cộng tác bảo đảm quyền riêng tư
- Cách Google và Intel tăng cường bảo mật cho tính năng Điện toán bảo mật
- Quyền riêng tư so với tiến bộ – Nâng cao bảo mật bằng tính năng Điện toán bảo mật của Google Cloud