智能合约的编译、部署和测试
”这一部分,之后再来看这些文件的作用。
①node_modules/、package-lock.json和package.json
这些是node项目的必须组成部分,包括了项目的配置信息、安装的依赖模块等,这里可以先无视。
②contracts/Greeter.sol
这个文件是项目中的重点,叫智能合约文件。什么是智能合约呢?你可以把智能合约,同样理解为一种可以运行的程序。只不过这个程序比较特殊,它是运行在以太坊的EVM虚拟机(https://ethereum.org/zh/developers/docs/evm/)环境上。并且,程序本身、程序的输入输出、运行结果,对所有人可见。
Solidity语言,是智能合约开发的主流语言之一。Solidity语言的入门教程,不是本文涉及的重点,这里只是简单提一下。
简单用Java类比一下:原来你写了一段Java代码,放进一个源文件叫作HelloWorld.java,用javac执行编译,最终在自己的电脑或者服务器上,被JVM虚拟机执行;现在写了一段Greeter.sol代码,它也可以被编译,被执行,只不过运行环境变成了以太坊的EVM虚拟机。
初始化项目以后,自动生成的代码是这样的:
//SPDX-License-Identifier:Unlicense//声明licensepragma solidity^0.8.0;//定义版本号import"hardhat/console.sol";//导入其它智能合约文件contract Greeter{//定义一个合约,合约名字叫Greeter string private greeting;//这个合约的一个私有变量constructor(string memory _greeting){//合约的构造函数,//当且仅当合约被部署时,会被执行一次console.log("Deploying a Greeter with greeting:",_greeting);greeting=_greeting;}function greet()public view returns(string memory){//可以被外部调用的合约方法,view声明了这是个只读方法,//不会改变合约的状态return greeting;}function setGreeting(string memory _greeting)public{//这是一个写方法,会改变合约的状态,且外部调用时会消耗gas console.log("Changing greeting from'%s'to'%s'",greeting,_greeting);greeting=_greeting;}}
第1行声明了License,比如GPL-3.0;
第2行声明了编译器版本,这里面强制指定了版本不得低于0.8.0,也不能高于0.9.0;
第4行导入了其它合约文件,这里面的
hardhat/console.sol
文件,是Hardhat框架自带的,是一个用于方便调试的合约文件,源码在这里(https://github.com/NomicFoundation/hardhat/blob/master/packages/hardhat-core/console.sol);
第6行开始,就是合约文件的主体部分。从结构上看,它很像是在C++或者Java中定义一个类,也包括了字段变量、构造方法、读方法、写方法等。这里面出现了几个特殊的关键字:
contract:声明一个合约;
memory:和storage关键字相反,代表了变量只会临时放在内存中,不会存储在合约的状态中;
view:声明该方法为只读方法,不会改变合约本身的状态。
③scripts/sample_scripts.js
这个JavaScript文件的作用,是将刚才的
Greeter.sol
智能合约编译并部署到