Как совершать транзакции с цифровыми активами с помощью многосторонних вычислений и конфиденциального пространства,Как совершать транзакции с цифровыми активами с помощью многосторонних вычислений и конфиденциального пространства

1. Обзор

Прежде чем мы начнем, хотя это и не обязательно, практическое знание следующих функций и концепций окажется полезным в этой лаборатории кода.

4670cd5427aa39a6.png

Что вы узнаете

В этой лабораторной работе представлена ​​эталонная реализация для подписания блокчейна, совместимого с MPC, с использованием конфиденциального пространства. Чтобы проиллюстрировать эту концепцию, мы рассмотрим сценарий, в котором компания Primus хочет передать цифровые активы компании Secundus. В этом сценарии компания Primus использует модель, совместимую с MPC, что означает, что вместо использования отдельных закрытых ключей они используют распределенные общие ключи. Эти ключевые акции принадлежат нескольким сторонам, в данном случае Алисе и Бобу. Такой подход дает компании Primus ряд преимуществ, включая упрощение пользовательского опыта, операционную эффективность и контроль над их закрытыми ключами.

Чтобы объяснить фундаментальные аспекты этого процесса, мы подробно опишем техническую настройку и проведем вас через процесс утверждения и подписания, который инициирует передачу цифровых активов из компании Primus в компанию Secundus. Обратите внимание, что Боб и Алиса, которые оба являются сотрудниками компании Primus, должны одобрить транзакцию.

Хотя эта эталонная реализация демонстрирует операции с подписями, она не охватывает все аспекты управления ключами MPC. Например, мы не обсуждаем генерацию ключей. Кроме того, существуют альтернативные и взаимодополняющие подходы, такие как использование облачных сервисов, отличных от Google, для создания совместных подписей или предоставление соподписавшим сторонам возможности создавать подписи блокчейна в своих собственных средах, что представляет собой более децентрализованную архитектуру. Мы надеемся, что эта лаборатория вдохновит на новые подходы к MPC в Google Cloud.

Вы будете работать с простой рабочей нагрузкой, которая подписывает транзакцию Ethereum в конфиденциальном пространстве с использованием ключей соподписавшего лица. Подписание транзакции Ethereum — это процесс, с помощью которого пользователь может авторизовать транзакцию в блокчейне Ethereum. Чтобы отправить транзакцию Ethereum, вам необходимо подписать ее своим закрытым ключом. Это доказывает, что вы являетесь владельцем учетной записи и разрешаете транзакцию. Процесс подписания выглядит следующим образом:

  1. Отправитель создает объект транзакции, в котором указывается адрес получателя, количество ETH для отправки и любые другие соответствующие данные.
  2. Закрытый ключ отправителя используется для хеширования данных транзакции.
  3. Затем хеш подписывается закрытым ключом.
  4. Подпись прикрепляется к объекту транзакции.
  5. Транзакция транслируется в сеть Ethereum.

Когда узел в сети получает транзакцию, он проверяет подпись, чтобы убедиться, что она подписана владельцем учетной записи. Если подпись действительна, узел добавит транзакцию в блокчейн.

Для начала вы настроите необходимые облачные ресурсы. Затем вы запустите рабочую нагрузку в конфиденциальном пространстве. Эта лаборатория кода проведет вас через следующие общие шаги:

  • Как настроить необходимые облачные ресурсы для работы Конфиденциального пространства
  • Как авторизовать доступ к защищенным ресурсам на основе атрибутов:
  • Что : контейнер рабочей нагрузки
  • Где : среда конфиденциального пространства (образ конфиденциального пространства на конфиденциальной виртуальной машине).
  • Кто : учетная запись, на которой выполняется рабочая нагрузка.
  • Как запустить рабочую нагрузку на конфиденциальной виртуальной машине, на которой работает образ виртуальной машины конфиденциального пространства

Требуемые API

Чтобы выполнить это руководство, необходимо включить следующие API в указанных проектах.

