第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 go-ethereum 實現(xiàn) Ethereum personal_sign (EIP-191)

從 go-ethereum 實現(xiàn) Ethereum personal_sign (EIP-191)

Go
呼喚遠(yuǎn)方 2022-10-10 17:49:58
我正在嘗試在 Golang 中生成一個personal_sign,就像它在 ethers.js 中實現(xiàn)的一樣。類似的問題,但最終使用常規(guī)sign而不是個人sign_implementation。醚類// keccak256 hash of the datalet dataHash = ethers.utils.keccak256(  ethers.utils.toUtf8Bytes(JSON.stringify(dataToSign)));//0x8d218fc37d2fd952b2d115046b786b787e44d105cccf156882a2e74ad993ee13let signature = await wallet.signMessage(dataHash); // 0x469b07327fc41a2d85b7e69bcf4a9184098835c47cc7575375e3a306c3718ae35702af84f3a62aafeb8aab6a455d761274263d79e7fc99fbedfeaf759d8dc9361c戈朗:func signHash(data []byte) common.Hash {    msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)    return crypto.Keccak256Hash([]byte(msg))}privateKey, err := crypto.HexToECDSA(hexPrivateKey)if err != nil {    log.Fatal(err)}dataHash := crypto.Keccak256Hash(dataToSign) //0x8d218fc37d2fd952b2d115046b786b787e44d105cccf156882a2e74ad993ee13signHash := signHash(dataHash.Bytes())signatureBytes, err := crypto.Sign(signHash.Bytes(), privateKey)if err != nil {    log.Fatal(err)}// signatureBytes 0xec56178d3dca77c3cee7aed83cdca2ffa2bec8ef1685ce5103cfa72c27beb61313d91b9ad9b9a644b0edf6352cb69f2f8acd25297e3c64cd060646242e0455ea00如您所見,哈希相同,但簽名不同:0x469b07327fc41a2d85b7e69bcf4a9184098835c47cc7575375e3a306c3718ae35702af84f3a62aafeb8aab6a455d761274263d79e7fc99fbedfeaf759d8dc9361c醚類0xec56178d3dca77c3cee7aed83cdca2ffa2bec8ef1685ce5103cfa72c27beb61313d91b9ad9b9a644b0edf6352cb69f2f8acd25297e3c64cd060646242e0455ea00戈朗查看 Ethers.js 的源代碼,除了填充的管理方式之外,我找不到任何不同之處。編輯 檢查批準(zhǔn)的答案signHash(data []byte) common.Hash {    hexData := hexutil.Encode(data)    msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(hexData), hexData)    return crypto.Keccak256Hash([]byte(msg))}
查看完整描述

1 回答

?
繁星coding

TA貢獻(xiàn)1797條經(jīng)驗 獲得超4個贊

JavaScript 代碼中有一個錯誤。


從signer.signMessage()(參見注釋部分)的文檔中,字符串似乎是 UTF8 編碼的,并且二進(jìn)制數(shù)據(jù)必須作為TypedArrayor傳遞Array。

Keccak 散列返回十六進(jìn)制編碼,即作為字符串,因此是 UTF8 編碼,這是不正確的。相反,它必須轉(zhuǎn)換為TypedArray. 為此,庫提供了函數(shù)ethers.utils.arrayify()。


以下 JavaScript 基于發(fā)布的代碼,但執(zhí)行所需的十六進(jìn)制解碼:


(async () => {

    let privateKey = "0x8da4ef21b864d2cc526dbdb2a120bd2874c36c9d0a1fb7f8c63d7f7a8b41de8f";

    let dataToSign = {"data1":"value1","data2":"value2"};


    let dataHash = ethers.utils.keccak256(

      ethers.utils.toUtf8Bytes(JSON.stringify(dataToSign))

    );

    dataHashBin = ethers.utils.arrayify(dataHash)

    

    let wallet = new ethers.Wallet(privateKey);

    let signature = await wallet.signMessage(dataHashBin); 

    

    document.getElementById("signature").innerHTML = signature; // 0xfcc3e9431c139b5f943591af78c280b939595ce9df66210b7b8bb69565bdd2af7081a8acc0cbb5ea55bd0d673b176797966a5180c11ac297b7e6344c5822e66d1c

})();

<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" type="text/javascript"></script>

<p style="font-family:'Courier New', monospace;" id="signature"></p>

產(chǎn)生以下簽名:


0xfcc3e9431c139b5f943591af78c280b939595ce9df66210b7b8bb69565bdd2af7081a8acc0cbb5ea55bd0d673b176797966a5180c11ac297b7e6344c5822e66d1c

下面的 Go 代碼基于未修改的已發(fā)布 Go 代碼,但使用 JavaScript 代碼中的鍵和數(shù)據(jù)進(jìn)行比較:


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))

}

Go 代碼給出以下簽名:


0xfcc3e9431c139b5f943591af78c280b939595ce9df66210b7b8bb69565bdd2af7081a8acc0cbb5ea55bd0d673b176797966a5180c11ac297b7e6344c5822e66d01

除了最后一個字節(jié)外,兩個簽名都匹配。


JavaScript 代碼以格式返回簽名r|s|v(參見此處)。v大小為一個字節(jié),只是兩個簽名不同的值。


這是恢復(fù) IDv = 27 + rid所在的位置。rid恢復(fù) ID 的值介于 0 和 3 之間,因此v值介于 27 和 30 或 0x1b 和 0x1e 之間(參見此處)。


另一方面,Go 代碼在最后一個字節(jié)中返回恢復(fù) ID,而不是v. 為了使 Go 代碼的簽名也與最后一個字節(jié)中的 JavaScript 代碼的簽名匹配,恢復(fù) ID 必須替換為v:


signatureBytes[64] += 27

fmt.Println("0x" + hex.EncodeToString(signatureBytes))


查看完整回答
反對 回復(fù) 2022-10-10
  • 1 回答
  • 0 關(guān)注
  • 317 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號