func ( a * Account )  Sign ( message [ ] byte )  ( [ ] byte ,  error)  { hash : =  crypto.  Keccak256Hash( message) signature,  err : =  crypto.  Sign( hash.  Bytes( ) ,  a. privateKeyECDSA) if  err !=  nil { log.  Fatal( err) } signMsg : =  [ ] byte ( hexutil.  Encode( signature) ) return  signMsg,  err
} 
func ( a * Account )  VerifySign ( signatureHex,  message string)  ( bool,  error)  { signature,  err : =  hexutil.  Decode( signatureHex) if  err !=  nil { return  false ,  errors.  New( "签名后的数据解析异常" ) } newHash : =  crypto.  Keccak256Hash( [ ] byte ( message) ) if  signature[ 64 ]  >  30  { signature[ 64 ]  -=  31 }  else  { signature[ 64 ]  -=  27 } sigPublicKeyECDSA,  err : =  crypto.  SigToPub( newHash.  Bytes( ) ,  signature) if  err !=  nil { return  false ,  errors.  New( "签名解出公钥椭圆曲线异常" ) } sigPublicKeyBytes : =  crypto.  FromECDSAPub( sigPublicKeyECDSA) signatureNoRecoverID : =  signature[ : len ( signature) - 1 ] recoveredAddr : =  crypto.  PubkeyToAddress( * sigPublicKeyECDSA) if  string ( a.  PublicKey( ) )  !=  recoveredAddr.  Hex( )  { return  false ,  errors.  New( "签名解出公钥异常" ) } verified : =  crypto.  VerifySignature( sigPublicKeyBytes,  newHash.  Bytes( ) ,  signatureNoRecoverID) if  ! verified { return  false ,  errors.  New( "验签失败" ) } return  verified,  nil
}