Skip to content

Commit

Permalink
Merge pull request #1369 from artela-network/ai16zPR/tee-verifiable-l…
Browse files Browse the repository at this point in the history
…og-api-from-develop

feat: RP for plugin-tee-verifiable-log
  • Loading branch information
HashWarlock authored Jan 13, 2025
2 parents 64b4174 + 104202d commit d5a56c9
Show file tree
Hide file tree
Showing 23 changed files with 1,968 additions and 390 deletions.
33 changes: 33 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,39 @@ ZEROG_FLOW_ADDRESS=
TEE_MODE=OFF # LOCAL | DOCKER | PRODUCTION
WALLET_SECRET_SALT= # ONLY define if you want to use TEE Plugin, otherwise it will throw errors


# TEE Verifiable Log Configuration
VLOG= # true/false; if you want to use TEE Verifiable Log, set this to "true"

# Galadriel Configuration
GALADRIEL_API_KEY=gal-* # Get from https://dashboard.galadriel.com/

# Venice Configuration
VENICE_API_KEY= # generate from venice settings
SMALL_VENICE_MODEL= # Default: llama-3.3-70b
MEDIUM_VENICE_MODEL= # Default: llama-3.3-70b
LARGE_VENICE_MODEL= # Default: llama-3.1-405b
IMAGE_VENICE_MODEL= # Default: fluently-xl

# Akash Chat API Configuration docs: https://chatapi.akash.network/documentation
AKASH_CHAT_API_KEY= # Get from https://chatapi.akash.network/
SMALL_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-2-3B-Instruct
MEDIUM_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-3-70B-Instruct
LARGE_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-1-405B-Instruct-FP8

# fal.ai Configuration
FAL_API_KEY=
FAL_AI_LORA_PATH=

# Web search API Configuration
TAVILY_API_KEY=

# WhatsApp Cloud API Configuration
WHATSAPP_ACCESS_TOKEN= # Permanent access token from Facebook Developer Console
WHATSAPP_PHONE_NUMBER_ID= # Phone number ID from WhatsApp Business API
WHATSAPP_BUSINESS_ACCOUNT_ID= # Business Account ID from Facebook Business Manager
WHATSAPP_WEBHOOK_VERIFY_TOKEN= # Custom string for webhook verification
WHATSAPP_API_VERSION=v17.0 # WhatsApp API version (default: v17.0)
ENABLE_TEE_LOG=false # Set to true to enable TEE logging, only available when running eliza in TEE

# Flow Blockchain Configuration
Expand Down
1 change: 1 addition & 0 deletions agent/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
"@elizaos/plugin-letzai": "workspace:*",
"@elizaos/plugin-thirdweb": "workspace:*",
"@elizaos/plugin-genlayer": "workspace:*",
"@elizaos/plugin-tee-verifiable-log": "workspace:*",
"@elizaos/plugin-depin": "workspace:*",
"@elizaos/plugin-open-weather": "workspace:*",
"@elizaos/plugin-obsidian": "workspace:*",
Expand Down
4 changes: 4 additions & 0 deletions agent/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ import net from "net";
import path from "path";
import { fileURLToPath } from "url";
import yargs from "yargs";
import { verifiableLogPlugin } from "@elizaos/plugin-tee-verifiable-log";
import createNFTCollectionsPlugin from "@elizaos/plugin-nft-collections";

