0x00 前言

上一篇文章介绍了如何使用 Ignite 搭建 Cosmos 区块链以及进行多节点部署。这一篇文章继续我们的目标,搭建 Cosmos + EVM 区块链。

0x01 目标

我们第一个目标是:搭建一个可以被公网访问的 Cosmos + EVM 区块链,并部署少量节点。

0x02 实现路径

  1. 在本地启动单体 Cosmos 区块链节点(已完成)
  2. 在本地和服务器上启动多个 Cosmos 区块链节点并组网(已完成)
  3. 将 Cosmos 与 EVM 集成,并在本地运行测试(本篇内容)
  4. 使用集成后的区块链完成上述步骤 1 和 2(本篇内容)
  5. 整合上 Docker

0x03 将 Cosmos 与 EVM 集成,并在本地运行测试

Cosmos 如何与 EVM 集成呢?Cosmos 官方推出了一个解决方案:https://github.com/cosmos/evm

我原本以为,按照 Cosmos 模块化的设计,EVM 应该就是一个独立的模块,只要在 app.go 上整合上之后就能用 Ignite 启动了,我们可以参考 https://evm.cosmos.network/integrate/to-cosmos-sdk-chain 进行整合。但我做到一半发现 Ignite 生成的代码结构和该文档的完全对不上!(后面发现这个文档是基于 Spwan 框架的,下文会提到)

经过几天的研究,我最终发现这个解决方案和 Ignite 居然不兼容!不兼容的地方至少有以下两点:

  1. ChainID 格式不兼容:Cosmos EVM 定义的 ChainID 格式是:${chainName}_${evmChainID}-${version},比如 cosmos_262144-1。但是 Ignite(SPN)支持的 ChainID 格式必须全部为小写字母,不能出现下划线或者数字,而且这无法通过修改 Ignite 代码进行兼容,因为这个限制的逻辑是写在 SPN 网络里的,是由 Ignite 维护的
  2. Validator 交易格式不兼容(似乎):Cosmos EVM 的交易格式和普通的 Cosmos 不同。而 Ignite 原生不支持这种交易格式,导致链启动发送交易时候会失败。

也就是说,**我们第一周做的事情全部白费**了….当然,我们如果投入足够多的精力,还是能让他们兼容起来的,但很显然,我们已经没有这种精力了。

我继续调研了一段时间,发现原来 Cosmos 还有另一个脚手架工具:Spawn(https://github.com/rollchains/spawn)。但这个框架仍非常早期,文档、参考资料和生态极其不完善,唯一的优点是提供了一键搭建 Cosmos + EVM 区块链的指令…然并卵,他不提供像 Ignite 那样快速启动一条区块链的功能。

因此,我们只能通过自己写脚本的方式来让我们能够像 Ignite 那样快速启动区块链。

为了简单起见,我暂时使用 cosmos/evm 来搭建我们的区块链。该仓库的 v0.1.0 Tag 上有一个 example_chainhttps://github.com/cosmos/evm/tree/v0.1.0/example_chain),这个工程里面提供了一个完整的启动本地区块链节点的脚本:https://github.com/cosmos/evm/blob/v0.1.0/example_chain/local_node.sh,我亲测了一遍,这个脚本**居然是直接能跑通并且确实能成功连接上 Metamask 的**!—— 本节结束!🎊