Signature
簽名簡訊應該使用“x19Ethereum 簽名消息”前綴嗎?
背景:我想在 Trezor 中實現簽名消息功能。
是否有簽署簡訊的標準?
到目前為止,我發現 etherscan.io 對不帶前綴的消息進行簽名,即它簽名
keccak(msg)
,但也接受“帶有 Geth 前綴”的簽名keccak("\x19Ethereum Signed Message\n32"+keccak(msg))
。keccak("\x19Ethereum Signed Message\n"+strlen(msg)+msg)
不接受表格的簽名消息。MyEtherWallet 只接受沒有任何前綴的簽名消息。
但是,如果沒有前綴,則可能會濫用簽名消息功能來簽署交易。這是故意的嗎?
沒有官方標準(在撰寫本文時),並且在這個 EIP 執行緒EIP #683中已經討論了一段時間
根據問題 #3731:
Geth
\x19Ethereum Signed Message:\n<length of message>
在簽名之前將字元串添加到所有數據中(https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign)。如果您想從 Solidity 驗證這樣的簽名,則必須在進行 ecrecovery 之前在solidity 中添加相同的字元串。有關的
我認為在簽名時始終使用相同的前綴並不省事。例如,如果您已多次部署智能合約,則可以在每個實例上重放簽名。您應該始終使用自定義前綴,並在簽名之前將合約地址添加到散列中。對於 javascript,您可以使用eth-crypto使用自定義前綴對標誌進行簽名,如教程中所述。