-
-
Save dcb9/385631846097e1f59e3cba3b1d42f3ed to your computer and use it in GitHub Desktop.
package main | |
import ( | |
"fmt" | |
"github.com/ethereum/go-ethereum/accounts" | |
"github.com/ethereum/go-ethereum/common/hexutil" | |
"github.com/ethereum/go-ethereum/crypto" | |
) | |
func main() { | |
fmt.Println(verifySig( | |
"0x0EaE3eF6CC7176553E6B45d94e9eFDE2Da7B82a5", | |
"0x34850b7e36e635783df0563c7202c3ac776df59db5015d2b6f0add33955bb5c43ce35efb5ce695a243bc4c5dc4298db40cd765f3ea5612d2d57da1e4933b2f201b", | |
[]byte("Example `personal_sign` message"), | |
)) | |
} | |
func verifySig(from, sigHex string, msg []byte) bool { | |
sig := hexutil.MustDecode(sigHex) | |
msg = accounts.TextHash(msg) | |
if sig[crypto.RecoveryIDOffset] == 27 || sig[crypto.RecoveryIDOffset] == 28 { | |
sig[crypto.RecoveryIDOffset] -= 27 // Transform yellow paper V from 27/28 to 0/1 | |
} | |
recovered, err := crypto.SigToPub(msg, sig) | |
if err != nil { | |
return false | |
} | |
recoveredAddr := crypto.PubkeyToAddress(*recovered) | |
return from == recoveredAddr.Hex() | |
} |
Good! helped me a lot!
Do you have any examples on generating the signature?
Helped a lot cheers !
Works fine but I need to replace
sig[crypto.RecoveryIDOffset] -= 27 // Transform yellow paper V from 27/28 to 0/1
with
if sig[crypto.RecoveryIDOffset] == 27 || sig[crypto.RecoveryIDOffset] == 28 {
sig[crypto.RecoveryIDOffset] -= 27 // Transform yellow paper V from 27/28 to 0/1
}
Amazing! Worked on the first go!
OMG You're the absolute life saver! Thanks a lot! Spent up all night long but couldn't find the right answer until seeing this post!
In our case, the last line had a bug, in which it needs the address to be lower cased, otherwise the comparison fails. Fix this bug lowering the case of the right parameter, like this:
return from == strings.ToLower(recoveredAddress.Hex())
+1
@psmithson
in that case you should use something like
return strings.ToLower(from) == strings.ToLower(recoveredAddress.Hex())
@psmithson in that case you should use something like
return strings.ToLower(from) == strings.ToLower(recoveredAddress.Hex())
or even better
return strings.EqualFold(from, recoveredAddr.Hex())
Very helpful!
here's another example:
https://github.com/verity-team/dws/blob/main/internal/delphi/server/server.go#L127
Sign in with Ethereum - frontend
https://docs.metamask.io/wallet/how-to/sign-data/siwe/
Signature checker in backend with go-ethereum with this code.
@valterlobo Very useful, thanks for sharing
It works! Thanks!