{"id":"EIP-191","name":"Signed Data Standard","status":"Final","chain":"both","category":{"id":"security","name":"Security & Trust","description":"Helping users verify, control, and protect their assets"},"journeyStages":[{"id":"authentication","name":"Authentication & Identity","description":"Proving who you are and logging in"}],"uxImpact":"Users sign off-chain messages to authorize actions without gas — login, approve listings, multisig confirmations. Design implications: show clear 'Sign Message' vs 'Approve Transaction' distinction, display human-readable message content before signing, indicate which dApp/contract will validate the signature. Design decisions: balance security warnings (phishing risk) against friction — too many warnings cause blindness, too few enable exploits.","hasDetailedContent":true,"content":{"id":"EIP-191","summary":"EIP-191 standardizes how messages are signed by wallets, adding a prefix that prevents signed messages from being replayed as transactions. This is the foundation of \"Sign-In with Ethereum\" and all safe off-chain signing.","applicability":{"whenToUse":["Your product addresses: signed messages could be replayed as transactions.","Your product addresses: no standard format for signed data.","The flow should deliver: prefix \"\\x19Ethereum Signed Message:\" makes it invalid as a transaction.","You are designing a personal message signing experience with visible states and recovery paths."],"whenToAvoid":["Always show human-readable message with clear purpose.","Include timestamp and/or nonce, enforce expiration.","Wallet should warn if message looks like encoded function call.","Wrong-address or approval mistakes are not recoverable in your product context."]},"designerTakeaways":["You can design UI that delivers prefix \"\\x19Ethereum Signed Message:\" makes it invalid as a transaction.","You can standard prefix + version byte = consistent.","You can design UI that delivers version byte indicates: personal message."],"problemsSolved":[{"problem":"Signed messages could be replayed as transactions","oldWay":"Sign a message, attacker replays it as a transaction draining funds","newWay":"Prefix \"\\x19Ethereum Signed Message:\" makes it invalid as a transaction","impact":"critical"},{"problem":"No standard format for signed data","oldWay":"Each app invented own signing format, security varied wildly","newWay":"Standard prefix + version byte = consistent, auditable signing","impact":"high"},{"problem":"Can't verify what type of signature it is","oldWay":"Raw signature could be anything, hard to validate","newWay":"Version byte indicates: personal message, typed data, or validator","impact":"high"},{"problem":"Signing requests look the same regardless of purpose","oldWay":"User signs hex blob, no idea if it's login or permission grant","newWay":"Different prefixes enable different wallet UI treatments","impact":"medium"},{"problem":"Cross-protocol signature collision","oldWay":"Signature for App A might be valid for unrelated use in App B","newWay":"Version 0x45 includes validator address for protocol-specific signing","impact":"medium"}],"uxPatterns":[{"name":"Personal Message Signing","description":"Standard wallet UI for human-readable message signing","mockup":"concept/typed-data","userFlow":["dApp calls personal_sign with message","Wallet shows readable message content","User reads and understands what they're signing","User clicks Sign","Wallet prepends EIP-191 prefix and signs","Signature returned to dApp"]},{"name":"Login Signature","description":"Sign-in authentication flow","mockup":"concept/siwe-sign-in","userFlow":["User clicks \"Connect\" or \"Sign In\"","Wallet explains what signature does and doesn't do","User understands this is just authentication","User signs","Backend verifies signature, creates session"]},{"name":"Proof of Ownership","description":"Verify wallet ownership for external systems","mockup":"concept/typed-data","userFlow":["External service needs wallet verification","Presents message with context (what, why)","User understands linking purpose","User signs message","Service verifies signature, grants access"]},{"name":"Dangerous Signature Warning","description":"Wallet warns about suspicious signing requests","mockup":"concept/typed-data","userFlow":["Suspicious site requests signature","Wallet detects non-readable content","Shows warning about potential attack","User encouraged to reject","If user proceeds, extra confirmation required"]}],"uiComponents":[{"name":"MessageDisplay","description":"Render signed message content","states":["readable","hex","mixed","suspicious"],"props":["message","encoding","maxLength","expanded"]},{"name":"SignatureTypeIndicator","description":"Show what type of signature this is","states":["personal","typed","login","unknown"],"props":["type","version","tooltip"]},{"name":"OriginBadge","description":"Show requesting site with trust level","states":["trusted","unknown","suspicious","known-malicious"],"props":["origin","trustLevel","previousInteractions"]},{"name":"ScopeExplainer","description":"Explain what signature grants and doesn't grant","states":["collapsed","expanded"],"props":["grants[]","doesNotGrant[]","expiresAt"]},{"name":"NonceDisplay","description":"Show nonce/timestamp for replay protection","states":["valid","expired","missing"],"props":["nonce","timestamp","expiresAt"]}],"antiPatterns":[{"pattern":"Asking users to sign raw hex data","why":"Users can't verify what they're signing, easy to trick them","instead":"Always show human-readable message with clear purpose","severity":"critical"},{"pattern":"No timestamp or nonce in signed messages","why":"Signature can be replayed indefinitely","instead":"Include timestamp and/or nonce, enforce expiration","severity":"critical"},{"pattern":"Signing messages that look like transaction data","why":"Could be tricking user into signing malicious permit/approval","instead":"Wallet should warn if message looks like encoded function call","severity":"critical"},{"pattern":"Not explaining what signing does vs doesn't do","why":"Users fear any signature might drain their wallet","instead":"Clearly state \"This will NOT approve transactions or spend funds\"","severity":"high"},{"pattern":"Same UI for login signatures and permits","why":"Permit signatures ARE dangerous, login signatures are safe","instead":"Use EIP-712 for permits with different, scarier UI","severity":"high"},{"pattern":"Not showing the requesting origin","why":"Phishing sites can pretend to be legitimate","instead":"Always show full URL of requesting site prominently","severity":"high"}],"onMonad":[{"aspect":"Signature Format","ethereum":"EIP-191 is chain-agnostic, works everywhere","monad":"Same EIP-191 format, full compatibility","designImplication":"No changes needed for basic signing on Monad"},{"aspect":"Verification Speed","ethereum":"Signature verification is fast (off-chain)","monad":"On-chain verification also fast due to precompiles","designImplication":"Can do on-chain sig verification without UX penalty"},{"aspect":"Domain Binding","ethereum":"Messages should include chain ID for multi-chain apps","monad":"Include Monad chain ID when signature is chain-specific","designImplication":"Multi-chain apps need chain-aware message formats"},{"aspect":"Smart Wallet Signing","ethereum":"EIP-191 works with ERC-1271 for smart wallets","monad":"Same compatibility, verify via isValidSignature()","designImplication":"Support both EOA and smart wallet signatures"}],"keyTakeaways":["EIP-191 prefix prevents message-to-transaction replay attacks","Always show human-readable message content","Include timestamp/nonce for replay protection","Clearly explain what signing does and doesn't do","Warn loudly about hex/encoded messages"],"technicalNotes":"EIP-191 format: 0x19 <version> <data>. Version 0x01 = structured data (EIP-712). Version 0x00 = validator address + data. Version 0x45 (E) = personal_sign with \"Ethereum Signed Message:\\n\" + length + message. The 0x19 byte is invalid as transaction start, preventing replay."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-191","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-191","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-191","markdown":"https://www.eipsfordesigners.com/standards/EIP-191/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-191/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-191","official":"https://eips.ethereum.org/EIPS/eip-191","discussion":"https://ethereum-magicians.org/search?q=EIP-191"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}