Contract-Deployment

乙太坊合約的地址是如何計算的?

  • April 16, 2022

乙太坊合約的地址是如何計算的?提前知道合約地址有哪些案例?

編輯 2019 年 4 月CREATE2添加資訊。

編輯 2022 年 1 月:將 Solidity 語法更新為 ^0.8.0。

乙太坊合約的地址是根據其創建者的地址 ( ) 以及創建者發送了多少交易( )確定性地計算出來的。and被 RLP 編碼,然後用Keccak-256 散列sender``nonce``sender``nonce

來自pyethereum:

def mk_contract_address(sender, nonce):
   return sha3(rlp.encode([normalize_address(sender), nonce]))[12:]

在堅固性中:

nonce0= address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), _origin, bytes1(0x80))))));
nonce1= address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), _origin, bytes1(0x01))))));

一些討論的例子:

對於發送方 0x6ac7ea33f8831ea9dcc53393aaa88b25a785dbf0,它將創建的合約地址如下:

nonce0= "0xcd234a471b72ba2f1ccf0a70fcaba648a5eecd8d"
nonce1= "0x343c43a37d37dff08ae8c4a11544c718abb4fcf8"
nonce2= "0xf778b86fa74e846c4f0a1fbd1335fe81c00a0c91"
nonce3= "0xfffd933a0bc612844eaf0c6fe3e5b8e9b6c1d19c"

在帶有 Web3j 的 Java 中:

private String calculateContractAddress(String address, long nonce){
   byte[] addressAsBytes = Numeric.hexStringToByteArray(address);

   byte[] calculatedAddressAsBytes =
           Hash.sha3(RlpEncoder.encode(
                   new RlpList(
                           RlpString.create(addressAsBytes),
                           RlpString.create((nonce)))));

   calculatedAddressAsBytes = Arrays.copyOfRange(calculatedAddressAsBytes,
           12, calculatedAddressAsBytes.length);
   String calculatedAddressAsHex = Numeric.toHexString(calculatedAddressAsBytes);
   return calculatedAddressAsHex;
}

注意:根據EIP 161 A Specification , 合約賬戶以nonce = 1啟動(在主網中)。因此,由另一個合約創建的第一個合約地址將使用非零隨機數計算。


CREATE2

在EIP-1014CREATE2中添加了一個新的操作碼,這是可以創建合約的另一種方式。

對於由其地址創建的合約CREATE2將是:

keccak256( 0xff ++ senderAddress ++ salt ++ keccak256(init_code))[12:]

更多資訊將在此處添加,同時請參閱EIP-1014

引用自:https://ethereum.stackexchange.com/questions/760