Имя API

Название API

cloudkms.googleapis.com

Облачный КМС

Compute.googleapis.com

Вычислительный двигатель

конфиденциальныйкомпьютинг.googleapis.com

Конфиденциальные вычисления

iamcredentials.googleapis.com

Я

arteregistry.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
  • Чтобы установить переменные для имен ресурсов, вы можете использовать следующую команду. Обратите внимание, что это переопределит имена ресурсов, специфичные для вашего проекта GCP для компании A, например, export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket'
  • Для вашего проекта GCP в компании А можно установить следующие переменные:

$PRIMUS_INPUT_STORAGE_BUCKET

Корзина, в которой хранятся зашифрованные ключи.

$PRIMUS_RESULT_STORAGE_BUCKET

Бакет, в котором хранится результат транзакции MPC.

$PRIMUS_KEY

Ключ KMS, используемый для шифрования данных, хранящихся в $PRIMUS_INPUT_STORAGE_BUCKET для Primus Bank.

$PRIMUS_KEYRING

Связка ключей KMS, которая будет использоваться для создания ключа шифрования $PRIMUS_KEY для Primus Bank.

$PRIMUS_WIP_PROVIDER

Поставщик пула удостоверений рабочей нагрузки, который включает условие атрибута, используемое для токенов, подписанных службой рабочей нагрузки MPC.

$PRIMUS_SERVICEACCOUNT

Учетная запись службы, которую $PRIMUS_WORKLOAD_IDENTITY_POOL использует для доступа к защищенным ресурсам. У этой учетной записи службы будет разрешение на просмотр зашифрованных ключей, хранящихся в корзине $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ARTIFACT_REPOSITORY

Репозиторий артефактов для хранения образа контейнера рабочей нагрузки.

$WORKLOAD_SERVICEACCOUNT

Учетная запись службы, имеющая разрешение на доступ к конфиденциальной виртуальной машине, на которой выполняется рабочая нагрузка.

$WORKLOAD_CONTAINER

Контейнер Docker, в котором выполняется рабочая нагрузка.

$WORKLOAD_IMAGE_NAME

Имя образа контейнера рабочей нагрузки.

$WORKLOAD_IMAGE_TAG

Тег образа контейнера рабочей нагрузки.

  • Запустите следующий сценарий , чтобы задать для оставшихся имен переменных значения, основанные на идентификаторе вашего проекта для имен ресурсов.
source config_env.sh

Настройка облачных ресурсов

В рамках этого шага вы настроите облачные ресурсы, необходимые для многосторонних вычислений. Для этой лабораторной работы вы будете использовать следующий закрытый ключ: 0000000000000000000000000000000000000000000000000000000000000001

В производственной среде вы создадите свой собственный закрытый ключ. Однако для целей этой лабораторной работы мы разделим этот закрытый ключ на две общие части и зашифруем каждую. В рабочем сценарии ключи никогда не должны храниться в текстовых файлах. Вместо этого закрытый ключ можно сгенерировать вне Google Cloud (или полностью пропустить и заменить созданием специального фрагмента ключа MPC), а затем зашифровать, чтобы никто не имел доступа к закрытому ключу или общим ключам. Для целей этой лабораторной работы мы будем использовать Gcloud CLI.

Запустите следующий сценарий , чтобы настроить необходимые облачные ресурсы. В рамках этих шагов будут созданы следующие ресурсы:

  • Корзина облачного хранилища ( $PRIMUS_INPUT_STORAGE_BUCKET ) для хранения зашифрованных общих ключей закрытого ключа.
  • Корзина облачного хранилища ( $PRIMUS_RESULT_STORAGE_BUCKET ) для хранения результатов транзакции цифровых активов.
  • Ключ шифрования ( $PRIMUS_KEY ) и связка ключей ( $PRIMUS_KEYRING ) в KMS для шифрования общих ключей закрытого ключа.
  • Пул идентификации рабочей нагрузки ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) для проверки утверждений на основе условий атрибутов, настроенных в рамках его поставщика.
  • Учетная запись службы ( $PRIMUS_SERVICEACCOUNT ), прикрепленная к вышеупомянутому пулу идентификаторов рабочей нагрузки ( $PRIMUS_WORKLOAD_IDENTITY_POOL ), со следующим доступом к IAM:
  • roles/cloudkms.cryptoKeyDecrypter для расшифровки данных с помощью ключа KMS.
  • objectViewer для чтения данных из корзины Cloud Storage.
  • roles/iam.workloadIdentityUser для подключения этой учетной записи службы к пулу идентификаторов рабочей нагрузки.
