Caloogy Article
中文

Blind Signing and "What You See Is What You Sign"

Date
Jul 25, 2025
Series
Wallet
Reading
4 min
Topics
Blind signingEip 712PermitPermit2

The one-sentence version

Signing is the only "authorization" action in the cryptocurrency world: once the private key signs, the chain recognizes it. Therefore, the most important question before signing is: What exactly am I signing? "Blind signing" is signing a string of data that you cannot understand, which is equivalent to signing a blank check. The most prevalent theft method today, Permit / Permit2 signature phishing, involves tricking users into thinking they are "logging in" or "claiming an airdrop," when in reality, they are signing "permission for someone to transfer my tokens." The core principle of defense is called What You See Is What You Sign: a wallet must be able to fully decode the signature content and present it in human-readable terms; if it cannot be decoded, it should not be signed.

This article has three layers:

  1. Layer 1: The Intuition: Blank checks
  2. Layer 2: Real-World Use: Permit phishing, the Bybit incident, and "clear signing" in hardware wallets
  3. Layer 3: eth_sign, personal_sign, EIP-712, and the structure of Permit

Layer 1: The Intuition

1.1 Blank Checks

Someone hands you a piece of paper with a string of gibberish on it: "0x8f3a...e21c, please sign to confirm." You sign it.

Later, you find out that this gibberish translates to: "I hereby agree to grant the transfer rights of all USDC in my account to 0xBad... ."

This is blind signing. The signing algorithm itself has no issues; the problem is that you do not know what you are signing.

1.2 Why Off-chain Signatures Are More Dangerous

Many people assume that "as long as you don't send a transaction or spend gas, there is no risk." However, there is a type of signature that is off-chain and costs nothing, yet can be taken by others and executed on-chain:

Throughout this entire process, no transaction request ever appeared in your wallet; there was only a single "signature."


Layer 2: Real-World Use


Layer 3: Principles and Engineering

3.1 Ethereum's Various Signing Methods

Method What is being signed Risk
eth_sign Any 32-byte hash Highest: This hash could be the hash of a transaction, which the user cannot identify at all. Mainstream wallets have disabled this by default.
personal_sign A message with a fixed prefix "\x19Ethereum Signed Message:\n" + length The prefix ensures it cannot be a transaction. It is safe when signing readable text; it remains blind signing when signing raw hexadecimal.
eth_signTypedData_v4 (EIP-712) Structured data with a domain (app name, chain ID, contract address) Wallets can parse and display it, but the user must actually understand it.
eth_sendTransaction A transaction The wallet will display the to, value, and data, but the data requires decoding.

3.2 The Structure of EIP-712

{
  "domain": { "name": "USD Coin", "version": "2", "chainId": 1,
              "verifyingContract": "0xA0b8...eB48" },
  "primaryType": "Permit",
  "message": {
    "owner":   "0xYourAddress",
    "spender": "0xAttackerAddress",
    "value":   "115792089237316195423570985008687907853269984665640564039457584007913129639935",
    "nonce":   0,
    "deadline": 1893456000
  }
}

Translated into human language: "I allow 0xAttackerAddress to spend all my USDC from now until January 1, 2030."

In this case, the astronomical number value is 2256−12^{256} - 1, meaning "unlimited allowance" (see "Unlimited Allowance"). Once signed, anyone can submit this signature to the USDC contract's permit function, and the authorization will be recorded on-chain; subsequently, the spender can call transferFrom to transfer the funds.

3.3 Permit2

Permit2, introduced by Uniswap, is a universal authorization contract: a user first performs an on-chain authorization (usually unlimited) for Permit2, and thereafter, various applications only need the user's signature to move the tokens. This provides a better user experience, but it also means: a single fraudulent signature can move all the tokens you have authorized to Permit2.

3.4 Engineering Principles of "What You See Is What You Sign"

  1. Do not support eth_sign, and do not use personal_sign for raw hexadecimal;
  2. Only sign content that can be fully decoded: transaction calldata must parse out the function name and parameters; EIP-712 must identify the spender, allowance, and expiration;
  3. If it cannot be decoded, reject it, rather than "displaying raw data for the user to judge themselves" (see "Fail-closed");
  4. Display the most prominent warning for authorization-type signatures: "This is equivalent to giving your assets to X";
  5. Signature requests must be triggered directly by a user's click; they must never pop up automatically when a page loads;
  6. For multi-sig wallets, the signer must be able to decode the transaction independently of the webpage (on the hardware wallet screen or using another tool), such as checking whether the operation field is a dangerous delegatecall.

Summary

Layer Key points
Intuition Blind signing = Signing a blank check
Reality Off-chain signatures cost no gas, yet can be used to transfer assets on-chain
Technology Disable eth_sign; EIP-712 is parsable, but users must still understand the spender and allowance
Principle What You See Is What You Sign: If it cannot be decoded, do not sign; hardware wallets must display clearly