哈希
密码哈希函数是广泛使用的密码原语,将任意长度的输入映射到固定长度的输出,即哈希值。哈希函数被设计为一种单向函数,这意味着从给定的哈希值中找到输入数据是不可行的,同时它还需要具备碰撞抵抗性,这意味着找到两个不同的输入映射到相同的哈希值是不可行的。
Sui 的 Move API 支持以下密码哈希函数:
- SHA2-256,标识为
std::hash::sha2_256
- SHA3-256,标识为
std::hash::sha3_256
- Keccak256,标识为
sui::hash::keccak256
- Blake2b-256,标识为
sui::hash::blake2b256
用法
SHA2-256 和 SHA3-256 哈希函数可在 Move 标准库的 std::hash
模块中找到。以下示例演示了如何在智能合约中使用 SHA2-256 哈希函数:
module test::hashing_std {
use std::hash;
use sui::object::{Self, UID};
use sui::tx_context::TxContext;
use sui::transfer;
use std::vector;
/// Object that holds the output hash value.
struct Output has key, store {
id: UID,
value: vector<u8>
}
public fun hash_data(data: vector<u8>, recipient: address, ctx: &mut TxContext) {
let hashed = Output {
id: object::new(ctx),
value: hash::sha2_256(data),
};
// Transfer an output data object holding the hashed data to the recipient.
transfer::public_transfer(hashed, recipient)
}
}
Keccak256 和 Blake2b-256 哈希函数通过 Sui Move Library 中的 sui::hash
模块提供。以下是在智能合约中使用 Keccak256 哈希函数的示例。请注意,这里哈希函数的输入是作为引用给出的。对于 Keccak256 和 Blake2b-256,情况都是如此。
module test::hashing_sui {
use sui::hash;
use sui::object::{Self, UID};
use sui::tx_context::TxContext;
use sui::transfer;
use std::vector;
/// Object that holds the output hash value.
struct Output has key, store {
id: UID,
value: vector<u8>
}
public fun hash_data(data: vector<u8>, recipient: address, ctx: &mut TxContext) {
let hashed = Output {
id: object::new(ctx),
value: hash::keccak256(&data),
};
// Transfer an output data object holding the hashed data to the recipient.
transfer::public_transfer(hashed, recipient)
}
}