ecrecover 不返回發件人的地址
我試圖了解橢圓曲線是如何工作的,以及當我嘗試獲取此交易的發件人時:https ://etherscan.io/tx/0x14a298c1eea89f42285948b7d51eeac2876ca7406c9784b9b90dd3591d156d64(劇透發件人地址是:0x8d900bfa23553548a3957f555503048a395759999)我遵循這個老問題的答案:Hash of the transaction VS Transaction Hash or Transaction ID。我使用的 ecrecover 函式是 pyethereum.utils.ecrecover_to_pub。
但是當我嘗試恢復地址時,我無法獲取發件人地址。
我使用的函式是:
hash = HexBytes('0xa4060d01d4add248db470b4121616cbe5b2015daf328809000ec9a1d0954d649') ecrecover_to_pub(hash, 27, 0x067940651530790861714b2e8fd8b080361d1ada048189000c07a66848afde46, 0x69b041db7c29dbcc6becf42017ca7ac086b12bd53ec8ee494596f790fb6a0a69).hex()[-40:]
結果地址是 0xd124db72eff486dad933df8cc5ec97acb26144ae我想我已經設置了 v, r, s 正確,因為我得到了 v, r, s 使用
web3.eth.getTransaction('0x14a298c1eea89f42285948b7d51eeac2876ca7406c9784b9b90dd3591d156d64')
。結果函式中的 v, r, s 是:
37, 0x067940651530790861714b2e8fd8b080361d1ada048189000c07a66848afde46, 0x69b041db7c29dbcc6becf42017ca7ac086b12bd53ec8ee494596f790fb6a0a69
您不應該將 37 而不是 27 作為 v 的值發送到 ecrecover_to_pub 嗎?
編輯:更新答案,因為在評論中程式碼不可讀
Solidity 中的簡單合約返回正確的地址:
contract ECRecover { function ECR(bytes32 _Msg, uint8 _v, bytes32 _r, bytes32 _s) public pure returns (address) { return ecrecover(_Msg, _v, _r, _s); } }
所以問題出在python程式碼上……來自文件:
ecrecover_to_pub(hash, v, r, s) - 將生成簽名的公鑰恢復為 encode_int32(x) + encode_int32(y) 的 64 字節二進制 blob。對此進行散列並取最後 20 個字節給出了對消息進行簽名的地址。
在獲取最後 20 個字節之前,您似乎沒有對結果進行散列,所以它應該是:
sha3(ecrecover_to_pub(hash, 27, 0x067940651530790861714b2e8fd8b080361d1ada048189000c07a66848afde46, 0x69b041db7c29dbcc6becf42017ca7ac086b12bd53ec8ee494596f790fb6a0a69).hex())[-40:]