热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

智能合约:在2个不同的链上创建有2个相同地址的合约

你知道在不同的区块链上用相同的地址创建两个智能合约是可能的吗?本文将介绍如何实现这一点。创建智能合约的两种不同方法。要理解这是如何实现的,就需要先知道部署智能合约时地址是如何计算的,因为它们不是随机的

你知道在不同的区块链上用相同的地址创建两个智能合约是可能的吗?

本文将介绍如何实现这一点。

创建智能合约的两种不同方法。

要理解这是如何实现的,就需要先知道部署智能合约时地址是如何计算的,因为它们不是随机的。

第一种使用 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 { //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)

等等……

使用 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 { //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。

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 带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”



推荐阅读
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • K3Cloud 平台字符串解密技术详解与应用
    在 K3Cloud 平台中,配置文件内的敏感信息如密码会被加密处理。通过深入研究,我们发现可以通过 Kingdee.BOS.Api 提供的接口对这些加密字符串进行解密。本文详细介绍了这一解密技术的具体实现方法及其应用场景,为开发者提供了宝贵的参考和实践指导。此外,还探讨了该技术在数据安全和系统管理中的重要性,以及如何在实际项目中高效地应用这些技术,确保系统的稳定性和安全性。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 深度森林算法解析:特征选择与确定能力分析
    本文深入探讨了深度森林算法在特征选择与确定方面的能力。提出了一种名为EncoderForest(简称eForest)的创新方法,作为首个基于决策树的编码器模型,它在处理高维数据时展现出卓越的性能,为特征选择提供了新的视角和工具。 ... [详细]
  • 深入解析HTTPS:保障Web安全的加密协议
    本文详细探讨了HTTPS协议在保障Web安全中的重要作用。首先分析了HTTP协议的不足之处,包括数据传输过程中的安全性问题和内容加密的缺失。接着介绍了HTTPS如何通过使用公钥和私钥的非对称加密技术以及混合加密机制,确保数据的完整性和机密性。最后强调了HTTPS的安全性和可靠性,为现代网络通信提供了坚实的基础。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 本文详细解析了 LeetCode 第 94 题——二叉树的中序遍历,并提供了基础实现方法。通过具体的示例,如输入根节点 `[1, null, 2, 3]` 返回 `[1, 3, 2]`,以及空树输入返回空列表 `[]`,帮助读者理解中序遍历的原理和实现步骤。文章还介绍了递归和迭代两种常见的遍历方法,为初学者提供了清晰的学习路径。 ... [详细]
  • Enhance Directives with a Dedicated Flag for Internet Explorer 11 Compatibility ... [详细]
author-avatar
寻找另一半哥哥_335
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有