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

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

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

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

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoHsxJd8hvr98WoG%2F0.png?generation=1569098256291592\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoHt76hdmlaY8QDd%2F1.png?generation=1569098256327785\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoHuTVfXuHkdmyJz%2F2.png?generation=1569098256266569\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoHvhDIEihaRd0eg%2F3.png?generation=1569098256305594\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoHwMzuTKGfKBTfB%2F4.png?generation=1569098256276091\&alt=media)

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

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

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoHxjvgiirNJj_kh%2F5.png?generation=1569098256269443\&alt=media)

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

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoHy7mOuhHo08Y4a%2F6.png?generation=1569098256271103\&alt=media)

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

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

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

### 1.4.2.1 安装MetaMask

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

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoHzE5r5ezyt1zCn%2F7.png?generation=1569098256274370\&alt=media)

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

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI-R3d34S30Pg7x%2F8.png?generation=1569098256273815\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI05KKicSj-vJ9J%2F9.png?generation=1569098256303657\&alt=media)

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

### 1.4.2.3 部署智能合约

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI1Y0j-7cchffiL%2F10.png?generation=1569098256334337\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI2l4ZhC3p7oXsG%2F11.png?generation=1569098256283217\&alt=media)

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

### 1.4.2.4 执行智能合约

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

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

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

### 1.4.3.1 选择以太坊主网

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI3Ru5LpLmijdiE%2F12.png?generation=1569098256279083\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI4HOiswCIjY-do%2F13.png?generation=1569098256381448\&alt=media)

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

### 1.4.3.2 部署智能合约

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI5npJYRgmxlnNN%2F14.png?generation=1569098256307230\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI6L4XWlKGOt6qK%2F15.png?generation=1569098256346545\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI7myPJyVmWJ0Dy%2F16.png?generation=1569098256361014\&alt=media)

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

![](https://2212368770-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fvyper-smart-contracts%2F-LpKU14f-HKk5cg1QFuq%2F-LpKXoI88IjbJwPp6fpw%2F17.png?generation=1569098256273483\&alt=media)

### 1.4.3.3 执行智能合约

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