ETH与EOS签名与验签方法

 空投币   2020-03-11  来源:互联网  0 条评论
优质活动 币圈快讯 平台公告 行情分析
最新羊毛 最新空投 链圈挖矿 活动线报
新币上市 币圈空投 国外项目 币链屋
提醒:本站内容均转自网络,仅用于开发者下载测试,请明辨风险,若涉资金安全及隐私,请谨慎!谨慎!再谨慎!一切风险自担,涉及资金交易及个人隐私务必小心并远离,切记千万别投资,勿上当受骗。《本站免责申明》


      【此文为纯粹代码篇】,近期很多开发者涌入区块链行业,理论上来讲区块链技术和传统开发基础技术并没有太多区别,但是入门却是相当之难,原因也很简单,生态不够完善,资产不够全面,出了问题无处可寻。

      那,这也是我搭建BlocksBus技术论坛的目的,将生态做起来。      废话不多写,我们来贴ETH与EOS的签名与验签方法,BTC的等以后作者了解了再贴上来吧。代码为GoLang实现:

      ETH:


const (
signFormat = "\x19Ethereum Signed Message:\n%d%s"
)

func TestSignAndVerifty(t *testing.T) {
//xprv := "xprv9s21ZrQH143K3cYFCBJZvZakYE777MsEQu8NVkVyK86m4yeLQnr41C8vcHWtCSvpZsgUEwYXtELBZfvg4dh4HhS2xcktPi5BwSEz28xfhd9"
//EOSPrv := "5JrAtoHd6uQnX4nowRzEzuykb81uaLDzwvAvkgV61ACk1tam5K8"
//EOSPub := "EOS5f7NU3vMKt2mSrZtDpiJKRPFXNKZfjsP1V79eEXdZKf62LfvhU"
ETHPrv := "87f9bc3c6cd57f18a0143b6863d6b47d6364f1a1ba86eae0ce411097704d5d0d"
ETHAdd := "0x296Fd341F90508B6742701F4341D2027CdF5c86d"
data := "0x1234"

prvKey, _ := hex.DecodeString(ETHPrv)
sig, _ := SignWithEthWeb3(data, prvKey)
log.Println("sig:", sig)
unsignDataHashByte := crypto.Keccak256Hash(common.FromHex(data)).Bytes()
// 开始服务端签名验证
log.Println("verify sign:", verifySig(strings.ToLower(ETHAdd), sig, unsignDataHashByte))
}

// web3的协议规定,需要先做一次Keccak256Hash, 且在ETH链签名的数据均为16进制 0x开头格式
func SignWithEthWeb3(unsignData string, privateByte []byte) (signature string, err error) {
// 需要先做一次Hash
unsignDataHashByte := crypto.Keccak256Hash(common.FromHex(unsignData)).Bytes()
return SignWithEth(unsignDataHashByte, privateByte)
}

func SignWithEth(unsignData, privateKeyByte []byte) (signature string, err error) {
// web3签名需要加盐后做Hash,对hash数据进行签名
newUnsignData := fmt.Sprintf(signFormat, len(unsignData), unsignData)
unsignDataHash := crypto.Keccak256([]byte(newUnsignData))
key, err := crypto.ToECDSA(privateKeyByte)
if err != nil {
log.Println("sign ToECDSA err:", err.Error())
return "", err
}
signatureByte, err := crypto.Sign(unsignDataHash, key)
if err != nil {
log.Println("sign Sign err:", err.Error())
return "", err
}

// web逻辑
signatureByte[64] += 27
return hexutil.Encode(signatureByte), nil
}

// 验证签名
func verifySig(from, sigHex string, msg []byte) bool {
fromAddr := common.HexToAddress(from)
sig := hexutil.MustDecode(sigHex)
if sig[64] != 1 && sig[64] != 0 && sig[64] != 27 && sig[64] != 28 {
log.Println("in hexutil.MustDecode error.")
return false
}

if sig[64] != 1 && sig[64] != 0 {
sig[64] -= 27
}
pubKey, err := crypto.SigToPub(createSignHash(msg), sig)
if err != nil {
log.Println("in crypto.SigToPub error:", err.Error())
return false
}
recoveredAddr := crypto.PubkeyToAddress(*pubKey)
log.Println("recoveredAddr:", recoveredAddr.String())
return fromAddr == recoveredAddr
}

// 待签名数据生成符合格式的hash
func createSignHash(data []byte) []byte {
msg := fmt.Sprintf(signFormat, len(data), data)
return crypto.Keccak256([]byte(msg))
}


EOS:


func TestSignAndVerify(t *testing.T) {
//xprv := "xprv9s21ZrQH143K3cYFCBJZvZakYE777MsEQu8NVkVyK86m4yeLQnr41C8vcHWtCSvpZsgUEwYXtELBZfvg4dh4HhS2xcktPi5BwSEz28xfhd9"
//EOSPrv := "5JrAtoHd6uQnX4nowRzEzuykb81uaLDzwvAvkgV61ACk1tam5K8"
EOSPub := "EOS5f7NU3vMKt2mSrZtDpiJKRPFXNKZfjsP1V79eEXdZKf62LfvhU"
ETHPrv := "87f9bc3c6cd57f18a0143b6863d6b47d6364f1a1ba86eae0ce411097704d5d0d"
//ETHAdd := "0x296Fd341F90508B6742701F4341D2027CdF5c86d"

sig, _ := SignWithEos(ETHPrv, []byte("hello"))
log.Println("sig:", sig)

publicTest, _ := ecc.NewPublicKey(EOSPub)
log.Println("content:", len(publicTest.Content))
signature, err := ecc.NewSignature(sig)
if err != nil {
return
}
//hexStr := "3015a45941933194000000572d3ccdcd104b21640c21428837104b21640c2142888027ad9a22afa097e075090000000000044b455900000000164d463230313931313036303830323137393238373838"
//unsignData, _ := hex.DecodeString(hexStr)
verifyResult := signature.Verify(sigDigest([]byte("hello")), publicTest)
log.Println("verify result:", verifyResult)
}

func SignWithEos(privateKeyHex string, unsignData []byte) (signedData string, err error) {
wifFromETH, err := ConvertToWif(privateKeyHex)
if err != nil {
return "", err
}
privatekey, err := ecc.NewPrivateKey(wifFromETH.String())
if err != nil {
return "", err
}
signature, err := privatekey.Sign(sigDigest(unsignData))
if err != nil {
return "", err
}
return signature.String(), nil
}

func sigDigest(payload []byte) []byte {
h := sha256.New()
//_, _ = h.Write(chainID)
_, _ = h.Write(payload)
return h.Sum(nil)
}


      注意:

            使用到的代码库                  1、HDWallet -> 进行私钥管理                  2、eoscanada -> EOS的工具类                  3、go-ethereum -> ETH的工具类            EOS签名中sigDigest方法是缩水过的,eoscanada的sigDigest方法其实包含了chainId,这里需要注意      作者原文:ETH与EOS签名与验签方法

本文地址:http://bilianwu.com/21937.html
版权声明:项目均采集于互联网, 空投币 无法审核全面,且希望大家能赚钱,请谨慎切勿上当受骗!
温馨提示:★★★天上真会掉馅饼!天道酬勤,都是机会!不错过每个空投糖果!真假难以辨认,尽量0撸!
重要提醒:本站内容均转自互联网,请明辨各个项目风险,不构成投资建议,如涉及资金交易,请谨慎操作与自担风险!
《新人必看》 《本站免责申明》

评论已关闭!