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
-
Tìm hiểu thêm các hàm của
abi
: Cheatsheet — ABI Encoding and Decoding Functions ↩ -
Tham khảo: CryptoZombies | Lesson 4 Chapter 4 ↩