署名されるデータは 0x19 ‖ version ‖ version-specific data ‖ data です。バージョンは 0x00(想定するバリデーターのアドレスを伴うデータ)、0x01(構造化データ、つまり EIP-712)、そして personal_sign 用の 0x45(文字 E)です。この形式では、0x19 に続けて Ethereum Signed Message: と改行、10 進数の ASCII で表したメッセージ長、メッセージ本体を並べます。RLP エンコードされたトランザクションが 0x19 で始まることはなく、これがこのプレフィックスの目的です。
ウォレットはこれを Keccak-256 でハッシュし、secp256k1 で署名します。署名は 65 バイトの r ‖ s ‖ v で、v は 27 または 28 です。メッセージ hello のダイジェストは 0x50b2c43fd39106bafbba0da34fc430e1f91e3c96ea2acee2bc34119f92b37750 です。検証者は ecrecover(またはライブラリの verifyMessage)でアドレスを復元して比較します。スマートアカウントでは、代わりに ERC-1271 が必要です。
personal_sign はユーザーに意味の読み取りにくいテキストを見せるだけで、ドメインやチェーンへの紐付けもありません。そのため、アプリケーションはそれらをメッセージに含める(Sign-In with Ethereum はそうしています)か、構造や価値を伴うものには EIP-712 を優先して使うべきです。