最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go-ethereum?解析ethersjs中產(chǎn)生的簽名信息思路詳解

 更新時(shí)間:2022年08月31日 10:10:45   作者:Shanshan?yuan  
這篇文章主要介紹了Go-ethereum?解析ethersjs中產(chǎn)生的簽名信息,我們解析簽名的需要知道,簽名的消息,簽名,和公鑰,按照這個(gè)思路,我們可以通過(guò)ethers實(shí)現(xiàn)消息的簽名,也可以通過(guò)go-ethereum實(shí)現(xiàn),需要的朋友可以參考下

Go-ethereum 解析ethersjs中產(chǎn)生的簽名信息

在簽名驗(yàn)證的過(guò)程中,我們判斷簽名正確的前提是,簽名解析后的公鑰,和發(fā)起這次動(dòng)作的人是同一個(gè)公鑰。
我們解析簽名的需要知道,簽名的消息,簽名,和公鑰。

按照這個(gè)思路,我們可以通過(guò)ethers實(shí)現(xiàn)消息的簽名,也可以通過(guò)go-ethereum實(shí)現(xiàn)。

在簽名的解析過(guò)程中,通常是由前端將上述的的已知道信息發(fā)送到后端,后端然后針對(duì)信息進(jìn)行解析工作。
后端的服務(wù)中可以使用node或者golang進(jìn)行編寫。本文將講述這兩種解析形式。

1. ethers 消息簽名

Ethers 能夠通過(guò)簡(jiǎn)單的編程語(yǔ)句實(shí)現(xiàn)Metamask對(duì)某個(gè)消息進(jìn)行簽名
其實(shí)現(xiàn)的語(yǔ)句為:

      import { ethers } from 'ethers'; // 導(dǎo)入ethers package
       const provider = new ethers.providers.Web3Provider(window.ethereum);
       console.log(provider) // 獲取provider,也就是rpc服務(wù)
      // 請(qǐng)求訪問(wèn)錢包
       await provider.send("eth_requestAccounts", []) 

       const signer = provider.getSigner(); //獲取簽名者信息
       this.userPk = await signer.getAddress(); // 獲取簽名者公鑰
       console.log(this.userPk)
       let signature = await signer.signMessage("登錄網(wǎng)站") // metamask 對(duì)“登錄網(wǎng)站進(jìn)行簽名”
       this.loginWithWeb3(this.userPk) // 其他業(yè)務(wù)模塊
       console.log(signature) // 打印簽名

1.1 ethers 對(duì)簽名消息進(jìn)行解析

  console.log("verifyMessage:",ethers.utils.verifyMessage("登錄網(wǎng)站" , signature))

簡(jiǎn)單的一句語(yǔ)句就可以驗(yàn)證簽名。

2. Golang 簽名解析

golang 中也可以針對(duì)簽名進(jìn)行解析,原理和ethers中的verifyMessage 類似,但是在解析的過(guò)程中,需要轉(zhuǎn)化:因?yàn)楹灻腊凑誆IP-191標(biāo)準(zhǔn),需要針對(duì)簽名的消息添加前綴:“\x19Ethereum Signed Message:\n”

以下是完整的代碼,其中的參數(shù)全部為string類型,返回簽名中的公鑰。

func VerifyMessage(ctx context.Context, message string, signedMessage string) (string, error) {
    // Hash the unsigned message using EIP-191
    hashedMessage := []byte("\x19Ethereum Signed Message:\n" + strconv.Itoa(len(message)) + message)
    hash := crypto.Keccak256Hash(hashedMessage)

    // Get the bytes of the signed message
    decodedMessage := hexutil.MustDecode(signedMessage)

    // Handles cases where EIP-115 is not implemented (most wallets don't implement it)
    if decodedMessage[64] == 27 || decodedMessage[64] == 28 {
        decodedMessage[64] -= 27
    }

    // Recover a public key from the signed message
    sigPublicKeyECDSA, err := crypto.SigToPub(hash.Bytes(), decodedMessage)
    if sigPublicKeyECDSA == nil {
        err = errors.New("Could not get a public get from the message signature")
    }
    if err != nil {
        return "", err
    }

    return crypto.PubkeyToAddress(*sigPublicKeyECDSA).String(), nil
}

運(yùn)行測(cè)試代碼驗(yàn)證代碼的正確性

