Skip to content

Commit 963f4de

Browse files
authored
GCP KMS + other updates (#105)
* added web3api_overrides example * GCP KMS implemented * updated getAll * updated env variable naming * added wallet add end-point * updated GCP env vars needed * updated readme & added aws,google kms doc * updated .env.example & update google kms doc
1 parent 0a6d6b2 commit 963f4de

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+628
-204
lines changed

.env.example

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,22 @@
33
# Either a private key
44
WALLET_PRIVATE_KEY=<your_admin_wallet_private_key>
55
# Or from AWS KMS
6+
AWS_KMS_KEY_ID=<your_aws_kms_key_id>
67
AWS_ACCESS_KEY_ID=<your_aws_access_key_id>
78
AWS_SECRET_ACCESS_KEY=<your_aws_secret_access_key>
8-
AWS_KMS_KEY_ID=<your_aws_kms_key_id>
99
AWS_REGION=<your_aws_region>
1010

11+
# Or from GOOGLE KMS
12+
# Required for Google Auth
13+
GOOGLE_APPLICATION_CREDENTIAL_EMAIL=<client_email_from_download_service_account_json>
14+
GOOGLE_APPLICATION_CREDENTIAL_PRIVATE_KEY=<private_key_from_download_service_account_json>
15+
# Required for Google KMS
16+
GOOGLE_APPLICATION_PROJECT_ID=<google_project_id>
17+
GOOGLE_KMS_KEY_RING_ID=<key_ring_id>
18+
GOOGLE_KMS_LOCATION_ID=<location_of_key_ring>
19+
GOOGLE_KMS_CRYPTO_KEY_ID=<kms_key_id> # If created on Google Console
20+
21+
1122
# THIRDWEB SDK SECRET KEY [Required]
1223
# -----------------------
1324
# Obtain an Secret Key from thirdweb.com/dashboard
@@ -62,5 +73,4 @@ BENCHMARK_POST_BODY='{
6273
"args": ["0x1946267d81Fb8aDeeEa28e6B98bcD446c8248473", 100000]
6374
}'
6475
BENCHMARK_CONCURRENCY=10
65-
BENCHMARK_REQUESTS=10
66-
76+
BENCHMARK_REQUESTS=10

.github/aws_kms_how_to.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
Web3-API supports AWS KMS for signing & sending transactions over any EVM chain. This is a guide on how to set up AWS KMS for Web3-API.
2+
3+
### Steps to set up AWS KMS
4+
5+
1. Create IAM user with programmatic access, see [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console) for more details.
6+
2. Add create, get, read permission to KMS, see [here](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html) for more details.
7+
3. Create a AWS KMS key, see [here](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) for more details. or, you can use the `/wallet/create` to create a key.
8+
9+
NOTE:
10+
11+
If you are creating the key yourself on AWS KMS Console, then please select the below config to create a key with sign permission.
12+
13+
```
14+
Key Type: Asymmetric
15+
Key Spec: ECC_SECG_P256K1
16+
Key Usage: Sign and verify
17+
```
18+
19+
Once you create the key above, you can use `/wallet/add` and send details on the end-point to create the wallet
20+
21+
### Set up Web3-API with AWS KMS
22+
23+
Create a `.env` file in the root directory of the project and add the below details.
24+
25+
```
26+
# Required for AWS Auth
27+
AWS_ACCESS_KEY_ID=<aws_access_key_id>
28+
AWS_SECRET_ACCESS_KEY=<aws_secret_access_key>
29+
AWS_REGION=<aws_region>
30+
31+
# Required for AWS KMS Admin Wallet
32+
AWS_KMS_KEY_ID=<kms_key_id>
33+
```

