签名
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
}