애초에 블록체인 네트워크 세상에서 해쉬란 굉장히 중요하다. 모든 컨트랙트들도 하나의 고유의주소를 가져야 하기 때문에 고유값이란 매우 중요한 개념이다.
먼저 기존에 많이 사용되는 "create"를 예로 들어보자.
CREATE는 msg.sender의 address와 msg.sender의 nonce를 이용해서 컨트랙트 주소를 만듭니다.
keccak256(rlp([sender, nonce]))[12:]
CREATE2는 컨트랙트 주소를 만들 때 4개의 값(0xff, address, salt, init code)을 이용합니다.
keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:]
create2는 nonce를 안쓰고 salt를 사용한다. salt는 내가 정할 수 있는 값이라서 먼저 해쉬 돌려보고 나온 주소가 맘에 안들면 솔트값 변경하고 또 돌려보고 마음에 드는 주소가 나오면 그 솔트값으로 컨트랙트 베포하면 원하는 주소가 나올 수 있다. 즉 salt를 사용하면 주소를 내가 원하는 예쁜(?)형태로 만들 수가 있다. 이것을 vanity address라고 부른다.
여기서 중요한 차이점은 CREATE는 nonce를 사용하지만 CREATE2는 nonce를 사용하지 않습니다. 이것이 중요한 이유는 CREATE로 같은 주소의 컨트랙트를 새로 만들 수 없지만 CREATE2를 이용하면 같은 주소의 컨트랙트를 새로 만들 수 있기 때문입니다.
CREATE는 nonce를 이용해 주소를 만듭니다. 이 nonce는 메시지 콜을 하거나 컨트랙트를 생성할 때마다 1 증가하기 때문에 CREATE로 컨트랙트 주소를 만들면 항상 다른 주소를 생성합니다. 이에 반해 CREATE2는 nonce를 사용하지 않고 0xff, address, salt, init code을 이용해 컨트랙트 주소를 생성합니다. 그렇기 때문에 address, salt, init code를 미리 알고 있다면 같은 주소의 컨트랙트를 재배포할 수 있습니다.
기존에 사용하던 CREATE에서는 컨트랙트 코드와 컨트랙트 주소의 연관성이 없기 때문에 컨트랙트 주소 자체에 identity가 없습니다. 하지만 CREATE2는 컨트랙트 코드를 이용해 컨트랙트 주소를 만들기 때문에 컨트랙트 주소 자체에 어느 정도 identity를 가진다고 볼 수 있다.
"However CREATE2 has an important property that makes it preferable in certain situations: it doesn’t rely on the current state of the deploying address. This means you can be sure the contract address calculated today would be the same as the address calculated 1 year from now. This is important is because you can interact with the address, and send it ETH, before the smart contract has been deployed to it."
위 설명에 의하면 create2를 이용하면 스마트컨트랙트가 베포되기 전에, 이전 주소와 interact할 수 있다.
https://medium.com/onther-tech/create2-%EC%B7%A8%EC%95%BD%EC%A0%90-%EB%B6%84%EC%84%9D-d82e913ad28b