# 1.4 智能合约的部署与执行

&#x20;如果智能合约编译成功后，我们可以将它部署在以太坊主网上。但由于智能合约的特殊性，一旦其部署到以太坊主网，将无法再修改，为了避免这个问题，通常我们将合约部署到以太坊主网之前，要先进行本地测试。在这一节我们使用几种方式做测试。

## 1.4.1 在本地部署和执行智能合约

### 1.4.1.1 在本地部署智能合约

&#x20;在Remix主页面，我们点击“Run”，进入另一个界面，会看能达到“Deploy”按钮，如下图所示。

![](/files/-LpKXoHsxJd8hvr98WoG)

&#x20;我们做测试，在“Environment”那一栏选择“JavaScript VM”，然后在“Account”那一栏选“0xca3…”，再点击“Deploy”将看到如下界面：

![](/files/-LpKXoHt76hdmlaY8QDd)

&#x20;点击上图中所标示的展开按钮会看到合约中定义为“public”的两个函数“setData”和“getData”，如下图所示。

![](/files/-LpKXoHuTVfXuHkdmyJz)

&#x20;此时，这个合约已经在我们的测试环境中部署好了。实际上在以太坊上部署一个合约就是一笔交易，我们在窗口底下点击“Debug”右边的下拉箭头可看到详细信息，下拉箭头的位置如下图所示：

![](/files/-LpKXoHvhDIEihaRd0eg)

&#x20;点击该箭头可看到交易的详细信息，如下图所示：

![](/files/-LpKXoHwMzuTKGfKBTfB)

### 1.4.1.2 在本地执行智能合约

&#x20;我们成功在本地部署了智能合约后，下一步就要来运行测试智能合约。

&#x20;首先我们检查“Account”。继续选择我们部署合约时用到的账户“0xca3…”。然后把鼠标移到页面右下角“getData”，点击该函数，执行成功我们会看到“0: uint256: retVal 0”，如下图所示：

![](/files/-LpKXoHxjvgiirNJj_kh)

&#x20;这个结果表示函数“getData”执行成功，也即是合约执行成功，返回目前合约内存储的值为“0”。

&#x20;下一步我们来检查函数“setData”是否能执行成功。我们把鼠标移到“setData”右边的空格，输入数字“10”，然后点击函数“setData”。然后再点击函数“getData”，如果执行成功，会看到“0: uint256: retVal 10”，如下图所示：

![](/files/-LpKXoHy7mOuhHo08Y4a)

&#x20;这证明我们刚刚输入的值“10”被成功写入到合约并且被成功读出。至此我们的合约已经成功进行了本地测试。

## 1.4.2在MetaMask部署和执行智能合约

刚刚我们在本地进行了测试，在这一节，我们介绍更进一步，介绍在以太坊测试网上进行测试。我们要用到以太坊的钱包客户端MetaMask。

### 1.4.2.1 安装MetaMask

&#x20;MetaMask是浏览器端的以太坊钱包，可以连接以太坊测试网和主网。用户可自行在搜索引擎中搜索MetaMask插件并安装。目前MetaMask仅支持谷歌的chrome浏览器，火狐的firefox浏览器和Opera浏览器。

&#x20;安装好MetaMask后，其界面如下：

![](/files/-LpKXoHzE5r5ezyt1zCn)

### 1.4.2.2 选择以太坊测试网

在MetaMask上输入密码进入MetaMask。找到左上角的“Main Network”，如下图所示：

![](/files/-LpKXoI-R3d34S30Pg7x)

点击“Main Network”右边下拉箭头选择测试网，如下图所示：

![](/files/-LpKXoI05KKicSj-vJ9J)

&#x20;选择“Ropsten Test Network”，Remix页面会弹出对话框询问是否要重新加载，选择“是”让页面重新加载。 此时我们再回到Remix页面，点击“Run”会在“Account”一栏看到我们MetaMask的钱包地址被自动填进了“Account”，同时“Environment”这一栏被自动设置成了 “Injected Web3”。

### 1.4.2.3 部署智能合约

&#x20;我们在Remix的“Run”页面点击“Deploy”会弹出MetaMask的弹出窗口，如下图所示。

![](/files/-LpKXoI1Y0j-7cchffiL)

&#x20;在MetaMask的窗体上点击“SUBMIT”（如下图所示）就可以将智能合约部署在以太坊测试网上了。

![](/files/-LpKXoI2l4ZhC3p7oXsG)

&#x20;稍等片刻，若部署成功将会看到成功部署的界面。

### 1.4.2.4 执行智能合约

&#x20;职能合约部署成功后，其执行的步骤和前面章节在本地部署后执行是一样的 。在此不再赘述。

## 1.4.3 在以太坊主网部署和执行智能合约

&#x20;下面，我们将真正地把我们的智能合约部署到以太坊主网上进行测试。在运行下列步骤前，请确保您的MetaMask钱包中有足够的以太币余额。

### 1.4.3.1 选择以太坊主网

在MetaMask上输入密码进入MetaMask。找到左上角“Main Network”，如下图所示：

![](/files/-LpKXoI3Ru5LpLmijdiE)

&#x20;点击“Main Network”右边下拉箭头选择“Main Ethereum Network”，如下图所示：

![](/files/-LpKXoI4HOiswCIjY-do)

&#x20;选择“Main Ethereum Network”后，Remix页面会弹出对话框询问是否要重新加载，选择“是”让页面重新加载。 此时我们再回到Remix页面，点击“Run”会在“Account”一栏看到我们MetaMask的钱包地址被自动填进了“Account”，同时“Environment”这一栏被自动设置成了 “Injected Web3”。

### 1.4.3.2 部署智能合约

&#x20;我们在Remix的“Run”页面点击“Deploy”会弹出确认窗口，如下图所示。

![](/files/-LpKXoI5npJYRgmxlnNN)

该窗口提示用户，即将在以太坊主网上部署智能合约，这将花掉用户的一部分以太坊代币。我们点击图中红框标注的“Confirm”确认要部署。然后出现以下弹出窗口：

![](/files/-LpKXoI6L4XWlKGOt6qK)

&#x20;请注意：在MetaMask弹出窗口的“Max Total”这一栏中我们将看到部署此合约要花费大概0.11美元。我们点击窗体上的“SUBMIT”就可以将智能合约真正部署在以太坊主网上了。同时我们在MetaMask中可以看到该合约的部署信息，如下图所示：

![](/files/-LpKXoI7myPJyVmWJ0Dy)

&#x20;稍等片刻，若部署成功将会看到如下界面。此界面和测试版有个显著的不同，在图中我们标注了以太坊浏览器信息，我们可以点击该链接打开浏览器页面查看该部署交易的详细信息。

![](/files/-LpKXoI88IjbJwPp6fpw)

### 1.4.3.3 执行智能合约

&#x20;执行该智能合约和前述在本地测试执行智能合约的方法与步骤一样，在此，我们不再赘述。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://u.naturaldao.io/solidity/deploy.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
