go-ethereum簽名無法通過web3.js/web3.j的驗證
阿新 • • 發佈:2022-04-13
雖然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 }