const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file
Expand Down Expand Up @@ -798,6 +799,9 @@ export async function createAgent(
]
: []),
...(teeMode !== TEEMode.OFF && walletSecretSalt ? [teePlugin] : []),
(teeMode !== TEEMode.OFF && walletSecretSalt &&getSecret(character,"VLOG")
? verifiableLogPlugin
: null),
getSecret(character, "SGX") ? sgxPlugin : null,
getSecret(character, "ENABLE_TEE_LOG") &&
((teeMode !== TEEMode.OFF && walletSecretSalt) ||
Expand Down
1 change: 1 addition & 0 deletions packages/client-direct/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"dependencies": {
"@elizaos/core": "workspace:*",
"@elizaos/plugin-image-generation": "workspace:*",
"@elizaos/plugin-tee-verifiable-log": "workspace:*",
"@elizaos/plugin-tee-log": "workspace:*",
"@types/body-parser": "1.19.5",
"@types/cors": "2.8.17",
Expand Down
129 changes: 128 additions & 1 deletion packages/client-direct/src/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,133 @@ curl -X GET "http://localhost:3000/fine-tune/8566c47a-ada8-441c-95bc-7bb07656c4c
-H "Authorization: Bearer jvBpxrTNqGqhnfQhSEqCdsG6aTSP8IBL".
```



## Verifiable Attestations

This function relies on [plugin-tee-verifiable-log](../../plugin-tee-verifiable-log/README.md)

Enable Verifiable Logs, Configuration variables in .env
```shell
TEE_MODE="DOCKER" # LOCAL | DOCKER | PRODUCTION
WALLET_SECRET_SALT= "<your wallet secret salt>" # ONLY define if you want to use TEE Plugin, otherwise it will throw errors
VLOG="true"
```
### APIs
### 1. Get verifiable agents
```shell
curl -X GET --location "http://localhost:3000/verifiable/agents"
```
* Response success result
```shell
{
"success": true,
"message": "Successfully get Agents",
"data": [
{
"id": "c4598810-61a2-4ac8-ab85-b746402692c4",
"created_at": 1734526797906,
"agent_id": "9c321604-e69e-0e4c-ab84-bec6fd6baf92",
"agent_name": "Capila",
"agent_keypair_path": "/keys/verifiable_key",
"agent_keypair_vlog_pk": "0x045b51a28c3b071104f3094b1934343eb831b8d56f16fc6..."
}
]
}
```
* Response failure result
```shell
{
"error": "failed to get agents registered ",
"details": "Cannot read properties of undefined (reading 'getService')",
"stack": "TypeError: Cannot read ..."
}
```

### 2.Query verifiable logs
```bash

curl -X POST --location "http://localhost:3000/verifiable/logs" \
-H "Content-Type: application/json" \
-d '{
"query": {
"contLike": "Twinkletwinkle"
},
"page": 1,
"pageSize": 10
}'
```
The query body that can be queried are:
>* idEq: string;
>* agentIdEq: string;
>* roomIdEq: string;
>* userIdEq: string;
>* typeEq: string;
>* contLike: string;
>* signatureEq: string;
* Response success result
```shell
{
"success": true,
"message": "Successfully retrieved logs",
"data": {
"page": 1,
"pageSize": 10,
"total": 1,
"data": [
{
"id": "b9ac4b2f-ecb5-4c5c-a981-d282b831e878",
"created_at": 1734526805664,
"agent_id": "9c321604-e69e-0e4c-ab84-bec6fd6baf92",
"room_id": "8c54580d-2c56-01e8-81e4-4160a02f3ee5",
"user_id": "9c321604-e69e-0e4c-ab84-bec6fd6baf92",
"type": "post tweet",
"content": "{\"text\":\"Twinkletwinkle, it's time to unlock your artistic values!\\n\\n My NFTs are here to bring the chill vibes to Web3.\\n\\n Let's wagmi and make this a day to remember!\",\"url\":\"https://twitter.com/....\"}",
"signature": "0x9ac77cfef9374bff3b41f96d0b0a8d61bfcf88e3a01f7bc20653494145ff31ef118a2a3cd94437481000a13500c6ed6714d8802bf2572a7da4de2e81a688d0b41c"
}
]
}
}
```
* Response failure result
```shell

{
"error": "Failed to Get Verifiable Logs",
"details": "Cannot read properties of undefined (reading 'getService')",
"stack": "TypeError: Cannot read ..."
}
```


### 3.Get Tee Attestation
```shell
curl -X POST --location "http://localhost:3000/verifiable/attestation" \
-H "Content-Type: application/json" \
-d '{
"agentId": "9c321604-e69e-0e4c-ab84-bec6fd6baf92",
"publicKey": "0x045b51a28c3b071104f3094b1934343eb831b8d56f16fc6e9a3304e9f051b24e584d806b20769b05eeade3a6c792db96f57b26cc38037907dd920e9be9f41f6184"
}'
```
* Response success result
```shell
{
"success": true,
"message": "Successfully get Attestation",
"data": "{\"quote\":\"0x04000300810000000e934d64208ed62112d13060cf062a398f78a9516b9f884ee7ad145e875b59592b09598ce02e4d4983ae4decab71f5147acd16a26326e01075a8d5b709727224bba449c9cd7fc2b490ea23d9e01cd932221d8b86a0a8a7be25c25571bceef0427131860fe0cb295b0d25e5ed1488d9a122c24ba4c1494c2a2578535c556752850c6bbd60c2482b5bb10b5157fe5f42b637457262fd4d8a92575b307f5453c1982a841b46cd60858a3f8ced7ca2ba1c02cf9fec3f23b30bbe8e30378e116bea58b4068bf0379964b6adcb2f680f4646b26a21bed6f8ac06f468cc356db0b2769638a02a7d6e0b69ae297304c62a1fd800703e8bfd340901b6ad412d9433eee04b67ab86311ebb4ee2f3a758ea3fda0e89f45c7ec9ca28e2d525fab6d3e62c3e2b6788dd9dec6e367975c0ac5f6c2aad436e14c75dd99a94c51d882efc0ea44ca8c251e3384b24a88af39ab070b65387ee5e0fd11212852663248c6f24a646c163273348ea03f99d028022b08e09b0b992d9b49c61246b298c3ec827af4973a57bc017a35e0f22750922f2cae660ed70797695c5c65104339f912e1da35a7c625e5fa470764228efe80309762e33ea295b8fd6bae7ef9e7f9a4210deaac322d26acf4e003aded3099c90d6f5c1caa6fb9d84e4f70da3ea1fbfd76c2c7bb544375f566a5182e142da67718a4db7b373ff7e8b4e14bf5a752c5cf88002555020a2a4938978849c1774810456a8fe89769a595676eb0fdadda83540d353efdd40a3efcfb80283abc942e9348d3fe04109fd9999ed6fae17b5d8de88dcd80e5d57cd576ffb7a21780bd6064b4e61f83d1ff1088e836f2a8aa4cdee685aa02303cb809a6e45997532d372b5b519d3ae03f08cb162020000f5672ea83d7b1e145824622fea621381d7b6a110b1b0fdda4e4e2c3565431d099e74829267a01345a2780d0387173419e23bdb72ea57294c696e14ac8198e0967e30dc93a361465d109c1a54f47c117adcba95fdc2cecbd2b35ba3fc7443d80f56e16499d4a85ae2970428848487f963c9366898b34ebbb349dc162d2127f2800000dc010000149f9a1f60ae565575037121aac4f9a10cf6d6e884df2aac1c2bb83f8cad17d0d27f7d4264bdb78a9fe056aba38ff666b22642a9471f351f04afa7ad727f80a1ecab742174c46b33f034fc43cdef08afde65b93aeb94db20b705b379407e50a648db3a3f5958ac29f9bcc32a46a3ea36be27bc049a1409e8543467926afce68eed7488c7120ff3bd6d79c61078111d285e13fc365c82da04469a77101e067bc24f0c4fd27c361430292b8af92f07ac2687532e36377a9c67fa65a17a1dedba2aabac079d3ee691fcdf3e10bf7a479ee58e27085f5ac700a2252899cd88ba13ab00b1cf12cbfca3bcdacaf870e904191bdf2e7426c86b092380fbb523086c294aaf64f3931c96ec7292e4a0aee03f4b0f0eb757d1dc96c7fd07dcad6d51622060e5db55cae0c45aab399caa785665302fff467b1caa98e4ef2bac9a02911388a44b69cf7f21bf3c2ce2da95f323ea3717eddfe97f486beb90dc7ff88377211dd8a89d2b77d044fae1423904839ad8b4662d8df7a414c9aec2c234c0df878093fc31714d2fee3c400cfbee9df0ee82df7d7361d53a7ce91b01e80d3dc9702eebb8dafa1cb3e2a5032fd64ded06e5f1bacd9c275604cedabbea82cec2cfa32384790a000000000000000000000078c50a00000000000000000000000000\",\"timestamp\":1734626127589}"
}
```

* Response failure result
```shell