./setup_resources.sh

3. Создайте рабочую нагрузку

Создать учетную запись службы рабочей нагрузки

Теперь вы создадите учетную запись службы для рабочей нагрузки с необходимыми ролями и разрешениями. Для этого запустите следующий скрипт , который создаст учетную запись службы рабочей нагрузки для компании A. Эта учетная запись службы будет использоваться виртуальной машиной, на которой выполняется рабочая нагрузка.

Учетная запись службы рабочей нагрузки ( $WORKLOAD_SERVICEACCOUNT ) будет иметь следующие роли:

  • confidentialcomputing.workloadUser для получения токена аттестации
  • logging.logWriter для записи журналов в Cloud Logging.
  • objectViewer для чтения данных из корзины облачного хранилища $PRIMUS_INPUT_STORAGE_BUCKET .
  • objectUser для записи результата рабочей нагрузки в корзину облачного хранилища $PRIMUS_RESULT_STORAGE_BUCKET .
./create_workload_service_account.sh

Создать рабочую нагрузку

Этот шаг включает в себя создание образа Docker рабочей нагрузки. Рабочая нагрузка в этой лаборатории кода — это простое приложение 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, который мы будем использовать для этой лаборатории кода.

Dockerfile: Наконец, мы создадим наш Dockerfile, который будет использоваться для создания образа Docker для рабочей нагрузки. определяет Dockerfile, как указано здесь .

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" в файле Dockerfile — это политика запуска, установленная автором образа. Это позволяет оператору игнорировать CMD при выполнении рабочей нагрузки. По умолчанию для параметраallow_cmd_override установлено значение false. LABEL «tee.launch_policy.allow_env_override» сообщает Конфиденциальному пространству, какие переменные среды изображения пользователи могут использовать.

Запустите следующий сценарий , чтобы создать рабочую нагрузку, в которой выполняются следующие шаги:

  • Создайте реестр артефактов ( $PRIMUS_ARTIFACT_REPOSITORY ) для хранения образа Docker рабочей нагрузки.
  • Обновите код рабочей нагрузки, указав необходимые имена ресурсов. Вот код рабочей нагрузки, используемый для этой лаборатории кода.
  • Создайте Dockerfile для создания образа Docker кода рабочей нагрузки. Вы можете найти Dockerfile здесь .
  • Создайте и опубликуйте образ Docker в реестре артефактов ( $PRIMUS_ARTIFACT_REPOSITORY ), созданном на предыдущем шаге.
  • Предоставьте $WORKLOAD_SERVICEACCOUNT разрешение на чтение для $PRIMUS_ARTIFACT_REPOSITORY . Это необходимо для того, чтобы контейнер рабочей нагрузки извлекал образ Docker рабочей нагрузки из реестра артефактов.
./create_workload.sh

Создайте узел блокчейна

Ганаш Узел Эфириума

Прежде чем авторизовать рабочую нагрузку, нам необходимо создать экземпляр Ethereum Ganache. Подписанная транзакция будет отправлена ​​в этот экземпляр Ganache. Пожалуйста, запишите IP-адрес этого экземпляра. После выполнения приведенной ниже команды вам может потребоваться ввести y , чтобы включить API.

