从 Counter 合约看代码结构 - Solidity 教程连载

  • DeCert.me
  • 更新于 2023-05-29 12:33
  • 阅读 2037

从第一个 Counter 智能合约看合约代码结构

在前面了解了 MetaMask 和 Remix 的使用,也了解了Solidity智能合约如何编译及部署。

本文我们来从代码层面来分析下,看看一个合约代码由哪些部分组成,为后面编写合约代码打下基础。

在学习智能合约时,通常以 Counter 计数器作为入门合约,而不是通常打印 HelloWorld, 这个因为合约主要是用来处理状态的转换,另外,合约程序实际上是在节点上运行,因此是看不到打印输出的。

Counter 代码

先之前介绍过的 Counter 代码:

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Counter {
    uint counter;

    constructor() {
        counter = 0;
    }

    function count() public {
        counter = counter + 1;
    }

    function get() public view returns (uint) {
        return counter;
    }
}

通常一个智能合约sol文件会包含以下几个部分:

(0)声明合约源文件的 License 声明;

(1)声明编译合约使用的编译器版本;

(2)用 import 引入其他合约文件

(3)用contract定义一个合约/用library定义一个库/用 interface 定义接口。

(4)定义合约内的状态变量、函数、事件、自定义类型等。

License 许可声明

// SPDX-License-Identifier: MIT

因为合约代码通常都是开源的,进行许可声明以表明其他人可以如何使用这份代码。

编译器版本声明

pragma solidity ^0.8.0;

关键字 pragma 的含义是:用来告诉编译器如何编译这段代码,^表示能高于0.8.0, 但是必须低于0.9.0,即只有第三位的版本号可以变。类似的还可以使用如:

pragma solidity >=0.8.0 <0.9.0;

Solidity中编译器的版本的声明,表达式遵循npm版本语义,可以参考 https://docs.npmjs.com/misc/semver。

定义合约

contract Counter {
}

这句定义了一个合约,合约的名字为 Counter(和其他语言定义的“类”很相似), 一个合约通常又是由状态变量(合约数据)合约函数组成

状态变量

uint counter;

这行代码声明了一个变量,变量名为counter,类型为uint(一个256位的无符号整数),它就像数据库里面的一个存储单元。在以太坊中,所有的变量构成了整个区块链网络的状态,所以也称为状态变量。

Solidity是一个静态类型语言,每个变量需要在声明时确定类型。

合约函数

constructor()  {
    counter = 0;
}

function count() public {
    counter = counter + 1;
}

function get() public view returns (uint) {
    return counter;
}

这里定义了3个函数:第一个是构造函数,用来完成合约的初始化,在合约创建时执行; count() 是一个普通的函数,它对counter变量加1,任何修改状态变量都需要通过一个交易提交到链上,矿工打包之后交易才算完成;get()函数用来读取变量的值,这是一个视图函数,不需要提交交易。

Counter 非常简单,没有使用 import 引入其他文件,也没有定义事件和其他自定义类型,这些内容我们将在后面的文章里进一步介绍。

练一练

这个部分需要前往 [DeCert网站],DeCert 提供了一个交互式 playground: image.png

小结

这一节我们介绍了Solidity合约代码结构,我们准备了一个 Solidity 基础测试题,挑战通过你就可以领取到一枚技能认证 NFT。

学习 Solidity 不要忘了翻看 Solidity 文档手册


来 DeCert.me 码一个未来,DeCert 让每一位开发者轻松构建自己的可信履历。

DeCert.me 由登链社区 @UpchainDAO 孵化,欢迎 Discord 频道 一起交流。

本教程来自贡献者 @Tiny熊

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
DeCert.me
DeCert.me
https://decert.me/ 面向未来学习,构建链上信用