作者:寻找另一半哥哥_335 | 来源:互联网 | 2023-07-24 13:10
你知道在不同的区块链上用相同的地址创建两个智能合约是可能的吗?本文将介绍如何实现这一点。创建智能合约的两种不同方法。要理解这是如何实现的,就需要先知道部署智能合约时地址是如何计算的,因为它们不是随机的
你知道在不同的区块链上用相同的地址创建两个智能合约是可能的吗?
本文将介绍如何实现这一点。
创建智能合约的两种不同方法。
要理解这是如何实现的,就需要先知道部署智能合约时地址是如何计算的,因为它们不是随机的。
第一种使用 CREATE 的方法是不确定的,这意味着我们无法从部署的智能合约中预测部署的智能合约将占用哪些地址。
为了升级 EVM 并绕过这一限制,2018 年 4 月发布了 EIP-1014,它引入了一个新的 CREATE2,它允许我们创建智能合约,并在智能合约创建之前计算智能合约地址,这在 CREATE 中并不总是可能的。
使用 CREATE 部署
当我们在 Solidity 上部署一个智能合约和另一个智能合约时,智能合约的地址用以下方法进行计算:
msg.sender 的地址。
“nonce”。(通常是交易数量)
下面是一个简单公式:
Address = bytes20(keccak256(senderAddress, nonce))
这是一个来自 Solidity 的简单示例:
pragma solidity ^0.8.0;contract testContract {
function Deploy() public returns(address) {
testContract test = new testContract();
return address(test);
}
}
例如,我们说:
第一个部署的智能合约地址始终是 0xd9145CCE52D386f254917e481eB44e9943F39138(地址 0x5b…,nonce 0)
如果你部署了另一个,它将是:0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8( 地址 0x5b…,nonce 1)
等等……
使用 CREATE2 部署
还有一种方法可以使用不同的地址部署智能合约,这一次更容易预测。
这里有 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 {
function Deploy(bytes32 salt) public returns(address) {
testContract test = new testContract{salt: bytes32(_salt)}();
return address(test);
}
}
现在地址应该很不一样了。
那么如何在两个不同的链中部署具有相同地址的智能合约?
最好的方法显然是 CREATE2。
Source:https://medium.com/@trustchain/create-a-contract-with-2-same-addresses-on-2-different-chains-3ed987b1e348
关于
ChinaDeFi - ChinaDeFi.com 是一个研究驱动的 DeFi 创新组织,同时我们也是区块链开发团队。每天从全球超过 500 个优质信息源的近 900 篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。
Layer 2 道友 - 欢迎对 Layer 2 感兴趣的区块链技术爱好者、研究分析人与 Gavin(微信: chinadefi)联系,共同探讨 Layer 2 带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”。