前言
本文要求你对Solidity开发有一点基础的了解。
我会使用Solidity开发一个简单的众筹智能合约,合约的主要功能就是向希望给我捐赠的人收钱,然后我再将钱从合约账户里取出来。
因为程序简单,这里使用Remix在线IDE进行智能合约的开发。
基本结构
打开Remix后,在contracts文件夹中创建「FundMe.sol」的文件,在FundMe.sol中,通过solidity写入捐款的代码,如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract FundMe {
// 通过address可以找到uint256
mapping(address => uint256) public addressToAmountFunded;
function fund() public payable {
// 记录消息发送者的地址和其发送的金额
addressToAmountFunded[msg.sender] += msg.value;
}
}
solidity使用//来表示注释,这点与JavaScript相同,这里第一行注释主要用于声明你代码的开源协议,通常使用MIT协议。
然后通过pragma关键字指定这次编写智能合约时,要使用的版本,这里使用0.6.0以上的版本,注意^0.6.0表示大于等于0.6.0小于0.7.0,即你不可以使用大于0.7.0版本的solidity编译器来编译该文件。
然后通过contract关键字来定义智能合约主体,这类似于Java中class的概念,在contract中,我们可以定义变量,也可以定义函数(function)。
之所以说它像Java中的class而不是Python中的class,是因为Solidity对函数与变量提供了四种可见性的关键字,分别是:
public:可以在合约内部或外部进行调用
interal:函数只能在合约内部调用,类似于Java的protected
external:函数只能在合约外部被调用
private:只能在当前合约内使用,继承的合约也不可访问。
回到代码,在contract中,通过mapping关键字,定义了mapping结构,其实就是key->value的结构,mapping(address => uint256)表示key的类型是address(地址),value的类型是uint256(无符号整型)。
通过function关键字,定义了一个名为fund的函数,使用public让函数暴露出去,任何人都可以调用该方法,因为要实现转账,所以还需要使用payable关键字,该关键字会将函数变为转账函数,即调用该方法的账号可以实现将自己账号中的钱转到智能合约的账号上。
为了方便知道谁对这个合约转了账,转了多少钱,这里通过msg.sender获得调用该函数的人以及通过msg.value方法获得调用者要转多少钱。
solidity中之所以使用msg关键字来获取调用者信息,是因为调用一次智能合约中的函数,相当于发送一次消息。
代码弄到Remix上,如下图:
使用Remix的好处就是,你不需要考虑编译部署的问题,Remix已经提供了相关的功能,首先看一下编译,如下图:
COMPILER需要选择大于等于0.6.0小于0.7.0的,然后点击Compile FundMe.sol就完成编译了。
编译完后,我们还需要将这个智能合约部署到链上,如下图:
上图中,ENVIRONMENT选择了JavaScript VM,即部署到本地由JavaScript VM虚构的区块链网络中,这通常是必要的一步,用于对智能合约中的逻辑进行测试,然后选择要部署的合约,即CONTRACT选项,因为FundMe.sol中只有一个合约,所以暂时无需关心。点击Deploy,则完成部署,如下图:
从图中可以看出,部署后,我们可以获得智能合约的地址,以及我们通过public暴露出的函数和变量,其中fund函数是红色按钮,因为有payable关键字,该方法与支付相关。
普通的变量或方法是蓝色的,但还有一种颜色的按钮,我们增加一些代码来看看,如下图:
上图中,通过struct关键字定义了一个新的对象,新的对象有自己的属性,基于People对象我们定义了p