gcloud config set project $PRIMUS_PROJECT_ID
gcloud compute instances create-with-container mpc-lab-ethereum-node \
  --zone=${PRIMUS_PROJECT_ZONE}\
  --tags=http-server \
  --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"

Запустить рабочую нагрузку

В этом разделе объясняется, как запустить рабочую нагрузку на конфиденциальной виртуальной машине. Для этого мы передадим необходимые аргументы TEE, используя флаг метаданных. Кроме того, мы установим переменные среды для контейнера рабочей нагрузки, используя флаг «tee-env-*». Изображение имеет следующие переменные:

  • NODE_URL : URL-адрес узла Ethereum, который будет обрабатывать подписанную транзакцию.
  • 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 config set project $PRIMUS_PROJECT_ID
gcloud compute instances create $WORKLOAD_VM \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform \
 --zone=${PRIMUS_PROJECT_ZONE} \
 --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 mpc-lab-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}"

Проверьте результаты облачного хранилища

Вы можете просмотреть квитанцию ​​о транзакции в Cloud Storage. Загрузка Confidential Space и появление результатов может занять несколько минут. Вы узнаете, что контейнер завершен, когда виртуальная машина находится в остановленном состоянии.

  1. Перейдите на страницу браузера Cloud Storage .
  2. Нажмите $PRIMUS_RESULT_STORAGE_BUCKET .
  3. Нажмите на файл transaction_receipt .
  4. Нажмите «Загрузить», чтобы загрузить и просмотреть ответ на транзакцию.

Примечание. Если результаты не отображаются, вы можете перейти к $WORKLOAD_VM на странице облачной консоли Compute Engine и нажать «Последовательный порт 1 (консоль)», чтобы просмотреть журналы.

Проверьте транзакцию блокчейна Ganache

Вы также можете просмотреть транзакцию в журнале блокчейна.

  1. Перейдите на страницу Cloud Compute Engine .
  2. Нажмите на VM mpc-lab-ethereum-node .
  3. Нажмите SSH , чтобы открыть окно SSH в браузере.
  4. В окне SSH введите sudo docker ps , чтобы увидеть работающий контейнер Ganache.
  5. Найдите идентификатор контейнера для trufflesuite/ganache:v7.7.3
  6. Введите sudo docker logs CONTAINER_ID заменив CONTAINER_ID идентификатором trufflesuite/ganache:v7.7.3 .
  7. Просмотрите журналы Ganache и убедитесь, что в журналах указана транзакция.

5. Очистка

Вот сценарий, который можно использовать для очистки ресурсов, которые мы создали в рамках этой лаборатории кода. В рамках этой очистки будут удалены следующие ресурсы:

  • Сегмент входного хранилища, используемый для хранения общих зашифрованных ключей ( $PRIMUS_INPUT_STORAGE_BUCKET) .
  • Ключ шифрования и связка ключей ( $PRIMUS_KEY и $PRIMUS_KEYRING ).
  • Сервисная учетная запись, используемая для доступа к защищенным ресурсам ( $PRIMUS_SERVICEACCOUNT ).
  • Пул идентификации рабочей нагрузки ( $PRIMUS_WORKLOAD_IDENTITY_POOL ).
  • Учетная запись службы рабочей нагрузки ( $WORKLOAD_SERVICEACCOUNT ).
  • Экземпляры вычислений рабочей нагрузки.
  • Сегмент хранения результатов, используемый для хранения результата транзакции. ( $PRIMUS_RESULT_STORAGE_BUCKET ).
  • Реестр артефактов, используемый для хранения образа рабочей нагрузки ( $PRIMUS_ARTIFACT_REPOSITORY ).
./cleanup.sh

Если вы закончили изучение, рассмотрите возможность удаления проекта.

  • Перейдите в консоль облачной платформы.
  • Выберите проект, который хотите закрыть, затем нажмите «Удалить» вверху. Это планирует удаление проекта.

Что дальше?

Посмотрите некоторые из этих похожих лабораторий кода...

Дальнейшее чтение