본문 바로가기

:D/block chain

[Solidity] Keccak256과 형 변환

함수의 반환값이 (반)랜덤인 uint가 되기를 원하면?

이더리움은 SHA3의 한 버전인 keccak256를 내장 해시 함수로 가지고 있음

해시 함수는 기본적으로 입력 스트링을 랜덤 256비트 16진수로 매핑하고

스트링에 약간의 변화라도 있으면 해시 값은 크게 달라짐

해시 함수는 이더리움에서 여러 용도로 활용되지만,

예시의 경우 의사 난수 발생기(pseudo-random number generator)로 이용

 

 

 

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");
//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256("aaaac");

 

 

 

이 예시를 보면 입력값의 한 글자가 달라졌음에도 불구하고 반환값은 완전히 달라짐을 알 수 있음

블록체인에서 안전한 의사 난수 발생기는 매우 어려운 문제

 

 

 

 


형 변환

 

 

uint8 a = 5;
uint b = 6;
// a * b가 uint8이 아닌 uint를 반환하기 때문에 에러 메시지가 난다:
uint8 c = a * b; 
// b를 uint8으로 형 변환해서 코드가 제대로 작동하도록 해야 한다:
uint8 c = a * uint8(b);

 

 

 

위의 예시에서 a * b는 uint를 반환. 하지만 이 반환값을 uint8에 저장하려고 하니 잠재적으로 문제를 야기할 수 있음.

=> 반환값을 uint8으로 형 변환하면 코드가 제대로 작동하고 컴파일러도 에러 메시지를 주지 않음