{
"error": "Failed to Get Verifiable Logs",
"details": "Cannot read properties of undefined (reading 'getService')",
"stack": "TypeError: Cannot read ..."
}
```
# TEE Logging

TEE Logging is a feature that allows you to log the activities of your agents. Through these logs, you can verify that the actions of the agents are protected by the TEE and that they are executed autonomously by Eliza, without any third-party interference.
Expand Down Expand Up @@ -187,4 +314,4 @@ Example response when error:
{
"error": "Failed to get TEE logs"
}
```
```
5 changes: 5 additions & 0 deletions packages/client-direct/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import {
import { createApiRouter } from "./api.ts";
import * as fs from "fs";
import * as path from "path";
import { createVerifiableLogApiRouter } from "./verifiable-log-api.ts";
import OpenAI from "openai";

const storage = multer.diskStorage({
Expand Down Expand Up @@ -135,6 +136,10 @@ export class DirectClient {
const apiRouter = createApiRouter(this.agents, this);
this.app.use(apiRouter);


const apiLogRouter = createVerifiableLogApiRouter(this.agents);
this.app.use(apiLogRouter);

// Define an interface that extends the Express Request interface
interface CustomRequest extends ExpressRequest {
file?: Express.Multer.File;
Expand Down
119 changes: 119 additions & 0 deletions packages/client-direct/src/verifiable-log-api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import express from "express";
import bodyParser from "body-parser";
import cors from "cors";

import { AgentRuntime, elizaLogger, ServiceType } from "@elizaos/core";
import {
VerifiableLogService,
VerifiableLogQuery,
} from "@elizaos/plugin-tee-verifiable-log";

export function createVerifiableLogApiRouter(
agents: Map<string, AgentRuntime>
) {
const router = express.Router();
router.use(cors());
router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: true }));

router.get(
"/verifiable/agents",
async (req: express.Request, res: express.Response) => {
try {
// call the listAgent method
const agentRuntime: AgentRuntime | undefined = agents.values().next().value;
const pageQuery = await agentRuntime
.getService<VerifiableLogService>(
ServiceType.VERIFIABLE_LOGGING
)
.listAgent();

res.json({
success: true,
message: "Successfully get Agents",
data: pageQuery,
});
} catch (error) {
elizaLogger.error("Detailed error:", error);
res.status(500).json({
error: "failed to get agents registered ",
details: error.message,
stack: error.stack,
});
}
}
);
router.post(
"/verifiable/attestation",
async (req: express.Request, res: express.Response) => {
try {
const query = req.body || {};

const verifiableLogQuery = {
agentId: query.agentId || "",
publicKey: query.publicKey || "",
};
const agentRuntime: AgentRuntime | undefined = agents.values().next().value;
const pageQuery = await agentRuntime
.getService<VerifiableLogService>(
ServiceType.VERIFIABLE_LOGGING
)
.generateAttestation(verifiableLogQuery);

res.json({
success: true,
message: "Successfully get Attestation",
data: pageQuery,
});
} catch (error) {
elizaLogger.error("Detailed error:", error);
res.status(500).json({
error: "Failed to Get Attestation",
details: error.message,
stack: error.stack,
});
}
}
);
router.post(
"/verifiable/logs",
async (req: express.Request, res: express.Response) => {
try {
const query = req.body.query || {};
const page = parseInt(req.body.page) || 1;
const pageSize = parseInt(req.body.pageSize) || 10;

const verifiableLogQuery: VerifiableLogQuery = {
idEq: query.idEq || "",
agentIdEq: query.agentIdEq || "",
roomIdEq: query.roomIdEq || "",
userIdEq: query.userIdEq || "",
typeEq: query.typeEq || "",
contLike: query.contLike || "",
signatureEq: query.signatureEq || "",
};
const agentRuntime: AgentRuntime | undefined = agents.values().next().value;
const pageQuery = await agentRuntime
.getService<VerifiableLogService>(
ServiceType.VERIFIABLE_LOGGING
)
.pageQueryLogs(verifiableLogQuery, page, pageSize);

res.json({
success: true,
message: "Successfully retrieved logs",
data: pageQuery,
});
} catch (error) {
elizaLogger.error("Detailed error:", error);
res.status(500).json({
error: "Failed to Get Verifiable Logs",
details: error.message,
stack: error.stack,
});
}
}
);

return router;
}
1 change: 1 addition & 0 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1428,6 +1428,7 @@ export enum ServiceType {
AWS_S3 = "aws_s3",
BUTTPLUG = "buttplug",
SLACK = "slack",
VERIFIABLE_LOGGING = "verifiable_logging",
IRYS = "irys",
TEE_LOG = "tee_log",
GOPLUS_SECURITY = "goplus_security",
Expand Down
6 changes: 6 additions & 0 deletions packages/plugin-tee-verifiable-log/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
*

!dist/**
!package.json
!readme.md
!tsup.config.ts
Loading

0 comments on commit d5a56c9

Please sign in to comment.