ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

go eth 踩坑 crypto.Sign 与 eth.account.signHash 或者 web3Process.web3.eth.personal.sign 签名结果不同 除了最后一位 都匹配

2022-05-30 12:04:18  阅读:211  来源: 互联网

标签:account personal web3Process web3 ethereum messageHash eth data


从 go-ethereum 实现 Ethereum personal_sign (EIP-191) 给出了与
ethers.js web3.py web3.js solidy.sgin不同的签名
原文 https://stackoverflow.com/questions/69762108/implementing-ethereum-personal-sign-eip-191-from-go-ethereum-gives-different-s

 

js 签名消息代码

const accounts = await web3Process.web3.eth.getAccounts()
this.imtContract = new web3Process.web3.eth.Contract(imtAbi, paymentErc20)
const decimals = await this.imtContract.methods.decimals().call({
  from: accounts[0]
})
const heroPrice = price * Math.pow(10, decimals)
console.log(web3Process.heroAddress, tokenId, paymentErc20, heroPrice, saltNonce)
let messageHash = web3Process.web3.utils.soliditySha3(web3Process.heroAddress, tokenId, paymentErc20, heroPrice, saltNonce)
console.log("messageHash", messageHash)
// messageHash = "\x19Ethereum Signed Message:\n32" + messageHash
// messageHash = web3Process.web3.eth.accounts.hashMessage(messageHash)
try {
  const signature = await web3Process.web3.eth.personal.sign(messageHash, accounts[0])
  console.log("signature", signature)
  const hash = web3Process.web3.eth.accounts.hashMessage(messageHash)
  return [signature, hash]
} catch (e) {
  throw(e)
}

  

 python 签名代码

hash_data = w3.soliditySha3(abi_types=["address", "uint256", "address", "uint256", "uint256"],
                values=["address", token_id, "address",
                        amount, time])
print(w3.toHex(hash_data))
sign_data = w3.eth.account.signHash(defunct_hash_message(hexstr=w3.toHex(hash_data)),
                                        private_key="private_key")

  

package main

import (
    "fmt"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/crypto"
    "encoding/hex"
    "encoding/json"
    "log"
)

func signHash(data []byte) common.Hash {
    msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)
    return crypto.Keccak256Hash([]byte(msg))
}

func main() {

    hexPrivateKey := "8da4ef21b864d2cc526dbdb2a120bd2874c36c9d0a1fb7f8c63d7f7a8b41de8f"
    dataMap := map[string]string{"data1":"value1","data2":"value2"}
    dataToSign, _ := json.Marshal(dataMap)

    privateKey, err := crypto.HexToECDSA(hexPrivateKey)
    if err != nil {
            log.Fatal(err)
    }

    dataHash := crypto.Keccak256Hash(dataToSign) //0x8d218fc37d2fd952b2d115046b786b787e44d105cccf156882a2e74ad993ee13

    signHash := signHash(dataHash.Bytes())

    signatureBytes, err := crypto.Sign(signHash.Bytes(), privateKey)
    if err != nil {
            log.Fatal(err)
    }
    
    fmt.Println("0x" + hex.EncodeToString(signatureBytes))
}

  

标签:account,personal,web3Process,web3,ethereum,messageHash,eth,data
来源: https://www.cnblogs.com/Sunbreaker/p/16326262.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有