主页 > imtoken交易所下载 > 第一行代码:以太坊(三)——使用更多工具编写和测试智能合约

第一行代码:以太坊(三)——使用更多工具编写和测试智能合约

imtoken交易所下载 2023-06-07 07:02:01

《第一行代码:以太坊》开始连载

上面已经使用Remix环境运行和测试了本书编写的第一个智能合约程序,但是编写和测试智能合约的方式有很多,比如在testrpc环境下测试; 使用Intellij IDEA集成开发环境中的Solidity语言编写智能合约; 在纯网络环境中测试智能合约; 使用AJAX测试智能合约等,本文将详细介绍这些编写和测试智能合约的方法。

1. 安装本地混音环境(Windows、Mac OS X 和 Linux)

本节使用Remix环境运行测试Calc智能合约,但使用的是在线Remix环境。 由于一些原因(比如没有网络,或者网速很慢),我们想使用本地的Remix环境来运行和测试智能合约,这就需要在本地安装Remix环境。 Remix是跨平台的,所以本节介绍的安装方法适用于Windows、Mac OS X和Linux。

无论您在什么操作系统上安装 Remix,都必须安装 Node.js。 读者可以下载最新版本的Node.js直接安装。

安装 Node.js 后,您需要使用 git 命令下载 Remix 代码库(browser-solidity)。 命令行如下:

混帐克隆

在Mac OS X和Linux下,一般都集成了git命令,但是在Windows下,默认是没有git命令的,所以需要从如下页面下载Windows版的git工具,下载后直接安装。

使用git命令下载Remix代码库后,使用cd命令进入browser-solidity目录,该目录是下载Remix代码库时在当前目录下自动创建的。

在browser-solidity目录下执行如下命令安装browser-solidity。

npm 安装

browser-solidity安装过程比较长,请读者耐心等待。 下图是Windows下安装browser-solidity环境的效果。

image.png

如果browser-solidity安装成功,可以使用如下命令启动Remix服务。

npm 开始

下图是Mac OS X下启动Remix服务后的输出信息,Windows和Linux也会输出类似的信息。

image.png

Remix服务默认端口号为8080,在浏览器地址栏输入以下网址,即可使用本地Remix环境编写和测试智能合约。

:8080

2.安装testrpc

Testrpc 与 geth 不同。 geth是真实的以太坊环境,而testrpc是本地模拟的以太坊环境,主要用于开发调试。 使用testrpc调试智能合约后,即可部署到真实的以太坊环境中。

安装testrpc还是需要Node.js环境的,所以请读者提前安装好Node.js以太坊可以运行智能合约,然后使用如下命令安装testrpc。

npm 安装-g ethereumjs-testrpc

安装testrpc后,可以使用testrpc命令运行testrpc。 下图是Mac OS X下启动testrpc服务的效果。

image.png

下图是Windows下启动testrpc服务的效果。

image.png

我们可以看到无论在哪个平台启动testrpc服务,都会自动生成10个账户(Accounts)和10个私钥(Private Keys)。 这些账户和私钥是用来测试的,每个账户都有几乎无限的以太币,所以不用担心进行一些操作后没有以太币可用。

testrpc本身是一个服务,默认的端口号是8545,这个端口号是web3.js、web3.py等程序库用来连接以太坊节点的,testrpc其实相当于一个以太坊节点用于测试。

3.使用testrpc测试智能合约

本节将智能合约部署到testrpc服务,然后使用web3.js连接testrpc服务,调用智能合约中的函数。 具体操作步骤如下:

(1) 编写智能合约

启动本地Remix环境,然后在Remix环境中输入如下智能合约代码。

本例中编写了一个名为 Factorial 的智能合约程序。 智能合约中有一个阶乘函数,用于计算n的阶乘。

pragma solidity ^0.4.0;
contract Factorial 
{
    /*  计算n的阶乘  */
   function factorial(uint n) returns (uint)
   {
        if (n == 0 || n == 1)
            return 1;
        else
            return n * factorial(n - 1);
    }
}

该智能合约用于计算 n 的阶乘。

(2) 在testrpc节点上部署智能合约

