> For the complete documentation index, see [llms.txt](https://docs.polysmartchain.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.polysmartchain.com/zhong-wen-jian-ti/kai-fa-zhe/bu-shu-di-yi-ge-he-yue.md).

# 部署第一个合约

### Remix介绍

Remix是一个网页端的集成开发环境，可以用它在浏览器里创建、运行、调试智能合约。它由以太坊基金会开发维护。通过solidity开发智能合约所需的一切都在Remix的web界面上提供了，所以开发者无需自行搭建开发环境了。Remix可以大大简化合约的部署方法，无需使用命令行界面即可方便的部署合约。

### 创建并部署第一个合约

* 首先前往Remix：[https://remix.ethereum.org](https://remix.ethereum.org/)并创建一个新得文件
* 在 Remix 界面的左上角添加一个新文件，并输入所需的文件名。

![](/files/Ge4bOh6v1izUCmFV6rWB)

在这个新文件中，我们将粘贴如下代码：

```
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.17;

contract Counter {

    // Public variable of type unsigned int to keep the number of counts
    uint256 public count = 0;

    // Function that increments our counter
    function increment() public {
        count += 1;
    }

    // Not necessary getter to get the count value
    function getCount() public view returns (uint256) {
        return count;
    }

}

```

如果您曾经写过程序，应该可以轻松猜到这个程序是做什么的。 下面按行解释：

* 第 3 行：定义了一个名为`Counter`的合约。
* 第 6 行：我们的合约存储了一个无符号整型`count`，从 0 开始。
* 第 9 行：第一个函数将修改合约的状态并且`increment()`变量 `count`。
* 第 14 行，第二个函数是一个 getter 函数，能够从智能合约外部读取`count`变量的值。 请注意，因为我们将`count`变量定义为公共变量，所以这个函数是不必要的，但它可以作为一个例子展示。

第一个简单的智能合约到此结束。 正如您所知，它看上去像是 Java、C++这样的面向对象编程语言中的一个类。 现在可以运行我们的合约了。

### 部署合约 <a href="#deploying-our-contract" id="deploying-our-contract"></a>

当我们写了第一个智能合约后，我们现在可以将它部署在区块链中并运行它。

在区块链上部署智能合约实际上只是发送了一个包含已编译智能合约代码的交易，并且没有指定任何收件人。

我们首先点击左侧的编译图标来[编译合约](https://ethereum.org/zh/developers/docs/smart-contracts/compiling/)：

![](/files/3Qvup6AaexW4Fxc1Xbp1)

您可以选择“自动编译”选项，这样当您在文本编辑器中保存内容时，合约始终会自动编译。

然后切换到部署和运行交易屏幕：

![](/files/TQPNGGj70KWaomaP5HF1)

在“部署和运行交易”屏幕上，仔细检查显示的合约名称并点击“部署”。 在页面顶部可以看到，当前环境为“JavaScript VM”，这意味着当前我们在本地测试区块链上部署智能合约并交互，这样测试可以更快，也不需要任何费用。

![](/files/n7GbRFqrkj9VC2qVUaoR)

点击“部署”按钮后，您可以看到合约在底部显示出来。 点击左侧的箭头展开，可以看到合约的内容。 这里有我们的变量`counter`、函数`increment()`和 getter `getCounter()`。

如果您点击`count`或`getCount`按钮，它将实际检索合约的`count`变量的内容，并显示出来。 因为我们尚未调用`increment`函数，它应该显示 0。

![](/files/RCjX3YbHQPlnpXPyEQK2)

现在点击按钮来调用`increment`函数。 您可以在窗口底部看到交易产生的日志。 当按下检索数据按钮而非`increment`按钮时，您看到的日志有所不同。 这是因为读取区块链的数据不需要任何交易（写入）或费用。 因为只有修改区块链的状态需要进行交易。

![](/files/f0nWWQ3jtLV1fJy5mT6F)

在按下 increment 按钮后，将产生一个交易来调用我们的`increment()`函数，如果我们点击 count 或 getCount 按钮，将读取我们的智能合约的最新状态，count 变量大于 0。

![](/files/4jJb4pbcjkq3lufb405x)

在下一个教程中，我们将论述如何发布 [PRC-20 Token](/zhong-wen-jian-ti/kai-fa-zhe/fa-bu-prc20-token.md)
