|
智能合约是以太坊网络上运行的程序,它和其他的程序一样,也是代码和数据(状态)的集合,因此智能合约的开发与使用其他语言开发的项目并无特别大的差异。 本文主要讲解Windows系统中基于Truffle框架的智能合约开发环境搭建,同时开发语言采用Solidity编程语言。 |
环境准备
Nodejs安装
首先需要安装Nodejs,Nodejs是一个基于google浏览器Chrome里面的JavaScript引擎(V8)的一个平台,可以很容易的构建快速而具有扩展性的网络程序。
Nodejs建议使用安装版,然后其余的配置建议自行百度。下图是笔者安装的版本号:
Truffle安装
Truffle是以太坊最流行的开发框架,基于Javascript,对客户端做了深度集成,能够在本地编译、部署智能合约。同时提供了一套类似maven或gradle这样的项目构建机制,能自动生成相关目录,默认是基于Web的。Truffle致力于让开发更容易。
在CMD命令行中输入npm install -g truffle进行安装,完成后在命令行中输入truffle version验证是否安装成功,如下图所示:
同时可发现已经生成truffle安装包,如下图所示:
Ganache安装
Ganache前身testRPC,用于以太坊开发的个人区块链(私有链),可用于部署、开发应用程序和运行测试。主要分为两个版本,一个是图形界面版一个是命令行版(ganache-cli,可用过Nodejs进行安装),本文采用图形界面版。
从官网上下载最新的图形界面安装程序,一路Next便可安装成功。打开界面后,进行环境配置(主要配置项在Server一栏),如下图所示:
记住3个红框内的配置项,这与后面的发布密切相关。
WebStorm安装
WebStorm 是jetbrains公司旗下一款JavaScript开发工具。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。
安装完毕后,继续安装solidity 语言插件,File-》Settings-》Plugins中输入solidity,找到相应的插件后进行安装,如下图所示:
智能合约的开发与部署
项目初始化
打开WebStorm软件,新建一个空的项目,在Terminal(命令行)界面中输入truffle init进行初始化操作,在执行前将新建项目所在文件夹内的所有内容进行删除。执行完毕后将自动生成一个完整的项目架构,如下图所示:
创建第一个智能合约
选中contracts目录右键,依次点击File-》New-》New Solidity File,输入文件名并选择Smart contract进行创建,如下图所示:
创建完毕后,进行编写智能合约,合约代码如下:
pragma solidity ^0.5.12;contract FirstContract {constructor() public{}function Helloworld(string memory str ) public pure returns(string memory){return str;}}
^0.5.12代表使用的Solidity语言的版本号。
constructor代表这个是构造函数。
public是函数可见性说明符中的一个类型,共分为4类:
public:内部、外部均可见。
private:仅在当前合约内可见。
external:仅在外部可见(仅可修饰函数),仅可用于消息调用(即使在合约内调用,也只能通过 this.func 的方式)。
internal:仅在内部可见(也就是在当前 Solidity 源代码文件内均可见,不仅限于当前合约内)。
memory标识变量存放的位置,共有三种memory、storage和calldata:
memory:告诉EVM应当在该函数运行时为变量临时创建一块空间,使其大小和结构满足函数运行的需要,被memory修饰的变量不会被存储在链中,可理解为值引用。
storage的变量,数据将永远存在于区块链上,函数内的修改会影响函数外的值,可理解为地址引用。局部变量的数据位置默认是storage,状态变量的数据位置强制是storage。
calldata:一般只有外部函数的参数(不包括返回参数)被强制指定为calldata。
pure为函数修饰符,表示函数不改变/不读取状态变量,所以函数执行不消耗gas了,修饰符共有3中,如下所示:
constant:表示函数内部不会修改变量。在早期Solidity语言中只有constant,由于其本身代表变量中的常量,不适合用来修饰函数,因此被拆分为view和pure。
view:功能与constant完全一样,可以在函数内修改状态变量,但在编译时会有警告提示。
pure:表示函数内部不会修改变量,但最为严格,pure完全禁止读写状态变量。如果函数内读取或修改状态变量,编译时会报错。
关联私有链
打开truffle-config.js文件,修改内容与将先前在Ganache软件中配置项一致,如下所示:
= {networks: {development: {host: "127.0.0.1",port: 7545,network_id: "5777",}}}
编译以及发布
打开migrations文件夹下的1_initial_migration.js文件,修改代码如下所示:
var FirstContract=artifacts.require("./FirstContract.sol")module.exports = function(deployer) {deployer.deploy(FirstContract);};
其中文件名以及类名需要与之前的一一对应。
进入Terminal(命令行)界面,输入truffle compile对文件进行编译,若编译成功则如下图所示:
继续在Terminal(命令行)界面中输入truffle migrate –reset命令发布智能合约,如下图所示:
如上图所示,显示了合约账户地址、事务号、合约地址、消耗等信息,打开Ganache软件同样可以查询到该信息,如下图所示:
合约的执行(互动)
在WebStorm软件Terminal(命令行)界面中输入truffle console命令进入truffle控制台。接着输入:FirstContract.deployed().then(instance => contract = instance)命令,然后输入:contract.Helloworld.call("nihao")命令(由于声明了pure因此与contract.Helloworld("nihao")等价,不需要直接调用call()方法,truffle会自动选用call来调用),可以看到返回字符串nihao,则表明合约调用成功,如下图所示:
说明:truffle console中预载了truffle-contract函数库,以方便操作部署到区块链上的合约。使用了FirstContract.deployed().then语句来取得FirstContract合约的Instance(实例),并存到contract变量中,以方便后续的调用。
|
本文主要讲解了如何在Windows平台下进行智能合约开发环境搭建的操作步骤。其核心在于使用Truffle框架,解决了集成、编译、部署等繁琐的操作。同时由于该框架基于Javascript,因此使用Nodejs进行统一安装以及管理。最后使用WebStorm开发工具并使用solidity语言进行智能合约的开发。 |

本文转载于上海市计算机软件评测重点实验室