.github/google_kms_how_to.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
Web3-API supports Google KMS for signing & sending transactions over any EVM chain. This is a guide on how to set up Google KMS for Web3-API.
2+
3+
### Steps to set up Google KMS
4+
5+
1. Enable Google KMS API for your Google project, see [here](https://cloud.google.com/kms/docs/create-encryption-keys#before-you-begin) for more details.
6+
2. Create a Service Account (here)[https://cloud.google.com/iam/docs/service-accounts-create] and create a key under this service account and download the JSON file. This JSON file details will be used to authenticate with Google KMS.
7+
3. Add the below permissions to the service account created in step 2.
8+
9+
```
10+
Cloud KMS Admin
11+
Cloud KMS CryptoKey Signer/Verifier
12+
```
13+
14+
4. Create a keyring in Google KMS, see [here](https://cloud.google.com/kms/docs/create-key-ring) for more details.
15+
16+
Optional: Create a key in the keyring, see [here](https://cloud.google.com/kms/docs/create-key) for more details. or, you can use the `/wallet/create` to create a key in the keyring.
17+
18+
### Set up Web3-API with Google KMS
19+
20+
Create a `.env` file in the root directory of the project and add the below details.
21+
22+
```
23+
# Required for Google Auth
24+
GOOGLE_APPLICATION_CREDENTIAL_EMAIL=<client_email_from_download_service_account_json>
25+
GOOGLE_APPLICATION_CREDENTIAL_PRIVATE_KEY=<private_key_from_download_service_account_json>
26+
27+
# Required for Google KMS
28+
GOOGLE_APPLICATION_PROJECT_ID=<google_project_id>
29+
GOOGLE_KMS_KEY_RING_ID=<key_ring_id>
30+
GOOGLE_KMS_LOCATION_ID=<location_of_key_ring>
31+
GOOGLE_KMS_CRYPTO_KEY_ID=<kms_key_id> # If created on Google Console
32+
```

README.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,11 @@ There are multiple ways to setup a wallet for Web3-API using the below methods:
8282

8383
#### AWS KMS Wallet
8484

85-
1. Get the AWS KMS Support Variables which can be found in `.env.example` file
86-
2. Update the AWS KMS ENV Variables with the correct values on `.env` file
85+
Read More on [AWS KMS How To](./.github/aws_kms_how_to.md)
8786

88-
- `AWS_ACCESS_KEY_ID` : AWS Access Key
89-
- `AWS_SECRET_ACCESS_KEY` : AWS Secret Access Key
90-
- `AWS_REGION` : AWS KMS Key Region
91-
- `AWS_KMS_KEY_ID` : Needs to have the full ARN
87+
#### Google KMS Wallet
88+
89+
Read More on [Google KMS How To](./.github/google_kms_how_to.md)
9290

9391
### Advance Setup : PostgreSQL DB
9492

core/database/dbOperation.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ interface WalletExtraData {
1515
walletType?: string;
1616
gcpKmsKeyId?: string;
1717
gcpKmsKeyRingId?: string;
18+
gcpKmsLocationId?: string;
19+
gcpKmsKeyVersionId?: string;
20+
gcpKmsProjectId?: string;
21+
gcpKmsResourcePath?: string;
1822
}
1923

2024
export const insertIntoWallets = async (
@@ -89,19 +93,28 @@ export const addWalletDataWithSupportChainsNonceToDB = async (
8993
extraTableData?: WalletExtraData,
9094
): Promise<void> => {
9195
try {
92-
server.log.info("Setting up wallet Table");
96+
server.log.info(
97+
`Setting up wallet Table for walletType ${extraTableData?.walletType}, walletAddress ${walletAddress}`,
98+
);
9399
const supportedChains = await getSupportedChains();
94100
const promises = supportedChains.map(async (chain) => {
95101
try {
96102
const { slug } = chain;
97103
let lastUsedNonce = -1;
98-
let walletType = isWeb3APIInitWallet
104+
let walletType = extraTableData?.walletType
105+
? extraTableData?.walletType
106+
: isWeb3APIInitWallet
99107
? getInstanceAdminWalletType()
100108
: getWalletBackUpType();
101109
const sdk = await getSDK(slug, {
102110
walletAddress,
103111
walletType,
104112
awsKmsKeyId: extraTableData?.awsKmsKeyId,
113+
gcpKmsKeyId: extraTableData?.gcpKmsKeyId,
114+
gcpKmsKeyRingId: extraTableData?.gcpKmsKeyRingId,
115+
gcpKmsLocationId: extraTableData?.gcpKmsLocationId,
116+
gcpKmsKeyVersionId: extraTableData?.gcpKmsKeyVersionId,
117+
gcpKmsResourcePath: extraTableData?.gcpKmsResourcePath,
105118
});
106119
walletAddress =
107120
(await sdk.getSigner()?.getAddress())?.toLowerCase() ?? "";

core/database/sql-schemas/wallets.sql

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ CREATE TABLE IF NOT EXISTS wallets (
88
"lastUsedNonce" BIGINT NOT NULL,
99
"awsKmsKeyId" VARCHAR(255),
1010
"awsKmsArn" VARCHAR(255),
11-
-- "gcpKmsKeyRingId" VARCHAR(50),
12-
-- "gcpKmsKeyId" VARCHAR(50),
13-
-- "gcpKmsKeyVersion" VARCHAR(20),
11+
"gcpKmsKeyRingId" VARCHAR(50),
12+
"gcpKmsKeyId" VARCHAR(50),
13+
"gcpKmsKeyVersionId" VARCHAR(20),
14+
"gcpKmsLocationId" VARCHAR(20),
15+
"gcpKmsResourcePath" TEXT,
1416
PRIMARY KEY ("walletAddress", "chainId")
1517
);
1618

@@ -22,7 +24,11 @@ ALTER COLUMN "lastUsedNonce" TYPE BIGINT,
2224
ADD COLUMN IF NOT EXISTS "awsKmsKeyId" VARCHAR(255),
2325
ADD COLUMN IF NOT EXISTS "awsKmsArn" VARCHAR(255),
2426
ADD COLUMN IF NOT EXISTS "slug" VARCHAR(255),
25-
DROP COLUMN IF EXISTS "chainName";
26-
-- ADD COLUMN IF NOT EXISTS "gcpKmsKeyRingId" VARCHAR(50),
27-
-- ADD COLUMN IF NOT EXISTS "gcpKmsKeyId" VARCHAR(50),
28-
-- ADD COLUMN IF NOT EXISTS "gcpKmsKeyVersion" VARCHAR(20);
27+
DROP COLUMN IF EXISTS "chainName",
28+
ADD COLUMN IF NOT EXISTS "gcpKmsKeyRingId" VARCHAR(50),
29+
ADD COLUMN IF NOT EXISTS "gcpKmsKeyId" VARCHAR(50),
30+
ADD COLUMN IF NOT EXISTS "gcpKmsKeyVersionId" VARCHAR(20),
31+
ADD COLUMN IF NOT EXISTS "gcpKmsLocationId" VARCHAR(20),
32+
DROP COLUMN IF EXISTS "gcpKmsKeyVersion",
33+
DROP COLUMN IF EXISTS "gcpKmsKeyPath",
34+
ADD COLUMN IF NOT EXISTS "gcpKmsResourcePath" TEXT;

core/env.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ export const env = createEnv({
3131
z.object({
3232
AWS_KMS_KEY_ID: z.string().min(1),
3333
}),
34+
z.object({
35+
GOOGLE_KMS_KEY_ID: z.string().min(1).optional(),
36+
}),
3437
]),
3538
AWS_ACCESS_KEY_ID: z.string().min(1).optional(),
3639
AWS_SECRET_ACCESS_KEY: z.string().min(1).optional(),
@@ -58,9 +61,10 @@ export const env = createEnv({
5861
MINED_TX_CRON_ENABLED: boolSchema("true"),
5962
MINED_TX_CRON_SCHEDULE: z.string().default("*/5 * * * * *"),
6063
MIN_TX_TO_CHECK_FOR_MINED_STATUS: z.coerce.number().default(50),
61-
GCP_PROJECT_ID: z.string().min(1).optional(),
62-
GCP_KEY_RING_ID: z.string().min(1).optional(),
63-
GCP_LOCATION_ID: z.string().min(1).optional(),
64+
GOOGLE_APPLICATION_PROJECT_ID: z.string().min(1).optional(),
65+
GOOGLE_KMS_KEY_RING_ID: z.string().min(1).optional(),
66+
GOOGLE_KMS_LOCATION_ID: z.string().min(1).optional(),
67+
GOOGLE_KMS_KEY_VERSION_ID: z.string().min(1).optional(),
6468
GOOGLE_APPLICATION_CREDENTIAL_EMAIL: z.string().min(1).optional(),
6569
GOOGLE_APPLICATION_CREDENTIAL_PRIVATE_KEY: z.string().min(1).optional(),
6670
},
@@ -73,6 +77,7 @@ export const env = createEnv({
7377
// The sdk expects a primitive type but we can overload it here to be an object
7478
WALLET_PRIVATE_KEY: process.env.WALLET_PRIVATE_KEY,
7579
AWS_KMS_KEY_ID: process.env.AWS_KMS_KEY_ID,
80+
GOOGLE_KMS_KEY_ID: process.env.GOOGLE_KMS_KEY_ID,
7681
} as any,
7782
AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID,
7883
AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY,
@@ -99,9 +104,10 @@ export const env = createEnv({
99104
MINED_TX_CRON_SCHEDULE: process.env.MINED_TX_CRON_SCHEDULE,
100105
MIN_TX_TO_CHECK_FOR_MINED_STATUS:
101106
process.env.MIN_TX_TO_CHECK_FOR_MINED_STATUS,
102-
GCP_PROJECT_ID: process.env.GCP_PROJECT_ID,
103-
GCP_KEY_RING_ID: process.env.GCP_KEY_RING_ID,
104-
GCP_LOCATION_ID: process.env.GCP_LOCATION_ID,
107+
GOOGLE_APPLICATION_PROJECT_ID: process.env.GOOGLE_APPLICATION_PROJECT_ID,
108+
GOOGLE_KMS_KEY_RING_ID: process.env.GOOGLE_KMS_KEY_RING_ID,
109+
GOOGLE_KMS_LOCATION_ID: process.env.GOOGLE_KMS_LOCATION_ID,
110+
GOOGLE_KMS_KEY_VERSION_ID: process.env.GOOGLE_KMS_KEY_VERSION_ID,
105111
GOOGLE_APPLICATION_CREDENTIAL_EMAIL:
106112
process.env.GOOGLE_APPLICATION_CREDENTIAL_EMAIL,
107113
GOOGLE_APPLICATION_CREDENTIAL_PRIVATE_KEY:

core/helpers/index.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,25 @@ export const getInstanceAdminWalletType = (): string => {
3131
}
3232

3333
// ToDo GCP KMS
34-
return "";
34+
return "gcp_kms";
3535
};
3636

3737
export const getWalletBackUpType = (): string => {
3838
if (AWS_ACCESS_KEY_ID && AWS_SECRET_ACCESS_KEY && AWS_REGION) {
3939
return "aws_kms";
4040
}
4141

42+
if (
43+
env.GOOGLE_APPLICATION_CREDENTIAL_EMAIL &&
44+
env.GOOGLE_APPLICATION_CREDENTIAL_PRIVATE_KEY &&
45+
env.GOOGLE_APPLICATION_PROJECT_ID &&
46+
env.GOOGLE_KMS_KEY_RING_ID &&
47+
env.GOOGLE_KMS_KEY_VERSION_ID &&
48+
env.GOOGLE_KMS_LOCATION_ID
49+
) {
50+
return "gcp_kms";
51+
}
52+
4253
// ToDo GCP KMS
4354
return "ppk";
4455
};

core/interfaces/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@ export interface WalletData {
99
gcpKmsKeyId?: string;
1010
awsKmsKeyArn?: string;
1111
gcpKmsKeyRingId?: string;
12-
gcpKmsKeyVersion?: string;
12+
gcpKmsKeyVersionId?: string;
13+
gcpKmsLocationId?: string;
14+
gcpKmsProjectId?: string;
1315
}

0 commit comments

Comments
 (0)