본문으로 건너뛰기

해싱

cryptographic hash function은 임의 길이의 입력을 고정 길이의 출력인 hash value로 매핑하는 널리 사용되는 cryptographic primitive이다. hash function은 일방향 함수가 되도록 설계되며, 이는 주어진 hash value로부터 입력 데이터를 찾아 함수를 역으로 계산하는 것이 사실상 불가능하다는 뜻이고, 또한 collision resistant하도록 설계되며, 이는 같은 hash value로 매핑되는 서로 다른 두 입력을 찾는 것이 사실상 불가능하다는 뜻이다.

Sui Move API는 다음 cryptographic hash function을 지원한다:

  • SHA2-256은 std::hash::sha2_256으로 제공된다
  • SHA3-256은 std::hash::sha3_256으로 제공된다
  • Keccak256은 sui::hash::keccak256으로 제공된다
  • Blake2b-256은 sui::hash::blake2b256으로 제공된다

Usage

SHA2-256과 SHA3-256 hash function은 std::hash module의 Move Standard Library에서 사용할 수 있다. 다음 예시는 smart contract에서 SHA2-256 hash function을 사용하는 방법을 보여준다:

module test::hashing_std {
use std::hash;
use sui::object::{Self, UID};
use sui::tx_context::TxContext;
use sui::transfer;
use std::vector;

/// 출력 hash 값을 담는 object이다.
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),
};
// hash된 데이터를 담는 output data object를 수신자에게 transfer한다.
transfer::public_transfer(hashed, recipient)
}
}

Keccak256과 Blake2b-256 hash function은 Sui Move Library의 sui::hash module을 통해 사용할 수 있다. 아래는 smart contract에서 Keccak256 hash function을 사용하는 방법의 예시이다. 여기서는 hash function의 입력이 reference로 주어진다는 점에 유의한다. 이는 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;

/// 출력 hash 값을 담는 object이다.
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),
};
// hash된 데이터를 담는 output data object를 수신자에게 transfer한다.
transfer::public_transfer(hashed, recipient)
}
}