6.0 KiB
Gasless Transactions Setup
This document explains how to set up and use gasless transactions with the Web Crypto API blockchain integration.
Overview
Gasless transactions allow users to execute blockchain transactions without paying gas fees. Instead, a relayer service pays for the gas on behalf of users.
Architecture
- User signs transaction with Web Crypto API (P-256)
- Relayer service receives the signed transaction request
- Relayer verifies the signature matches the user's Web Crypto public key
- Relayer submits the transaction to the blockchain and pays gas
- Transaction executes through the proxy contract
Components
1. Relayer Service (worker/blockchainRelayer.ts)
A Cloudflare Worker that:
- Accepts signed transaction requests via HTTP POST
- Verifies Web Crypto API signatures (P-256)
- Submits transactions to the blockchain
- Pays for gas fees
2. Client Relayer Library (src/lib/blockchain/relayer.ts)
Client-side utilities for:
- Submitting transactions to the relayer
- Checking relayer availability
- Managing relayer configuration
3. Transaction Builder (src/components/blockchain/TransactionBuilder.tsx)
UI component with option to use gasless transactions via checkbox.
Setup
Step 1: Deploy Relayer Worker
- Add the relayer worker to your
wrangler.toml:
[[workers]]
name = "blockchain-relayer"
route = "/relayer/*"
- Set up the relayer private key as a Cloudflare Workers secret:
wrangler secret put RELAYER_PRIVATE_KEY
# Enter your relayer wallet's private key (0x...)
⚠️ Security Warning: The relayer private key must be kept secure. It will be used to pay for all gas fees.
Step 2: Fund Relayer Wallet
The relayer wallet needs ETH to pay for gas:
- For mainnet: Send ETH to the relayer address
- For testnets: Get testnet ETH from faucets
Step 3: Configure Relayer URL
In your application, configure the relayer URL for each chain:
import { setRelayerConfig } from './lib/blockchain/relayer';
// Set relayer URL for a chain
setRelayerConfig(1, 'https://your-worker.workers.dev/relayer'); // Mainnet
setRelayerConfig(11155111, 'https://your-worker.workers.dev/relayer'); // Sepolia
Or set it in relayer.ts:
const relayerUrls: Record<number, string> = {
1: 'https://your-worker.workers.dev/relayer',
11155111: 'https://your-worker.workers.dev/relayer',
};
Step 4: Update Worker Routes
Add the relayer route to your main worker or deploy it as a separate worker:
// In your main worker.ts
if (url.pathname.startsWith('/relayer')) {
return await blockchainRelayer.fetch(request, env);
}
Usage
For Users
- Build a transaction in the Transaction Builder component
- Check the "Use gasless transaction" checkbox
- Sign with Web Crypto API
- Transaction is submitted to relayer (no wallet confirmation needed)
- Relayer pays for gas and submits transaction
For Developers
import { submitToRelayer, getRelayerConfig } from './lib/blockchain/relayer';
// Check if relayer is available
const relayerConfig = getRelayerConfig(chainId);
if (relayerConfig) {
// Submit to relayer
const result = await submitToRelayer(relayerConfig, {
authorization: signedAuthorization,
signature: signature,
proxyContractAddress: proxyAddress,
chainId: chainId,
});
if (result.success) {
console.log('Transaction hash:', result.transactionHash);
}
}
Security Considerations
1. Relayer Private Key Security
- Store private key as Cloudflare Workers secret (never in code)
- Use a dedicated wallet with limited funds
- Monitor relayer wallet balance
- Set up alerts for low balance
2. Signature Verification
- The relayer must verify Web Crypto P-256 signatures
- Currently, this verification happens in the proxy contract
- Consider adding additional verification in the relayer for early rejection
3. Rate Limiting
- Implement rate limiting to prevent abuse
- Limit transactions per user/IP
- Set maximum gas limits per transaction
4. Nonce Management
- Ensure nonces are properly managed to prevent replay attacks
- The proxy contract handles nonce checking, but relayer should also validate
5. Deadline Enforcement
- Relayer should check transaction deadlines before submission
- Reject expired transactions
Cost Management
Monitoring
- Track gas costs per transaction
- Monitor relayer wallet balance
- Set up automatic refilling if balance is low
Limits
- Set maximum gas price limits
- Set maximum transaction value limits
- Implement daily/monthly spending limits
Funding
- Consider using a paymaster contract (e.g., Pimlico, Alchemy) for more sophisticated gas management
- Implement user deposits if needed
- Consider subscription models for gasless transactions
Alternative: Paymaster Contracts
Instead of a relayer service, you could use paymaster contracts:
- ERC-4337 Account Abstraction: Use a paymaster contract that sponsors transactions
- Pimlico: Third-party paymaster service
- Alchemy Gas Manager: Gas sponsorship service
These services handle gas payment on-chain rather than through a relayer.
Troubleshooting
Relayer Not Available
- Check relayer URL configuration
- Verify relayer worker is deployed
- Check relayer health endpoint:
GET /relayer/health
Transaction Fails
- Check relayer wallet has sufficient balance
- Verify signature is valid
- Check transaction deadline hasn't expired
- Verify proxy contract is deployed
High Gas Costs
- Monitor gas prices
- Consider using Layer 2 networks (lower gas)
- Implement gas price limits
- Use EIP-1559 for better gas estimation
Future Enhancements
- Implement paymaster contract integration
- Add user deposit system for gasless transactions
- Implement rate limiting and abuse prevention
- Add gas price monitoring and limits
- Support for multiple relayer endpoints (load balancing)
- Transaction batching for efficiency
- Support for Layer 2 networks (Arbitrum, Optimism, etc.)