进入Remix环境右侧的“运行”页面,在“环境”列表中选择“Web3 Provider”,如下图。

image.png

在 Web3 Provider 环境中,Remix 可以直接将智能合约部署到 testrpc 服务中。 在进入Web3 Provider之前,会弹出一个对话框,询问是否连接以太坊节点,点击“确定”按钮,会弹出如下图所示的对话框。 对话框中有一个文本框,默认值为:8545,如果要连接本地testrpc节点或以太坊节点,点击“确定”按钮即可。 如果testrpc节点已经启动,Remix本地环境会成功连接到testrpc节点。

image.png

单击“运行”页面上的“部署”按钮会将 Factorial 智能合约部署到 testrpc。 部署成功后,“运行”页面底部会出现“阶乘”按钮,如下图所示。 在按钮右边的文本框中输入n的值计算阶乘,然后点击这个按钮在以太坊测试环境(testrpc)中执行阶乘函数,但是点击“Details”按钮后日志区,没有看到factoria函数的输出,因为factoria函数直接运行在以太坊网络上,所有数据都存在于以太坊网络中,并没有直接将数据返回给以太坊客户端。

“factorial”按钮上方是 Factorial 智能合约的地址。 如果你想在客户端访问这个智能合约,你需要使用这个地址。

image.png

(3) 安装Solidity编译器

Solidity编译器用于编译Solidity源代码文件(.sol文件),可以将Solidity源代码文件编译成各种目标文件。 可以使用下面的命令行安装 Solidity 编译器。

npm 安装 -g solc

(4)编译Solidity源码文件

在当前目录下创建一个 Factorial.sol 文件,然后将例 3.2 中的代码复制到 Factorial.sol 文件中。 接下来,将使用上一步中安装的 Solidity 编译器编译 Factorial.sol 文件。 注意,虽然安装了solc,但是编译命令行工具是solcjs。 该工具可以将Solidity源代码文件编译成各种目标文件。 本例只需要abi文件,即智能合约的接口文件。 也就是说,使用Web3.js调用智能合约,需要使用abi文件调用智能合约中的函数。

使用以下命令将 Factorial.sol 文件编译成 abi 文件。 其中--abi为命令行参数,表示生成的目标文件类型为abi。

solcjs --abi 阶乘.sol

执行以上命令后,会在当前目录下生成一个Factorial_sol_Factorial.abi文件,即Factorial.sol对应的abi文件。

(5) 安装Web3.js

在使用 Web3.js 之前,您必须安装 Web3.js。 Web3.js是Node.js的一个模块,所以需要使用如下命令安装。

npm 安装 web3

使用上述命令将安装最新版本的 web3。 如果读者不习惯使用最新版本的web3,可以使用如下命令安装指定版本。

npm 安装 web3@0.20.6

(6) 将testrpc节点与Web3.js连接

现在执行node命令进入Node.js REPL环境(命令行交互环境),然后在Node REPL环境中执行以下命令。 需要注意的是,在执行这些命令之前,必须先启动testrpc节点,并使用Remix环境将Example 3.2中的智能合约部署到testrpc节点上。

> var Web3 = require("web3");
> var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); 
undefined
> var eth = web3.eth
undefined
> var abi = JSON.parse(fs.readFileSync("Factorial_sol_Factorial.abi").toString());
undefined
> var contract = eth.contract(abi);
undefined
> var instance = contract.at('0x371f45db1a077bbcbeb50d2a21bc85e4e18c1f1f')
undefined
> instance.factorial.call(3)
{ [String: '6'] s: 1, e: 0, c: [ 6 ] }
> instance.factorial(10, {from:eth.accounts[0]})
'0xbb291fec53c4c5aefc87e2d7e8475c4abd4c54d03ef06e857665a10db0c1a3ff'

上面内容中,“>”表示命令提示符,后面是输入代码,下面的输出值,undefined是Node输出的,表示当前语句不输出任何东西(定义变量的JavaScript语句不会输出任何事物)。 从这几行代码我们可以了解到,通过Web3.js连接testrpc节点的核心步骤(与连接以太坊节点的步骤相同)如下。

