let unsignedDataForMykeyUID = "\x19Ethereum Signed Message:\n" + messageForMykeyUID.length + messageForMykeyUID
packagemainimport("encoding/hex""fmt""github.com/ethereum/go-ethereum/common""github.com/ethereum/go-ethereum/common/hexutil""github.com/ethereum/go-ethereum/crypto""log""strings""testing")const(signFormat="\x19Ethereum Signed Message:\n%d%s")funcTestVerifty(t*testing.T){ETHPrv:="87f9bc3c6cd57f18a0143b6863d6b47d6364f1a1ba86eae0ce411097704d5d0d"ETHAdd:="0x296Fd341F90508B6742701F4341D2027CdF5c86d"//unsigned datadata:="0x1234"prvKey,_:=hex.DecodeString(ETHPrv)sig,_:=SignWithEthWeb3(data,prvKey)log.Println("sig:",sig)unsignDataHashByte:=crypto.Keccak256Hash(common.FromHex(data)).Bytes()// verify signature at server backendlog.Println("verify sign:",verifySig(strings.ToLower(ETHAdd),sig,unsignDataHashByte))}funcSignWithEthWeb3(unsignDatastring,privateByte[]byte)(signaturestring,errerror){// need to Hash firstunsignDataHashByte:=crypto.Keccak256Hash(common.FromHex(unsignData)).Bytes()returnSignWithEth(unsignDataHashByte,privateByte)}funcSignWithEth(unsignData,privateKeyByte[]byte)(signaturestring,errerror){// web3 signature need hash with salt, then sign the hashed datanewUnsignData:=fmt.Sprintf(signFormat,len(unsignData),unsignData)unsignDataHash:=crypto.Keccak256([]byte(newUnsignData))key,err:=crypto.ToECDSA(privateKeyByte)iferr!=nil{log.Println("sign ToECDSA err:",err.Error())return"",err}signatureByte,err:=crypto.Sign(unsignDataHash,key)iferr!=nil{log.Println("sign Sign err:",err.Error())return"",err}signatureByte[64]+=27returnhexutil.Encode(signatureByte),nil}// verify signaturefuncverifySig(from,sigHexstring,msg[]byte)bool{fromAddr:=common.HexToAddress(from)sig:=hexutil.MustDecode(sigHex)ifsig[64]!=1&&sig[64]!=0&&sig[64]!=27&&sig[64]!=28{log.Println("in hexutil.MustDecode error.")returnfalse}ifsig[64]!=1&&sig[64]!=0{sig[64]-=27}pubKey,err:=crypto.SigToPub(createSignHash(msg),sig)iferr!=nil{log.Println("in crypto.SigToPub error:",err.Error())returnfalse}recoveredAddr:=crypto.PubkeyToAddress(*pubKey)log.Println("recoveredAddr:",recoveredAddr.String())returnfromAddr==recoveredAddr}// generate hashed data for signingfunccreateSignHash(data[]byte)[]byte{msg:=fmt.Sprintf(signFormat,len(data),data)returncrypto.Keccak256([]byte(msg))}