Contract-Deployment
乙太坊合約的地址是如何計算的?
乙太坊合約的地址是如何計算的?提前知道合約地址有哪些案例?
編輯 2019 年 4 月:
CREATE2
添加資訊。編輯 2022 年 1 月:將 Solidity 語法更新為 ^0.8.0。
乙太坊合約的地址是根據其創建者的地址 ( ) 以及創建者發送了多少交易( )確定性地計算出來的。and被 RLP 編碼,然後用Keccak-256 散列。
sender``nonce``sender``nonce
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-1014
CREATE2
中添加了一個新的操作碼,這是可以創建合約的另一種方式。對於由其地址創建的合約
CREATE2
將是:
keccak256( 0xff ++ senderAddress ++ salt ++ keccak256(init_code))[12:]
更多資訊將在此處添加,同時請參閱EIP-1014。