以太坊消息签名

  ·   1 min read

签名算法和原理 #

以太坊使用椭圆曲线加密算法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)
}