체인의정석

스마트컨트렉트, 서로 다른 체인에서 같은 컨트렉트 주소가 나올 수 있을까? 본문

블록체인/Solidity

스마트컨트렉트, 서로 다른 체인에서 같은 컨트렉트 주소가 나올 수 있을까?

체인의정석 2022. 3. 7. 13:55
728x90
반응형

서로 다른 체인에서 같은 컨트렉트 주소가 나올 수 있을까?

 

현재 작성하는 프로그램에서 서로 다른 체인에서 상호작용을 하는데 CA를 키값으로 매핑을 구현하였다.

어차피 중간에 있는 관리 프로그램이 관리를 할 예정이지만 충분히 고려해봐야 할 상황이기 때문에 조사를 해보았다.

 

일단, 결론부터 말하자면 지갑과 nonce값이 같다면 같은 값이 나올 수 있다는것이 정답이다. 따라서 CA를 여러 다른 체인에서 같이 다룰때는 이를 고려하여 코드를 짜야한다.

 

https://www.reddit.com/r/ethdev/comments/nxcc6r/how_can_contracts_have_the_same_addresses_across/

 

How can contract's have the same addresses across chains? is this only possible because they are testnet chains?

Uniswap has the same address on both testnet chain rinkeby and ropsten. They match the mainnet chain address. The only way I can see this as...

www.reddit.com

위의 글에서 볼 수 있었는데

const RLP = require('rlp')
function contractAddr(sender, nonce) {
  var input_arr = [ sender, nonce ];
  var rlp_encoded = RLP.encode(input_arr)
  var contract_address_long = keccak('keccak256').update(rlp_encoded).digest('hex');
  return contract_address_long.substring(24); //Trim the first 24 characters.
}
let nonce = await web3.eth.getTransactionCount(accounts[0], 'pending')
nonce = nonce + 1
let contractFutureAddress = contractAddr(
  accounts[0],
  nonce
)
  console.log('future', contractFutureAddress)

위와 같이 보내는 사람의 공개키와 nonce를 가지고 있으면 나중에 해당 주소로 부터 나오는 컨트렉트 주소를 알 수 있다고 한다.

 

There are two different ways contract addresses can be determined.

Contracts created with the CREATE opcode or created directly with a transaction will have an address that is a hash of the deployer's address and the deployer's nonce. So long as you control the deployed and use it for very limited purposes, you can ensure that the same deployer uses the same nonce to deploy on each chain.

Contracts created by the CREATE2 opcode will have an address determined by the deployed address, the contract code, and a seed chosen by the contract. This requires a contract deployed with CREATE at some predictable address, but then you could use that to deploy loads of contracts with predictable addresses to different chains.

 

이는 어떤 CREATE opcode가 호출되는지에 따라서 갈린다고 하는데 CREATE2 opcode에서는 계산방법이 다르다고 한다.

 

https://ethereum.stackexchange.com/questions/101336/what-is-the-benefit-of-using-create2-to-create-a-smart-contract

 

What is the benefit of using create2() to create a smart contract?

Why would someone use create2() inline assembly code to create a child contract in factory pattern as opposed to using newContract() to create an instance of "newContract"? What are the u...

ethereum.stackexchange.com

다른 글을 찾아보니 그 차이점을 명확히 알 수 있었다.

 

1. CREATE opcode : 기본적으로 배포하는 경우

keccak256(senderAddress, nonce)

2. CREATE2 opcode : 스마트컨트렉트 내부에서 배포를 하는 경우

keccak256(0xFF, senderAddress, salt, bytecode)

2번의 경우 미리 컨트렉트 주소를 정해서 배포할 수 있다.

 

2번의 예시는 아래에서 찾을 수 있다.

https://github.com/miguelmota/solidity-create2-example

 

GitHub - miguelmota/solidity-create2-example: Example of how to use the CREATE2 opcode released in the Constantinople update for

Example of how to use the CREATE2 opcode released in the Constantinople update for Ethereum - GitHub - miguelmota/solidity-create2-example: Example of how to use the CREATE2 opcode released in the ...

github.com

결론은 ca 충돌이 가능하기 때문에 이를 고려해서 프로그램을 짜야된다는 점이다. 이를 어떻게 풀어낼지는 다시 고민해봐야겠다.

728x90
반응형
Comments