18910140161

以太坊合约地址是怎么计算出来的

顺晟科技

2021-06-16 10:46:04

342

合约地址生成

以太坊合约的地址是根据创建者(发送者)的地址以及创建者发送过的交易数量(现时)来计算确定的发送者。和目前进行链路协议编码,然后用Keccak-256进行混杂计算。

参考肾盂代码(Python):

def mk_contract_address(发送方,随机数):

返回sha3(RLP。编码([normalize _ address(sender),nonce])[12:]

使用固态代码:

//nonce为0 时生成的地址

nonce0=地址(keccak256(0xd6,0x94,地址0x80))

nonce1=地址(keccak256(0xd6,0x94,地址0x01))

这里有一些讨论:

如果发报机为0x6ac 7ea 33 f 8831 ea 9 DCC 53393 AAA 88 b 25 a 785 DBF 0,创造的合约地址如下,这个过程完全是确定的:

随机数0='0x CD 234 a 471 b 72 ba 2 f1 CCF 0a 70 fc ABA 648 a5 eecd 8d '

随机数1='0x 343 c 43 a 37d 37 dff 08 AE 8 C4 a 11544 c 718 abb 4 fc F8 '

随机数2='0xf 778 b 86 fa 74 e 846 C4 f 0 a1 FBD 1335 Fe 81 c 00 a 0 c 91 '

随机数3='0x fffd 933 a 0 BC 612844 EAF 0 c 6 Fe 3 e 5b 8 e9 b 6 C1 d 19 c '

使用Web3j的爪哇代码:

私有字符串计算合同地址(字符串地址,长随机数){

byte[]地址asbytes=数字。HexStringTobytearray(地址);

byte[]calculateddressabytes=

Hash.sha3(RlpEncoder.encode(

新的RlpList(

RLP弦乐。创建(地址为字节),

RLP弦乐。create((nonce)));

calculatedAddressAsBytes=数组。范围副本(calculatedAddressAsBytes,

12,calculateddressabytes。长度);

string calculateddressaxx=numeric。to ex string(CalculatedDressAsBytes);

返回calculatedAddressAsHex

}

注:根据EIP 161规范合约帐户使用随机数=1初始(在主网络上)。因此,由一个合同创建的个合同地址将使用非零目前进行计算。

CREATE2

在EIP-1014中添加了一个新的操作码CREATE2(在19 年一月的君士坦丁堡硬分叉中引入的操作码),它是可以创建合约的另一种方式。

对于由CREATE2创建的合约,其地址将是:

keccak 256(0x ff SenderAddress salt keccak 256(init _ code))[12:]

CREATE2在二层扩容尤其是状态通道中很有用,这里有一个例子来理解简单的状态通道,即便状态通道合约还不存在,只要确定创建合约的salt,init_code,就可以用状态通道进行支付。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航