• goethereum签名无法通过web3.js/web3.j的验证


    虽然go-ethereum是官方客户端,但是官方文档中提供的都是客户端命令行操作,没有针对签名有具体的描述。

    查阅资料时发现下面这个网站,看域名像是官方提供的说明文档,但不确定。

    https://goethereumbook.org/zh/signature-generate/

    这个网站上的签名代码示例:

    package main
    
    import (
        "fmt"
        "log"
    
        "github.com/ethereum/go-ethereum/common/hexutil"
        "github.com/ethereum/go-ethereum/crypto"
    )
    
    func main() {
        privateKey, err := crypto.HexToECDSA("fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19")
        if err != nil {
            log.Fatal(err)
        }
    
        data := []byte("hello")
        hash := crypto.Keccak256Hash(data)
        fmt.Println(hash.Hex()) // 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8
    
        signature, err := crypto.Sign(hash.Bytes(), privateKey)
        if err != nil {
            log.Fatal(err)
        }
    
        fmt.Println(hexutil.Encode(signature)) // 0x789a80053e4927d0a898db8e065e948f5cf086e32f9ccaa54c1908e22ac430c62621578113ddbb62d509bf6049b8fb544ab06d36f916685a2eb8e57ffadde02301
    }
    

      

    这样得到的签名无法通过web3.js/web3.j的验证。

    原因是签名数据还需要签名前缀,以及数据的长度

    如下:

    	message := "hello world"
    	message = fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(message), message)
    
    	// 数据签名
    	data := []byte(message)
    	encodedData := crypto.Keccak256(data)
    
    	signature, err := crypto.Sign(encodedData, privateKey)
    	if err != nil {
    		return err
    	}
    

      

  • 相关阅读:
    正则表达式
    Newtonsoft.Json
    MVC之参数验证(三)
    MVC之参数验证(二)
    MVC之参数验证(一)
    MVC之模型绑定
    导致存储过程重新编译的原因
    IFormattable,ICustomFormatter, IFormatProvider接口
    oracle将id串转换为名字串
    oracle查看表空间大小及使用情况
  • 原文地址:https://www.cnblogs.com/yourstars/p/16141101.html
Copyright © 2020-2023  润新知