Форма вызова: personal_sign с параметрами [message, address], где сообщение — байты в шестнадцатеричной кодировке (большинство кошельков принимает и текст в UTF-8). Библиотеки повторяют этот вызов: signer.signMessage в ethers, signMessage в viem, encode_defunct в web3.py. Более старый eth_sign подписывал произвольный 32-байтный хеш без префикса, из-за чего децентрализованные приложения (dapps) могли обманом заставить пользователя подписать транзакцию; большинство кошельков отключает этот метод или предупреждает о нём.
При проверке хеш Keccak-256 с префиксом вычисляется заново и по подписи восстанавливается адрес, а для смарт-кошельков вызывается isValidSignature из ERC-1271 (для ещё не развёрнутых аккаунтов — в обёртке ERC-6492). Так подписываются сообщения Sign-In with Ethereum.