哈希函数 keccak256

本章讲解在 Solidity 中,keccak256 函数的使用方法和用途。

官网binschool.app
推特@BinSchool    DiscordBinDAO   微信:bkra50 

哈希函数(hash function)是一个密码学概念,用于将任意长度的数据转换为固定长度的值,这个结果值称为哈希值。

将原始数据转为固定长度的哈希值,会带来很多好处,包括:

1. 一致性

哈希函数的输入数据不受长度限制,不管输入数据有多大,哈希值都会具有相同的长度,这有助于确保数据处理的一致性。

2. 高效性

固定长度的哈希值可以更快地处理和比较,这对于数据的存储、传输和处理都很有用。

3. 索引和查找

固定长度的哈希值非常适合用作索引,用于在大型数据集中快速查找数据。

4. 隐私保护

哈希值通常用于替代原始数据,以保护数据的隐私。

在计算机或者数学领域,常常使用哈希算法,来实现数据完整性校验、数字签名、密码学安全等用途。哈希算法在区块链技术中应用广泛,是其最基本的算法之一,常用于交易签名、地址生成、状态交易树等。

哈希算法并不唯一,而是有很多种标准。在以太坊中,使用的哈希算法为 Keccak,这是一种并不常见的算法。

在实践中,SHA-3 是一个被广泛接受并用于加密应用的标准哈希函数。SHA-3 是由 Keccak 家族的哈希函数为基础设计的,但它经过了一些标准化和规范化的过程,从而成为标准算法。而 Keccak 并不满足 SHA-3 的具体规范,但是 Keccak 算法也经常用于各种应用中。

Solidity 语言中,keccak256 是一种内置函数,用于计算 Keccak-256 的哈希值。

keccak256 函数的用法

function keccak256(bytes memory data) internal pure returns (bytes32)

它的输入参数为字节数组 bytes,返回结果为一个定长的 32 字节的数值,即长度为 256 位。

任意类型的数据均可以通过 keccak256,获得它的哈希值,但首先需要把原始数据转换为字节数组。

keccak256 函数的用法可以参考以下合约,它可以计算任意字符串的哈希值:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Hash {
  function hash(string memory data) external pure returns (bytes32) {
     // 将字符串转换为字节数组
     bytes memory s = bytes(data);

     // 计算 Keccak-256 哈希值
      bytes32 hashVal = keccak256(s);
      return hashVal;
    }
}

我们把这个合约部署到 Remix 上,输入一段字符串,然后调用 hash 函数,就可以得到它的哈希值。

keccak256 函数的用途

keccak256 函数在智能合约中有多种常见用途:

1. 生成函数选择器

使用 keccak256 对智能合约中的函数声明进行哈希计算,然后截取前4个字节,就会得到函数的选择器。在以太坊上部署的二进制代码的合约中,就使用函数选择器来定位和执行特定的函数,并传递相应的参数。

2. 生成唯一标识

keccak256 生成的哈希值可以用作唯一标识,以确保数据的唯一性。将唯一标识作为 mapping 的数据索引,用于在大型数据集中快速查找数据。

3. 比较数据异同

keccak256 生成的哈希值可以用于比较数据的异同。首先对原始数据进行哈希,可以得到一个固定长度的哈希值,然后对哈希值进行比较,以确定数据是否相同。

我们在后面的章节中,您会看到 keccak256 函数的具体应用场景。