(1)导入web3模块以太坊可以运行智能合约,代码如下:

var Web3 = require("web3");

(2)创建Web3类的实例,通过该类的构造函数参数指定testrpc节点的Url(IP和端口号),代码如下:

var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

(3)读取Factorial_sol_Factorial.abi文件内容,将文件内容转换为JSON对象。 代码如下:

var abi = JSON.parse(fs.readFileSync("Factorial_sol_Factorial.abi").toString());

(4)使用abi创建智能合约对象,代码如下:

var contract = eth.contract(abi);

(5)将智能合约与部署在testrpc中的智能合约进行绑定,代码如下:

var instance = contract.at('0x371f45db1a077bbcbeb50d2a21bc85e4e18c1f1f')

at方法的参数值为图3-12所示factorial方法上方的智能合约地址,也是以太坊中唯一可以定位到具体智能合约的标识。 单击地址右侧的按钮可将该地址复制到剪贴板。

(6) 在本地调用智能合约中的阶乘函数,代码如下:

instance.factorial.call(3)

在本地调用智能合约不会对以太坊网络产生任何影响。 在本地调用智能合约中的函数,会直接输出函数的返回值。 如果函数返回数字类型,它将作为 BigNumber 类型返回。 这是一个 JavaScript 扩展,允许 JavaScript 操作任何值。 本书稍后将介绍 BigNumber 类型。 章节进行了详细解释。

执行上面的代码会输出如下内容。 显然,3的阶乘是6。

[String: '6'] s: 1, e: 0, c: [ 6 ] }

(7) 调用以太坊网络上的智能合约,代码如下:

instance.factorial(10, {from:eth.accounts[0]})

在以太坊网络上调用智能合约的函数,在客户端不会直接获取函数的返回值,而是会获取如下交易地址。

0xbb291fec53c4c5aefc87e2d7e8475c4abd4c54d03ef06e857665a10db0c1a3ff

因为在以太坊网络上进行的任何操作都被视为一笔交易,既然有交易,就需要有交易地址,可以根据交易地址通过相应的API查询交易状态。 以太坊网络中的地址有很多种,比如矿工地址、智能合约地址、交易地址等,每一种地址都由若干个十六进制数字组成,但不同类型的地址的位数可能不同。

在真实的以太坊网络中,任何一笔交易都需要矿工进行挖矿处理,每笔交易都会给予完成工作的矿工一定的奖励,即矿工的挖矿收益。 但由于testrpc节点是模拟以太坊网络挖矿,所以不需要挖矿,直接执行以太坊网络上的操作。 因此,如果客户端连接到testrpc节点,事务发起后会立即执行。 另外,在以太坊网络上调用智能合约时,需要指定是谁(代表用户的地址)发起的交易,因为在实际的以太坊网络中,相应的以太币是从这个地址扣给矿工的。 此示例使用由 eth.accounts[0] 指定的地址。 其中eth.accounts可以获取到testrpc节点启动时产生的10个测试账户的地址,eth.accounts[0]是第一个测试账户的地址。

从本节案例来看,客户端访问以太坊网络的步骤分为两步:连接以太坊节点和发起交易。 回报)。

3.2.4 Intellij IDEA Solidity插件

无论是 Remix、Windows 记事本,还是其他文本编辑器,都不会用于开发复杂的智能合约。 一是界面不友好,二是没有必要的智能提示功能,而且如果智能合约代码量大,可能会导致Remix死掉。 因此,以上介绍的工具仅用于测试智能合约,不用于开发实际的智能合约项目。 如果要开发大型智能合约项目,通常会使用本地IDE,比如Intellij IDEA。 这个IDE最初是为了Java项目的开发而推出的,但是由于Intellij IDEA支持第三方插件,所以Intellij IDEA理论上可以支持任何编程语言。

很多读者可能对 Intellij IDEA 并不熟悉。 其实这个IDE就是大名鼎鼎的JetBrains公司推出的。 如果你不了解 JetBrains 及其产品,那么你一定对 Android 和 Google 推出的 Android 开发工具 Android Studio 不陌生。 Android Studio是在Intellij IDEA社区版的基础上开发的。 此外,JetBrains 还开发了著名的 Kotlin 语言,该语言现已成为官方推荐的开发 Android App 的编程语言。

