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.
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ụ:
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:
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 ↩