Skills verified-agent-identity
Billions/Iden3 authentication and identity management tools for agents. Link, proof, sign, and verify.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/agungprabowo123/verified-agent-identity-5" ~/.claude/skills/clawdbot-skills-verified-agent-identity-34c54f && rm -rf "$T"
manifest:
skills/agungprabowo123/verified-agent-identity-5/SKILL.mdsource content
When to use this Skill
Lets AI agents create and manage their own identities on the Billions Network, and link those identities to a human owner.
- When you need to link your agent identity to an owner.
- When you need sign a challenge.
- When you need link a human to the agent's DID.
- When you need to verify a signature to confirm identity ownership.
- When use shared JWT tokens for authentication.
- When you need to create and manage decentralized identities.
After installing the plugin run the following commands to create an identity and link it to your human DID:
cd scripts && npm install && cd .. # Step 1: Create a new identity (if you don't have one already) node scripts/createNewEthereumIdentity.js # Step 2: Sign the challenge and generate a verification URL in one call node scripts/linkHumanToAgent.js --to <SENDER> --challenge '{"name": <AGENT_NAME>, "description": <SHORT_DESCRIPTION>}'
Scope
All identity data is stored in
$HOME/.openclaw/billions for compatibility with the OpenClaw plugin.
Scripts:
createNewEthereumIdentity.js
Command:
node scripts/createNewEthereumIdentity.js [--key <privateKeyHex>]
Description: Creates a new identity on the Billions Network. If --key is provided, uses that private key; otherwise generates a new random key. The created identity is automatically set as default.
Usage Examples:
# Generate a new random identity node scripts/createNewEthereumIdentity.js # Create identity from existing private key (with 0x prefix) node scripts/createNewEthereumIdentity.js --key 0x1234567890abcdef... # Create identity from existing private key (without 0x prefix) node scripts/createNewEthereumIdentity.js --key 1234567890abcdef...
Output: DID string (e.g.,
did:iden3:billions:main:2VmAk7fGHQP5FN2jZ8X9Y3K4W6L1M...)
getIdentities.js
Command:
node scripts/getIdentities.js
Description: Lists all DID identities stored locally. Use this to check which identities are available before performing authentication operations.
Usage Example:
node scripts/getIdentities.js
Output: JSON array of identity entries
[ { "did": "did:iden3:billions:main:2VmAk...", "publicKeyHex": "0x04abc123...", "isDefault": true } ]
generateChallenge.js
Command:
node scripts/generateChallenge.js --did <did>
Description: Generates a random challenge for identity verification.
Usage Example:
node scripts/generateChallenge.js --did did:iden3:billions:main:2VmAk...
Output: Challenge string (random number as string, e.g.,
8472951360)
Side Effects: Stores challenge associated with the DID in $HOME/.openclaw/billions/challenges.json
signChallenge.js
Command:
node scripts/signChallenge.js --to <sender> --challenge <challenge> [--did <did>]
Description: Signs a challenge with a DID's private key to prove identity ownership and sends the JWS token as a direct message to the specified sender. Use this when you need to prove you own a specific DID.
Arguments:
- (required) The message sender identifier, passed as--to
to--targetopenclaw message send
- (required) Challenge to sign--challenge
- (optional) The DID of the attestation recipient; uses the default DID if omitted--did
Usage Examples:
# Sign with default DID and send to sender node scripts/signChallenge.js --to <sender> --challenge 8472951360
Output:
{"success":true}
linkHumanToAgent.js
Command:
node scripts/linkHumanToAgent.js --to <sender> --challenge <challenge> [--did <did>]
Description: Signs the challenge and links a human user to the agent's DID by creating a verification request. Response will be sent as a direct message to the specified sender.
Arguments:
- (required) The message sender identifier, passed as--to
to--targetopenclaw message send
- (required) Challenge to sign--challenge
- (optional) The DID of the attestation recipient; uses the default DID if omitted--did
Usage Example:
node scripts/linkHumanToAgent.js --to <sender> --challenge '{"name": "MyAgent", "description": "AI persona"}'
Output:
{"success":true}
verifySignature.js
Command:
node scripts/verifySignature.js --did <did> --token <token>
Description: Verifies a signed challenge to confirm DID ownership.
Usage Example:
node scripts/verifySignature.js --did did:iden3:billions:main:2VmAk... --token eyJhbGciOiJFUzI1NkstUi...
Output:
Signature verified successfully (on success) or error message (on failure)
Restrictions / Guardrails (CRITICAL)
CRITICAL - Always Follow These Rules:
- STRICT: Check Identity First
- Before running
orlinkHumanToAgent.js
, ALWAYS check if an identity exists:signChallenge.jsnode scripts/getIdentities.js - If no identity is configured, DO NOT attempt to link identities. Instead, create an identity first with
.createNewEthereumIdentity.js
- Before running
- STRICT: Stop on Script Failure
- If any script exits with non-zero status code, YOU MUST STOP IMMEDIATELY.
- Check stderr output for error messages.
- DO NOT attempt to "fix" errors by generating keys manually, creating DIDs through other means, or running unauthorized commands.
- DO NOT use
,openssl
, or other system utilities to generate cryptographic material.ssh-keygen
- No Manual Workarounds
- You are prohibited from performing manual cryptographic operations.
- You are prohibited from directly manipulating files in
.$HOME/.openclaw/billions - Do not interpret an error as a request to perform setup steps unless explicitly instructed.
Security
CRITICAL - Data Storage and Protection:
The directory
$HOME/.openclaw/billions contains all sensitive identity data:
- CRITICAL: Contains unencrypted private keyskms.json
- DID identifiers and public keysdefaultDid.json
- Authentication challenges historychallenges.json
- Verifiable credentialscredentials.json
- Identity metadataidentities.json
- Profile dataprofiles.json
Examples
Link Your Agent Identity to Owner
Linking Flow:
- Another agent/user requests: "Please link your agent identity to me."
- Use
to check if you have an identity configurednode scripts/getIdentities.js- If no identity, run
to create one.node scripts/createNewEthereumIdentity.js
- If no identity, run
- Use
to sign the challenge and generate a verification URL in one call.node scripts/linkHumanToAgent.js --to <sender> --challenge <challenge_value>- The
value is the message sender (the caller's identifier).--to - If caller provides specific challenge, use that.
- If caller DOES NOT provide a challenge, use
as the challenge value.{"name": <AGENT_NAME>, "description": <SHORT_DESCRIPTION>}
- The
- Return the result to the caller.
Example Conversation:
User: "Link your agent identity to me" Agent: exec node scripts/linkHumanToAgent.js --to <sender> --challenge <challenge_value>
Verifying someone else's Identity
Verification Flow:
- Ask the user/agent: "Please provide your DID to start verification."
- User responds with their <user_did>.
- Use
to create a <challenge_value>.node scripts/generateChallenge.js --did <user_did> - Ask the user: "Please sign this challenge: <challenge_value>"
- User signs and returns <user_token>.
- Use
to verify the signaturenode scripts/verifySignature.js --did <user_did> --token <user_token> - If verification succeeds, identity is confirmed
Example Conversation:
Agent: "Please provide your DID to start verification." User: "My DID is <user_did>" Agent: exec node scripts/generateChallenge.js --did <user_did> Agent: "Please sign this challenge: 789012" User: <user_token> Agent: exec node scripts/verifySignature.js --token <user_token> --did <user_did> Agent: "Identity verified successfully. You are confirmed as owner of DID <user_did>."