Cartesi Rollups 是一种具有 Linux 运行时的应用特定 Rollups 解决方案。它使您能够创建可验证、可重复和透明的计算。我们可以以两种方式可视化 Cartesi:区块链(链上)和节点(链下)视角。
链下视角包括 Cartesi Machine 和客户端应用程序。Cartesi Machine 是运行在 Linux 操作系统上的 RISC-V 模拟器。另一方面,链上视角包括 Rollups 智能合约和 DApp 智能合约。
在本教程中,我们将展示这两种视角如何相互结合。我们将通过使用 Python 构建一个 ASCII 画布(绘图板)来实现这一点。区块链将是我们的画布。
目标是让每个用户(以太坊地址)能够将他们绘制的 ASCII 名字添加到 Cartesi DApp。
让我们开始吧!
先决条件
首先,让我们列出创建和运行我们的应用所需的所有工具:
1、Python >= 3.1
2、用于绘制 ASCII 艺术的 Python 库。您可以使用以下命令进行安装:
3、Web3.py 库。您可以使用以下命令进行安装:
4、Docker。如果您尚未安装,可以参考特定操作系统的文档进行安装。
概述
如前所述,该应用程序是一个简单的项目,将给定的输入转换为 ASCII 艺术。以下是在终端上生成的 ASCII 艺术的示例输出:
我们可以从前端和后端的角度来看待我们的应用程序。前端是我们用于向部署的 InputBox 合约发送数据(例如姓名)的部分。
节点会监听区块链上的变化,然后通知我们应用程序的后端。在执行 DApp 逻辑之后,我们可以将结果(输出)发布到区块链上。
我们的后端在 Cartesi 节点内运行;它是我们的智能合约,并且像智能合约一样运行。该节点嵌入了 Cartesi Machine,实际运行后端逻辑。
设置开发环境
首先,克隆该代码库:
执行命令:
让我们解释刚刚下载的文件。
docker-compose.yml:该文件包含组成 Cartesi 节点的 Docker 镜像。一个节点包括多个组件,包括 State-fold 服务器、服务器管理器、PostgreSQL 数据库等。如果您想了解节点组件的架构,可以参考此文档。
docker-compose-host.yml:此文件设置我们的服务器管理器以在主机模式下使用。
frontend.py:该文件向 InputBox 合约发送一个名称。
backend.py:该文件处理请求并发送回响应。对于我们的应用程序,目标是简单地注册后端已收到该名称。
因此,我们将通过发送通知来推进我们 DApp 的状态。
现在,让我们在主机模式下运行开发环境:
机模式意味着您可以在本地计算机上运行后端,就像您通常运行其他应用程序一样(而不是在 Cartesi 节点中运行)。这对于调试和当然用于我们现在正在进行的实验等目的非常有帮助。
运行上述命令将启动本地的 hardhat 环境,并实例化一个 Cartesi 节点。它将在不同端口上启动多个服务,例如:4000、5004、8545。您可以查看 Docker 文件以了解这些端口对应的服务。
您需要查看终端上的输出,以获取我们将在 frontend.py 文件中使用的合约地址。对我们来说,有两个特定的合约是感兴趣的:
InputBox 合约地址:0x5a723220579C0DCb8C9253E6b4c62e572E379945
CartesiDApp 合约地址:0x142105FC8dA71191b3a13C738Ba0cF4BC33325e2
过一段时间后,您应该会看到如下的连续区块日志:
每个 Cartesi DApp 都有一个已部署的 CartesiDApp 合约。当向 Cartesi Rollups 智能合约发送数据时,我们稍后会看到需要该合约的地址。此地址将特定数据输入与特定的 Cartesi DApp 关联起来。
注意:Hardhat 在运行时不会跟踪您进行的先前更改。因此,您需要在每次启动开发环境时检查合约地址。
前端:与 InputBox 合约进行交互
Cartesi 的关键设计特性之一是计算是可重复的。如果两个节点对输入数据有不同意见,将无法解决此冲突。为确保数据一致性,所有 Cartesi DApp 需要通过 Cartesi Rollups 合约提交数据以推进其状态。
为此,我们需要与已部署的 InputBox 合约进行交互。该合约接受相应 CartesiDApp 合约的任意数据。它有 addInput 函数,该函数接受两个输入:(1)CartesiDApp 的地址和(2)要发送的数据:
现在,打开一个新的终端窗口并运行 frontend.py 文件。这将调用 addInput 方法,将 ASCII 文本(姓名)发送到我们的 CartesiDApp 合约。
请注意,我们发送的 ASCII 姓名不带有前端.py 中 Python art 库使用的格式。我们只想保持简单。我们假设发送的文本(姓名)使用库的默认格式。
在我们的后端,State-Fold 服务器(Cartesi 节点的一个组件)监听区块链中的状态变化,并将其报告给我们的链下机器。然后,我们可以进行一些处理并将结果提交回区块链。
后端:推进应用程序状态
现在我们的 "前端" 已成功将其输入添加到区块链,我们现在可以从区块链获取数据并处理它。这就是 Cartesi Machine 发挥作用的地方 — 它是我们的执行层。
由于我们在主机模式下运行,我们的后端将在我们的本地环境中处理。
在一个新的终端窗口中,让我们在 Python 虚拟环境中运行 backend.py 文件:
您应该会看到日志,指示应用程序正在等待请求以推进其状态。当姓名到达后端时,将显示交易的详细信息。查看下面的示例图像:
负载携带了姓名。将上面的十六进制负载(0x4a656c6c7966697368)转换为 ASCII 将给您名字 Jellyfish。您可以尝试不同的名字并观察输出。
如果您已经完成了与 ollups SDK 环境的工作,您可以使用以下命令优雅地停止 Docker 容器:
总结
在本教程中,您已经了解了如何使用 Cartesi Rollups SDK 构建您的 Cartesi 应用程序。现在,轮到您实现自己的 DApp 了。
我们迫不及待想看到您创造的成果!
关于 Cartesi
Cartesi 是一种特定于应用程序的汇总协议,具有运行 Linux 发行版的虚拟机,为 DApp 开发人员创造了更丰富、更广泛的设计空间。
Cartesi Rollups 提供模块化扩展解决方案,可部署为 L2、L3 或主权 Rollups,同时保持强大的基础层安全保证。
免责声明
本文章仅供一般参考和信息分享之用,不构成法律、金融或投资建议。本信息的准确性和完整性不受保证,也不应被视为对特定情况的建议。读者应自行进行独立的研究和咨询,以做出任何决策。作者和相关机构对任何因依赖本信息而产生的损失或损害概不负责。在做出任何金融或投资决策之前,强烈建议咨询专业人士以获取个性化的建议。
虚拟货币属于高风险投资品,在做出投资决策前,请咨询相关监管机构是否存在投资亏损风险。
来源:金色财经