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