本文是对钱包原理这个部分的一个简单补充
本文是对钱包原理这个部分的一个简单补充,在此,列出相关文章:
Web3专题(一) 助记词和生成私钥、公钥、地址的基本原理 Web3专题(二) 2 种钱包之非确定性钱包(keystore 管理私钥) Web3专题(三) 2 种钱包之分层确定性钱包(HD Wallet,BIP32,BIP39,BIP44)
众所周知,keccak256
是密码学的一种哈希函数,在以太坊中,用于将任何消息进行哈希返回 256 位的哈希值,即长度为 64 个十六进制字符的字符串。比如我在Web3 专题(一) 中讲的,可以将公钥哈希之后得到地址。
那么,keccak256
背后有着什么样的故事呢?
早在 2007 年,为了确定 SHA-2 标准的后继者,美国国家标准与技术研究所(NIST)组织的 SHA-3 竞赛开始了,Keccak 算法是其中的一个竞争者,并赢得了 SHA-3 竞赛,最终在 2015 年被标准化为 FIPS(联邦信息处理标准)202 SHA-3。
keccak256
是 Keccak 算法的一个特定实例。以太坊在创建智能合约时,采用了最初的 Keccak 算法,当时 Keccak 算法还没有被标准化,因此,为了保证一致性和兼容性,在 Keccak 算法标准化后,没有进行更改。 结果就是 以太坊使用的 keccak256 算法 和 标准的 FIPS-202 SHA-3 算法 不一样。
如何判断你使用的keccak256
是哪一个呢?
一个简单的方法是用空字符串("")作为输入,运行哈希函数,根据结果判断。
以太坊使用的是:Keccak256("") = c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
标准化完成的是:SHA3("") = a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
下面是一个代码示例
// 引入需要的包
import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"golang.org/x/crypto/sha3"
)
// ...
// 以太坊使用的`keccak256`
b := crypto.Keccak256([]byte(""))
s := common.BytesToHash(b).Hex()
s = strings.TrimPrefix(s, "0x")
fmt.Println(s)
fmt.Println(s == "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470")
// 标准化的`keccak算法`,即sha3
dig := sha3.Sum256([]byte(""))
fmt.Println(hex.EncodeToString(dig[:]))
fmt.Println(hex.EncodeToString(dig[:]) == "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a")
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!