Tezos 是最古老的智能合约区块链之一,以太坊是第一个。

虽然以太坊是开发人员开发和部署智能合约的热门选择,但由于费用高且交易缓慢,其应用程序的可扩展性并不高。相比之下,Tezos 应用程序的设置非常高效且成本低廉。

在本指南中,您将学习如何使用 SmartPy CLI 在 Tezos 中开发和部署智能合约。我们将涵盖:

  • 什么是特所思?

    • Tezos 与以太坊:比较图表

  • 什么是 SmartPy?

  • 什么是智能合约?

  • SmartPy CLI 入门

  • 配置tezos-client

  • 使用 SmartPy 开发 Tezos 智能合约

  • 测试 Tezos 智能合约

  • 将智能合约编译为 Michelson

  • 部署 Tezos 智能合约

  • 与已部署的智能合约交互

您可以在此 GitHub 存储库中获取最终项目的代码。

先决条件

要阅读本文,您需要熟悉 Tezos 区块链。你的知识不必很深入。

不需要了解以太坊区块链,但它有很大帮助。

什么是特所思?

Tezos 是一个区块链网络和智能合约平台,通过其治理模型和自我升级能力构建为自适应的。

虽然 Tezos 和 Ethereum 是支持智能合约和 DApp 开发的类似区块链,但它们在几个方面有所不同。下面的 Tezos 与 Ethereum 表显示了两个网络之间的一些差异。

Tezos 与以太坊:比较图表

特所思以太坊
开发者提议升级网络上的区块链协议开发者使用硬分叉升级区块链协议
利益相关者通过投票接受或拒绝提案来控制区块链协议的升级区块链网络的创建者管理区块链协议的升级
使用形式验证来执行智能合约使用 EVM 在网络上存储和执行智能合约
参与者(节点)可以选择提供计算资源或委托他们的代币参与验证交易所有参与者(节点)必须提供计算资源并质押他们的硬币以参与验证交易
汽油费很低,这使得它非常可扩展汽油费真的很高,这使得它无法扩展

什么是 SmartPy?

SmartPy 是一种工具,可让您在 Tezos 区块链上轻松构建智能合约。

您使用 Python 在 SmartPy 中编写合约。如果您已经熟悉 Python,则无需学习新的智能合约编程语言。

SmartPy 有两个使用其他语法的变体:SmartTS,使用 TypeScript,SmartML,使用 OCaml。

SmartPy 将 Python 脚本编译为 Michelson。Michelson 是 Tezos 中用于智能合约的低级编程语言。SmartTS 和 SmartML 也可以使用 SmartPy 工具进行编译。

什么是智能合约?

智能合约是您可以在区块链网络上构建、部署和执行的程序。在部署智能合约之前,您无需在网络上拥有节点。

借助智能合约,您可以构建可供所有设备访问的应用程序,而无需拥有或维护服务器。这些完全分散的应用程序需要很少或不需要维护。

智能合约利用区块链的全部潜力,允许您在链上执行程序以及与链本身进行交互。您可以持有或转移代币,并通过智能合约访问区块链上的特殊功能。

SmartPy CLI 入门

要安装 SmartPy CLI,请运行以下命令:

$ bash <(curl -s https://smartpy.io/cli/install.sh)

此命令使用此树结构在其中创建一个目录:smartpy-cli“home

smartpy-cli├── browser.py├── node_modules/├── originator.js├── package.json├── package-lock.json├── __pycache__/├── smart.css├── smart.js├── smartpyc.js├── smartpyc.py├── smartpyio.py├── smartpy.py├── SmartPy.sh├── smarttop/├── smart-ts-cli.js├── templates/├── theme.js└── typography.css

要确认安装,请运行以下命令:

$ ~/smartpy-cli/SmartPy.sh --version

作为易于访问的额外步骤,通过将以下内容复制到您的文件或相关配置文件中来创建别名:SmartPy.sh“.bashrc

$ alias smartpy="$HOME/smartpy-cli/SmartPy.sh"

现在您可以使用:

$ smartpy --version

代替:

$ ~/smartpy-cli/SmartPy.sh --version

配置tezos-client

本指南用于与已部署的智能合约进行交互。要安装运行以下命令之一,具体取决于您使用的是 Mac 还是 Linux 操作系统:tezos-client“tezos-client,

# Mac$ brew tap serokell/tezos-packaging-stable https://github.com/serokell/tezos-packaging-stable.git$ brew install tezos-client​# Linux$ wget https://github.com/serokell/tezos-packaging/releases/latest/download/tezos-client$ chmod +x tezos-client$ mkdir -p $HOME/.local/bin$ mv tezos-client $HOME/.local/bin$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> $HOME/.bashrc$ source $HOME/.bashrc

请注意,如果您使用的是 Windows,则需要使用 wsl 安装 Linux 发行版并运行 Linux 安装。

安装后,您需要进行设置。首先运行以下命令:tezos-client

$ tezos-client --endpoint https://jakartanet.ecadinfra.com config update

本指南使用 Jarkatanet 测试网来部署智能合约并与之交互。上述命令通过网络上的节点连接到 Jakartanet 测试网。tezos-client“

在对 执行任何操作之前,您需要连接一个帐户。Tezos 提供 Faucet 帐户,让您可以免费与网络交互。tezos-client


超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →


您需要访问Jakartanet Faucet 网站并下载 Faucet 文件。之后,在终端中打开下载文件夹并运行以下命令:

$ tezos-client activate account faucet with ./jakartanet.json

该命令会激活您的 Faucet 帐户并为其赋予别名。要检查此帐户的余额,请打开文件,复制 的值,然后运行以下命令:tezos-clientfaucetjakartanet.json“pkh

$ tezos-client get balance for 

替换为您复制的pkh值。

请注意,Tezos Faucet 帐户对所有人都是公开的,并且 Tez 代币数量有限,因此您必须规范您的使用。

使用 SmartPy 开发 Tezos 智能合约

要开始创建我们的示例智能合约,请创建一个新文件并将以下内容复制到其中:store_text.py

import smartpy as spclass StoreText(sp.Contract):def __init__(self, value):self.init(text = value)@sp.entry_pointdef replace(self, params):self.data.text = params.text@sp.entry_point# Note: the spaces before "@"def append(self, params):self.data.text += params.text

以下是上述合同的工作方式,逐个进行:

首先,我们导入了smartpy库:

import smartpy as sp

然后,我们定义了一个扩展类:sp.Contract

class StoreText(sp.Contract):

最后,我们在智能合约中定义了一些项目;首先,要初始化的构造函数text:

def __init__(self, value):# Note: the spaces before "def"self.init(text = value)

其次,替换 的值的入口点text:

@sp.entry_point# Note: the spaces before "@"def replace(self, params):self.data.text = params.text

第三,将字符串附加到的入口点text:

@sp.entry_point# Note: the spaces before "@"def append(self, params):self.data.text += params.text

接下来,我们来看看如何测试智能合约。

测试 Tezos 智能合约

部署到 Tezos 的智能合约无法更改或删除。儿歌多多TV版App,培养小朋友思考能力及艺术天赋,早教及学前教育软件!这可能是一个问题,因为合同中可能存在错误,错误可能导致代价高昂的错误和资金损失。

SmartPy 使您能够在部署之前轻松测试您的合约。测试合约不需要任何代币或钱包账户即可运行。您需要做的就是打开文件并复制以下内容:store_text.py

@sp.add_test(name = "StoreText")def test():scenario = sp.test_scenario()contract = StoreText("Hello")scenario += contractscenario.verify(contract.data.text == "Hello")contract.replace(text = "Hi")contract.append(text = ", there!")scenario.verify(contract.data.text == "Hi, there!")

以下是代码段的工作原理。首先,我们将test函数注册为测试脚本:

@sp.add_test(name = "StoreText")

然后,我们定义了test函数:

def test():

在剩下的几行中,我们创建了一个测试场景:

scenario = sp.test_scenario()

初始化合约”Hello”:

contract = StoreText("Hello")

将合约实例添加到场景中:

scenario += contract

验证合约的text价值为”Hello”:

scenario.verify(contract.data.text == "Hello")

称为replace和append入口点:

contract.replace(text = "Hi")contract.append(text = ", there!")

最后,验证合约的text价值现在是”Hi, there”:

scenario.verify(contract.data.text == "Hi, there!")

添加测试后,保存文件并运行以下命令:

$ ~/smartpy-cli/SmartPy.sh test store_text.py ./test-output

如果测试成功,编译器不会抛出错误信息。

将智能合约编译为 Michelson

在部署智能合约之前,您需要将其编译为 Michelson。如前所述,Michelson 是一种用于 Tezos 区块链上的智能合约的低级编程语言。

要编译,请运行以下命令:store_text.py

$ ~/smartpy-cli/SmartPy.sh compile message.py ./output

如果编译成功,您应该会看到output如下所示的文件夹:

output/├── scenario.json├── script_init.py├── script_pure.py└── storeMessage/├── log.txt├── step_000_cont_0_contract.json├── step_000_cont_0_contract.py├── step_000_cont_0_contract.tz├── step_000_cont_0_sizes.csv├── step_000_cont_0_storage.json├── step_000_cont_0_storage.py├── step_000_cont_0_storage.tz└── step_000_cont_0_types.py

该output目录包含部署智能合约所需的所有文件。


来自 LogRocket 的更多精彩文章:

  • 不要错过来自 LogRocket 的精选时事通讯The Replay

  • 了解LogRocket 的 Galileo 如何消除噪音以主动解决应用程序中的问题

  • 使用 React 的 useEffect优化应用程序的性能

  • 在多个 Node 版本之间切换

  • 了解如何使用 AnimXYZ 为您的 React 应用程序制作动画

  • 探索 Tauri,一个用于构建二进制文件的新框架

  • 比较NestJS 与 Express.js


部署 Tezos 智能合约

要部署,请在终端中打开文件夹并运行以下命令:store_text.py“output/storeMessage

$ ~/smartpy-cli/SmartPy.sh originate-contract --code step_000_cont_0_contract.json --storage step_000_cont_0_storage.json --rpc https://jakartanet.ecadinfra.com[INFO] - Using RPC https://jakartanet.ecadinfra.com/...[INFO] - Contract KT1………………CAjjW originated!!!

以下是该命令的工作方式:

  • originate-contract告诉部署(“发起”)合约tezos-client

  • –code step_000_cont_0_contract.json指向已编译的合约文件

  • –storage step_000_cont_0_storage.json指向编译后的存储文件

  • –rpc指向要部署到的网络上的 RPC 节点

Tezos 智能合约通常涉及两个组件:存储和合约。存储保存合约存储的数据,合约保存智能合约的逻辑。

请注意,您可以使用任何合约或存储编译部署合约。当您使用该命令时,它们只需具有相同的文件扩展名。

默认情况下,如果您在测试网上部署,编译器将使用 Faucet 帐户。如果您正在部署到主网或想要使用您的钱包帐户,请添加标志,后跟帐户的私钥。–private-key

与已部署的智能合约交互

在与已部署的智能合约进行交互之前,您需要了解合约当前的外观。为此,请在浏览器中打开 SmartPy Explorer并按照以下步骤操作:

  1. 导航到“替代节点”

  2. 将合约地址粘贴到“合约”输入

  3. 在“在特定节点上探索”下,从 切换mainnet到jakartanet

  4. 将 RPC URL 粘贴到文本框中

  5. 单击“在特定节点上探索”

当合约数据出现时,文本存储应显示为“Hello, There!”

现在您知道合同的文本,您可以将其更改为“Hi, There!” replace通过使用以下命令调用入口点:

$ tezos-client transfer 0 from faucet to  --entrypoint replace --arg '"Hi, There!"'

如果命令成功,当您刷新资源管理器时,存储现在应该显示“Hi, There!”

请注意,您必须在运行命令之前替换为已部署合约的地址。

结论

本文介绍了使用 SmartPy 在 Tezos 上构建智能合约的过程。构建智能合约可以让您充分利用区块链网络来构建去中心化的应用程序和组织。