func TestVerifySignature(t *testing.T) {
	var signature Signature
	initdata := "登錄網(wǎng)站"
	sign := "0x5321f24a057500605f1d894c2be7cb7f196ba2444e8f6815af261efbcb9d272f70d327f146553c3d51cf1816823dba6254d5500a69b4197e9f4839e0971cf89d1b"
	publicKey := "0x0bDCC0C6eAc88439fb57b90977714b7430c3c623"

	publicKey2, err := signature.VerifyMessage(context.Background(), initdata, sign)
	fmt.Println(publicKey == publicKey2, err)
}

驗(yàn)證結(jié)果正確。

3. 總結(jié)

在golang 中針對(duì)簽名的解析需要考慮到簽名消息的前綴問(wèn)題,否則不能夠正確將解析。

到此這篇關(guān)于Go-ethereum 解析ethersjs中產(chǎn)生的簽名信息的文章就介紹到這了,更多相關(guān)Go-ethereum簽名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang語(yǔ)言實(shí)現(xiàn)gRPC的具體使用

    Golang語(yǔ)言實(shí)現(xiàn)gRPC的具體使用

    本文主要介紹了Golang語(yǔ)言實(shí)現(xiàn)gRPC的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Windows下使用go語(yǔ)言寫程序安裝配置實(shí)例

    Windows下使用go語(yǔ)言寫程序安裝配置實(shí)例

    這篇文章主要介紹了Windows下使用go語(yǔ)言寫程序安裝配置實(shí)例,本文講解了安裝go語(yǔ)言、寫go代碼、生成可執(zhí)行文件、批量生成可執(zhí)行文件等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的分布式系統(tǒng)

    用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的分布式系統(tǒng)

    這篇文章主要介紹了用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的分布式系統(tǒng),文中的代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-08-08
  • 對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解

    對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解

    今天小編就為大家分享一篇對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Go語(yǔ)言Zap庫(kù)Logger的定制化和封裝使用詳解

    Go語(yǔ)言Zap庫(kù)Logger的定制化和封裝使用詳解

    這篇文章主要介紹了Go語(yǔ)言Zap庫(kù)Logger的定制化和封裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go實(shí)現(xiàn)將任何網(wǎng)頁(yè)轉(zhuǎn)化為PDF

    Go實(shí)現(xiàn)將任何網(wǎng)頁(yè)轉(zhuǎn)化為PDF

    在許多應(yīng)用場(chǎng)景中,可能需要將網(wǎng)頁(yè)內(nèi)容轉(zhuǎn)化為?PDF?格式,使用Go編程語(yǔ)言,結(jié)合一些現(xiàn)有的庫(kù),可以非常方便地實(shí)現(xiàn)這一功能,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧
    2024-11-11
  • Go Web下gin框架的模板渲染的實(shí)現(xiàn)

    Go Web下gin框架的模板渲染的實(shí)現(xiàn)

    Gin框架是目前非常流行的Go語(yǔ)言Web框架之一,作為一個(gè)輕量級(jí)的框架,Gin提供了豐富的功能和靈活的架構(gòu),本文就來(lái)介紹下Go Web下gin框架的模板渲染的實(shí)現(xiàn),感興趣的可以了解一下
    2023-10-10
  • goland 實(shí)現(xiàn)websocket server的示例代碼

    goland 實(shí)現(xiàn)websocket server的示例代碼

    本文主要介紹了goland 實(shí)現(xiàn)websocket server的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 使用Golang實(shí)現(xiàn)AES加解密的代碼示例

    使用Golang實(shí)現(xiàn)AES加解密的代碼示例

    在現(xiàn)代的數(shù)據(jù)安全中,加密和解密是極其重要的一環(huán),其中,高級(jí)加密標(biāo)準(zhǔn)(AES)是最廣泛使用的加密算法之一,本文將介紹如何使用Golang來(lái)實(shí)現(xiàn)AES加密和解密,需要的朋友可以參考下
    2024-04-04
  • golang?gorm框架數(shù)據(jù)庫(kù)的連接操作示例

    golang?gorm框架數(shù)據(jù)庫(kù)的連接操作示例

    這篇文章主要為大家介紹了golang?gorm框架數(shù)據(jù)庫(kù)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評(píng)論

讷河市| 德安县| 辽中县| 句容市| 鄂伦春自治旗| 景宁| 南木林县| 潮安县| 德保县| 湖南省| 麻城市| 临汾市| 定陶县| 视频| 安泽县| 诸城市| 茶陵县| 萨嘎县| 曲水县| 庄浪县| 瓦房店市| 确山县| 额敏县| 寿阳县| 汾阳市| 尚义县| 礼泉县| 衡阳县| 孙吴县| 新绛县| 平乐县| 南岸区| 于都县| 江城| 通道| 汶川县| 开封市| 吕梁市| 衡阳市| 精河县| 利川市|