원본링크 : https://forum.tao.foundation/topic/33/tethash-vs-ethash-개략적-설명
FNV 구체설명 및 EIP-1485 PR추가.
- TEThashV1 과 Ethash 의 차이점은 ,
Ethash Mix 및 DAG 생성단의 FNV Hash 를,
FNV1A 로 업데이트 하였습니다. (기존은 현재는 depricated 된 FNV0 입니다.)
ETHASH 블록도는 이더리움 연구회의 https://steemit.com/kr/@dongsamb/ethereum-pow-ethash 참조.
또한, 일부 기존 ETHASH 에서 Offset 을 초기값으로 사용하는 FNV1A 의 경우 Offset 을 사용하지 않고, FNV1A 라고 주장하는데,
이는 잘못된 주장입니다.
FNV1A 의 Offset 은 이미 검증된 PrimeNumber (소수, 암호학에서 가장중요하게 여기는 숫자그룹) 입니다.
이전단의 Keccak 을 거치고 나오는 값이 Random 넘버라서, Offset 이 필요없다는 주장은,
일견 맞을듯하지만, 상당한 암호학적 오류가 있습니다.
이유는, 랜덤넘버가 소수일 확률은 지극히 낮기 때문입니다.
따라서, 정해진 소수를 정확히 사용하는게 해시 관점에서 보안적으로 더 강하다고 보시면 됩니다.
이때, TETHASHV1 에서는 원 FNV1A 를 최대한 적용하여, 곱하기 연산이 두번 들어가기 때문에,
TEthashV1 이 기존 Ethash 보다, 3~10% 정도 해시가 낮게 나오는 현상을 볼수있습니다.
하지만, ASIC 이나, FPGA 로 갈경우는 위의 곱하기 연산은 CPU 의 기본 계산유닛으로서, 같은 조건에서는 클럭이 높은 CPU 에서 더 효율이 좋다고 보시면 됩니다.
참고로, CPU 채굴가능한 모네로의 경우 AES (암호화 알고리즘) 이 표준 하드웨어 블록이라서, i 시리즈 CPU 안에 기본 내장되어있어서,
이를 마이닝프로그램이 활용하면, CPU 로도 상당한 해시가 나오는것을 확인할수있습니다.
FNV 설명.
EIP-1485 PR 논의링크 :
https://ethereum-magicians.org/t/anti-eth-asic-mining-eip-1485-pr/1807
EIP-1485 PR :
https://github.com/ethereum/EIPs/blob/7336cceac6c997252299a463ffe896a3414c479b/EIPS/eip-1485.md
FNV-0 : (depricated)
hash = 0
for each byte_of_data to be hashed
hash = hash × FNV_prime
hash = hash XOR octet_of_data
return hash
이를 표준 FNV(x,y) 로 C 함수로 구현하면.
fnv(x,y) ((x * fnvprime) ^ y)
FNV1A 는
hash = FNV_offset_basis
for each byte_of_data to be hashed
hash = hash XOR byte_of_data
hash = hash × FNV_prime
return hash
이를 fnv1a(x,y) 일경우, 입력은 4바이트 align 으로 정한다.
C 로 풀어쓰면,
fnv1a(x,y) ( ((offset ^ x ) * fnvprime) ^ y) * fnvprime )
그외, FNV 변형 테스트 및 분석 코드 링크
https://github.com/tao-foundation/FNV-Analysis
이전글 : https://www.ddengle.com/mining/10223791
-------------------------------------
꼬리말
* 게시글 내용 삭제시 레벨 강등
* 질문은 각 주제별 게시판에 적어주세요.
비트코인 암호화화폐 커뮤니티 땡글~ 땡글~
-------------------------------------
이것이 올바른데,
hash = offset_basis
for each octet_of_data to be hashed
hash = hash xor octet_of_data
hash = hash * FNV_Prime
return hash
아래와 같이 쓰고계시죠.
hash = 0
for each octet_of_data to be hashed
hash = hash xor offset_basis # 잘 못 넣음
hash = hash * FNV_Prime # 잘 못 넣음
hash = hash xor octet_of_data
hash = hash * FNV_Prime
return hash