【web3】03. 第一个智能合约

237 阅读3分钟

开发智能合约使用 Solidity 语言,官方文档:docs.soliditylang.org/

1. 第一个智能合约示例

首先打开 Ganache 和 Remix(不知道的参考博客 01),配置好 Remix 调用 Ganache 的地址,新建一个自己的 workspace,然后在下面的 contracts 里面添加一个 hello.sol,内容如下:

// SPDX-License-Identifier: GPL-3.0
/**
 * 测试用智能合约 1
 */

 pragma solidity ^0.8.0;

 contract Hello {
     string private name;

     constructor(string memory _name) {
         name = _name;
     }

     function hello() public view returns (string memory, string memory) {
         return ("Hello, " , name);
     }
 }

写完后,在 Remix 左侧点击编译:

image.png

然后点击部署,并在部署的按钮中填入用户名:

image.png

然后展开下面的 Deployed Contracts,看到你部署好的智能合约,并展开发现有个 hello 方法,点击 hello 方法即可执行:

image.png

可以看到,点击 hello 方法,输出了两个值,分别是 Hello, 和 Daliji

2. 第一个智能合约解释

我们类比面向对象语言,比如 Java 语言来学习 Solodity。

合约的第一行// SPDX-License-Identifier: GPL-3.0是一个针对 License 的声明,这个是官方建议写的,为什么需要开源协议?因为智能合约运行的时候实际上都是开源的,而针对 GPLV3 也能很好保护开源版权。

合约的注释与 C++、Java 等语言没有区别。

针对 pragma 的声明,比如 pragma solidity ^0.8.0;,是用来声明合约编译的版本,^0.8.0 表示使用 0.8.x 版本 Solodity 来编译智能合约,其声明语义与 node 的类似。

合约主体声明:类似面向编程的 class 关键字,智能合约主体为 contract 表示合约的意思。

变量声明,与 Java 类似,变量具有可见性,比如:string private name; 表示字符串类型的变量,可见性私有,变量名称为 name。

构造方法声明,构造方法使用特殊语法 constructor,如果后面要跟参数的话,可以在后面加小括号参数,不跟参数的话没必要加小括号,比如:

// 不带参数的构造方法
constructor {}

// 带参数的构造方法
constructor(uint8 a) {}

在本例中,参数为 string 类型,参数名称为 _name,具体 memory 的含义以后再说。

构造方法在合约部署的时候调用,比如刚才的例子,部署合约的时候填入一个参数即可,部署合约之后构造方法就不会再调用了。

普通方法,以 function 开头,后面跟方法名称、方法参数、可见性、其他修饰符、返回声明,在函数体中写具体的逻辑。不同于 Java,Solodity 可以返回多个值,多个值只需要用小括号包起来即可。

函数的返回参数名称也可以在方法的返回声明中写清楚,比如上述示例 hello 函数的两种写法:

// 写法1:返回参数在函数体中 return
function hello() public view returns (string memory, string memory) {
    return ("Hello, " , name);
}

// 写法2:返回参数名称在返回声明中,效果与方法1是一样的
function hello() public view returns (string memory _a, string memory _b) {
    _a = "Hello, ";
    _b = name;
}

可以试着改以上智能合约,使得返回更多内容。