如何开发和部署Tezos智能合约(附代码示例)

518 阅读6分钟

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

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

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

你可以在这个GitHub repo中获得最终项目的代码。

前提条件

要跟上这篇文章,你需要对Tezos区块链有所了解。你的知识不一定要很深入。

以太坊区块链的知识不是必须的,但它有很大的帮助。

什么是Tezos?

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

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

Tezos vs. Ethereum:比较表

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

什么是SmartPy?

SmartPy是一个工具,允许你在Tezos区块链上轻松构建智能合约。

你在SmartPy中使用Python编写合约。如果你已经熟悉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)

该命令在home ,以这种树状结构创建一个smartpy-cli 目录:

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

本指南使用tezos-client ,与已部署的智能合约进行互动。要安装tezos-client, ,请运行下面的一个命令,这取决于你是使用Mac还是Linux操作系统:

# 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 testnet来部署并与智能合约互动。上述命令通过节点tezos-client ,连接到Jakartanet testnet [https://jakartanet.ecadinfra.com](https://jakartanet.ecadinfra.com)在网络上。

在你用tezos-client 进行任何操作之前,你需要连接一个账户。Tezos提供Faucet账户,允许你免费与网络互动。

你需要访问Jakartanet Faucet网站并下载Faucet文件。做完这些后,在你的终端中打开下载的文件夹,运行这个命令:

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

该命令在你的tezos-client 中激活了Faucet账户,并给它一个别名faucet 。要检查这个账户的余额,打开jakartanet.json 文件,复制pkh 的值,然后运行这个命令:

$ tezos-client get balance for <address>

用你复制的pkh 的值替换<address>

注意,Tezos Faucet账户对每个人都是公开的,而且Tez代币的数量有限,所以你必须规范你的使用。

用SmartPy开发一个Tezos智能合约

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

import smartpy as sp

class StoreText(sp.Contract):
    def __init__(self, value):
        self.init(text = value)

    @sp.entry_point
    def 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的智能合约不能被改变或删除。这可能是一个问题,因为合约中可能存在错误,而错误可能导致代价高昂的错误和资金损失。

SmartPy让你有能力在部署前轻松测试你的合约。测试合约不需要任何代币或钱包账户来运行。你所需要做的就是打开store_text.py 文件并复制下面的内容:

@sp.add_test(name = "StoreText")
def test():
  scenario = sp.test_scenario()
  contract = StoreText("Hello")
  scenario += contract

  scenario.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")

调用了replaceappend 入口点:

  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 目录包含部署智能合约所需的所有文件。

部署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 [https://jakartanet.ecadinfra.com](https://jakartanet.ecadinfra.com)指向你要部署的网络上的一个RPC节点

Tezos智能合约通常包括两个部分:存储和合约。存储器持有合约所存储的数据,而合约持有智能合约的逻辑。

注意,你可以用任何一个合约或存储的编译文件来部署合约。他们只是在你使用命令时必须是同一个文件扩展名。

默认情况下,如果你在测试网部署,编译器将使用一个Faucet账户。如果你要部署到主网,或者你想使用你的钱包账户,请在账户的私钥后面添加--private-key 标志。

与部署的智能合约进行交互

在与部署的智能合约互动之前,你需要知道合约目前的样子。要做到这一点,在你的浏览器中打开SmartPy Explorer,并按照以下步骤操作:

  1. 导航到 "备选节点"
  2. 在 "合同 "输入中粘贴合同的地址
  3. 在 "在特定节点上探索 "下,从mainnet ,切换到jakartanet
  4. 粘贴RPC URL [https://jakartanet.ecadinfra.com](https://jakartanet.ecadinfra.com)到文本框中
  5. 点击 "在特定节点上探索"。

当合同数据出现后,文本存储应该显示为 "你好,那里!"

现在你知道了合同的文本,你可以通过这个命令调用replace ,把它改成 "嗨,那里!":

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

如果该命令是成功的,当你刷新资源管理器时,存储区现在应该显示 "嗨,那里!"

注意,在运行该命令之前,你必须用部署的合同的地址替换<contract-address>

总结

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

我希望这篇文章能帮助你了解在Tezos上构建智能合约的过程。如果你想阅读更多关于智能合约的内容,请查看这篇关于智能合约应避免的错误的文章。

谢谢你的阅读!祝你今天愉快。开发和部署Tezos智能合约