签名算法和原理 #
以太坊使用椭圆曲线加密算法ECDSA来进行交易签名
- 密钥生成:生成私钥和公钥,私钥用于签名,公钥用于验证签名
- 交易签名:使用私钥对原始消息进行签名
- 对交易使用RLP(递归长度前缀编码)编码序列化
- 使用keccka256哈希函数对编码后的交易进行计算
- 使用私钥对哈希值进行签名,生成r、s、v值
- 签名验证:使用公钥以及原始消息来验证签名的有效性
验证签名代码:
func IsValidOrderSignature(address string, message string, sign string) bool {
ethMessage := []byte("\x19Ethereum Signed Message:\n" + strconv.Itoa(len(message)) + message)
hash := crypto.Keccak256(ethMessage)
sigBytes := hexutil.MustDecode(sign)
if sigBytes[64] == 27 || sigBytes[64] == 28 {
sigBytes[64] -= 27
}
pubKey, err := crypto.SigToPub(hash, sigBytes)
if err != nil {
return false
}
recAddress := crypto.PubkeyToAddress(*pubKey)
recStr := strings.ToLower(recAddress.String())
return recStr == strings.ToLower(address)
}