The Native Hashing Function

Là một hàm hash có sẵn của Ethereum, hoạt động dựa trên SHA3. Đối số của hàm này là kiểu bytes. Do đó mà ta cần chuyển đối số thành mảng các bytes trước khi gọi hàm.

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256(abi.encodePacked("aaaab"));
//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256(abi.encodePacked("aaaac"));

Câu lệnh abi.encodePacked cho phép chuyển một giá trị bất kỳ sang mảng byte (kiểu bytes)1.

Pseudo Random Number Generating

Ta có thể dùng hàm keccak256 để thực hiện tạo số giả ngẫu nhiên từ một chuỗi cho trước. Ví dụ:

uint randomNumber = uint(keccak256(abi.encodePacked(_str)));

Trong ví dụ trên, ta ép kiểu giá trị trả về của keccak256 thành số nguyên.

Cần chú ý rằng, cách tạo số giả ngẫu nhiên này là không an toàn, vì cùng một input sẽ cho ra cùng một output.

Chúng ta cũng có thể kết hợp nhiều biến toàn cục để tạo số giả ngẫu nhiên như sau:

uint randomNumber = uint(keccak256(abi.encodePacked(msg.sender, block.difficulty, block.timestamp)));

Tuy nhiên, cách này cũng không an toàn do:

  • msg.sender có thể được biết bởi sender.
  • block.difficulty chịu ảnh hưởng trực tiếp bởi các miner.
  • block.timestamp có thể dự đoán được.

Về bản chất, việc tạo số giả ngẫu nhiên trong blockchain là rất khó do blockchain có tính chất tất định. Do đó, contract cần sử dụng oracle để truy cập đến các số giả ngẫu nhiên được tạo ở bên ngoài blockchain (off-chain)2.

Footnotes

  1. Tìm hiểu thêm các hàm của abi: Cheatsheet — ABI Encoding and Decoding Functions

  2. Tham khảo: CryptoZombies | Lesson 4 Chapter 4