你知道在不同的区块链上用相同的地址创建两个智能合约是可能的吗?本文将介绍如何实现这一点。
你知道在不同的区块链上用相同的地址创建两个智能合约是可能的吗?
本文将介绍如何实现这一点。
要理解这是如何实现的,就需要先知道部署智能合约时地址是如何计算的,因为它们不是随机的。
第一种使用CREATE的方法是不确定的,这意味着我们无法从部署的智能合约中预测部署的智能合约将占用哪些地址。
为了升级EVM并绕过这一限制,2018年4月发布了EIP-1014,它引入了一个新的CREATE2,它允许我们创建智能合约,并在智能合约创建之前计算智能合约地址,这在CREATE中并不总是可能的。
当我们在Solidity上部署一个智能合约和另一个智能合约时,智能合约的地址用以下方法进行计算:
msg.sender 的地址。
“nonce”。(通常是交易数量)
下面是一个简单公式:
Address = bytes20(keccak256(senderAddress, nonce))
这是一个来自Solidity的简单示例:
pragma solidity ^0.8.0;contract testContract { //code }contract Deployer {
function Deploy() public returns(address) {
testContract test = new testContract();
return address(test);
}
}
例如,我们说:
你可以登陆remix IDE网站。
编译一个简单的智能合约。(智能合约的代码没有任何相关性。)
将它部署到remix区块链(在浏览器内)上,默认地址为:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
第一个部署的智能合约地址始终是0xd9145CCE52D386f254917e481eB44e9943F39138(地址0x5b…,nonce 0)
如果你部署了另一个,它将是:0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8(地址0x5b…,nonce 1)
等等……
还有一种方法可以使用不同的地址部署智能合约,这一次更容易预测。
这里有4个参数(注意nonce不再存在):
0xFF
msg.sender
salt(可以选择任意值)。
要部署的智能合约的字节码。
地址计算如下:
address = bytes20(keccak256(0xFF, senderAddress, salt, bytecode))
由于Solidity0.8,你可以在Solidity中使用CREATE2,通过如下方式指定salt:
pragma solidity ^0.8.0;contract testContract { //code }contract Deployer {
function Deploy(bytes32 salt) public returns(address) {
testContract test = new testContract{salt: bytes32(_salt)}();
return address(test);
}
}
现在地址应该很不一样了。
那么如何在两个不同的链中部署具有相同地址的智能合约?
我们可以通过提供相同的nonce来使用CREATE来做到这一点。(这并不容易,因为每笔交易的 nonce 都会增加 1)。
我们可以通过CREATE2在不同的链上提供相同的salt来实现这一点。(比提供nonce更容易)。
最好的方法显然是CREATE2。
ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!