读者可以到以下页面下载Intellij IDEA的免费版(社区版)。

Solidity语言也提供了Intellij IDEA插件,推荐使用在线安装方式。 如果是Mac OSX版本的Intellij IDEA,点击左上角IntelliJ IDEA菜单的Preferences菜单项,如下图。

image.png

如果是Windows版的Intellij IDEA,需要点击File菜单的Settings菜单项。 点击该菜单项后,会弹出Preferences(设置)窗口,如下图所示。

image.png

Preferences 窗口中间的列表列出了 Intellij IDEA 安装的所有插件。 点击窗口下方的Browse repositories按钮,会弹出Browse Repositories窗口,在窗口左上角的文本框中输入Solidity,会在线搜索相关插件,如图下图,如果找到,右边会显示当前选中的插件 详情,如果没有安装插件,右边会显示安装按钮,点击安装按钮安装插件.

image.png

安装插件后,在Intellij IDEA中创建Java或其他项目(Solidity插件不提供Solidity项目),然后在项目右键菜单中点击新建菜单项,子菜单将显示如下图所示。 在子菜单上,您会找到一个智能合约菜单项。

image.png

点击Smart contract菜单项,会弹出如下图所示的New Solidity File窗口。 从种类列表框中,您可以选择 Solidity 文件类型(智能合约或 Solidity 库)。 在此示例中,选择智能合约。

image.png

在Name文本框中输入Solidity文件名后,点击OK按钮创建Solidity文件。 然后在Intellij IDEA左侧的项目树中双击刚才创建的Solidity文件,右侧会显示代码编辑区,如下图输入Solidity代码。

image.png

虽然在Intellij IDEA中可以写Solidity代码,也支持代码高亮和智能提示,但是编译Solidity源码文件还是需要切换到终端,使用solcjs命令编译,非常麻烦,所以在接下来本节我将教大家如何使用 solcjs 命令集成到 Intellij IDEA 中,无需切换到终端即可编译 Solidity 源代码文件。

5.集成Solidity编译工具与Intellij IDEA

Intellij IDEA 有一个扩展的工具功能,可以将可执行程序与Intellij IDEA 集成在一起,即这些程序可以在不切换到终端的情况下执行。

现在打开首选项窗口(Windows 中的设置窗口),然后在左侧区域找到“工具”>“外部工具”节点。 点击该节点后,右侧会显示当前集成的扩展工具列表,默认为空。 然后点击该区域下方的“+”按钮,会弹出一个Create Tool窗口,在窗口中需要填写以下4个字段。

填充后的效果如下图所示,最后点击确定按钮创建扩展工具。

image.png

创建扩展工具应该了解以下几点。

如果是Mac OS X下,$OutputPath$指向工程目录的out子目录,生成的工程相关文件都放在该目录下,目录结构与src目录相同。 图3-20是out目录的结构。 注意读者机器上的目录结构可能不同,但是.abi和.bin文件都在out/production目录或其子目录下。

image.png

如果是Windows下,solcjs文件无法执行,因为这个文件在Mac OS X和Linux上使用,Windows下是solcjs.cmd,所以把Program改成solcjs.cmd。 Windows版的Intellij IDEA没有内置$OutputPath$变量,所以可以把这个变量改成其他值,比如$FileDir$,这样.abi和.bin文件就会在同一个目录下生成作为 .sol 文件。 所以windows版的Intellij IDEA需要按照以下内容设置扩展工具。

如上设置扩展工具后,选择一个.sol文件(假设文件名为MyCalc.sol,里面的智能合约名称为Calc),在Intellij IDEA的Tools > External Tools菜单中出现solidity菜单项,如图3-21所示,点击该菜单项会调用solcjs编译MyCalc.sol文件,并在相应目录下生成MyCalc_sol_Calc.abi和MyCalc_sol_Calc.bin文件。

image.png

其实你也可以在项目的右键菜单中找到External Tools > solidity菜单项,如下图,点击这个菜单项也是一样的效果。

image.png