导读
区块链这么火,不学一下怎么行?
今天这篇文章将带领大家了解合约的结构,了解最基本合约,为以后设计功能更加强大的合约打下基础!让我们一起走进本文看一下吧!
如果你有什么问题,或者有什么想法,欢迎评论与我一起沟通交流。如果你想了解更多有关于区块链相关技术的内容,那就加群:955538712 或者扫描下方二维码加入我们吧!
1 回看第一个程序
1 第一个程序
我们前面讲了一个合约程序:
pragma solidity ^0.4.0;
contract HelloWorld {
string public name = "水亦心";
function getName() public view returns(string memory) { // view 只访问而不修改数据
return name;
}
function changeName(string memory _name) public {
name = _name;
}
}
这个合约中涉及到了很多的知识点,让我们一起来看一下这个合约的基本结构吧!
2 合约结构
这个合约中,我们第一行是合约的版本号。
pragma solidity ^0.4.0;
后面的类似于C++中的类,这个是具体的合约结构:
contract HelloWorld {
string public name = "水亦心";
function getName() public view returns(string memory) { // view 只访问而不修改数据
return name;
}
function changeName(string memory _name) public {
name = _name;
}
}
合约中的第一行是定义了一个字符串类型的变量;
后面是两个函数。
2 合约文件结构
我们一起来看一下比较常见的合约文件的结构
1 SPDX许可证标识符
这一部分主要是开发人员要考虑的。
智能合约的源代码的提供可能会涉及到版权方面的法律问题,所以Solidity编译器鼓励使用机器可读的 SPDX license identifiers (即许可证标识符)。
为此我们需要使用如下语句说明其许可证:
// SPDX-License-Identifier: MIT
许可证标识符写在合约的最前面,如果不想指定许可证或源代码不是开源的,可以使用特殊值:
UNLICENSED
标识符许可证是最近几个版本的Solidity引入的,早期的几个版本没有,例如0.4.X和0.5.X。我们后续的教程使用的是比较早期的版本,不会涉及到这么复杂的内容,更适合初学者入门Solidity。所以我们只在这里提一下,有兴趣的大家可以深入研究。
2 版本标识指令Pragma与版本号
前面我们的代码中,我们第一行如下:
pragma solidity ^0.4.0;
其中pragma是版本标识指令,用来启用某些编译器检查,要注意的是,这个版本标识指令只对当前合约有效,如果其他合约调用该合约,一般情况下,该合约中的版本标识指令是不会对调用该合约的合约产生影响的。
solidity无需解释,重点是后面的内容,^0.4.0表示高于0.4.0,但低于0.5.0的版本,都可以编译该合约。也就是说0.4.X系列中比0.4.0高的版本,都能编译当前的合约,例如我们上个教程中使用的是0.4.25。同理,^0.5.2表示0.5.X系列中比0.5.2高的版本都能编译该合约。
除此之外,还有一种方法:
pragma solidity >=0.4.22 <0.6.0;
这个方法能够更加灵活地控制版本号,大家能够非常清楚地知道,这个合约支持0.4.22及以上,0.6.0以下的版本进行编译。
3 注释
学习过其他编程语言的同学,应该对注释比较了解,注释的目的主要有:
(1)写在代码最上面,说明代码相关属性及作用
(2)写在代码中,说明某条代码或某块代码的功能
(3)注释掉暂时不用,未来可能会用到的代码
(4)程序员自娱自乐
在不同的编程语言中,注释可能还有其他的作用,例如在Python中,为了能够使得代码能够正确对中文编码,要在前面用注释写:
#coding=utf-8
后期solidity版本的许可证标志符也要使用注释,例如:
// SPDX-License-Identifier: GPL-3.0
在solidity中,注释有单行注释和多行注释。solidity的注释和C语言,C++是一致的。
单行注释符号为://,多行注释符号为:/**/。举个例子:
// AI与区块链技术。
/*
AI与区块链技术
AI and BlockChain technology
*/
除此之外,solidity还引入了另外的注释,或者说就是给上述注释“化妆”,这种注释称为natspec注释,单行注释为:///,多行注释为:/** */。多行注释在每行注释开头,都加了一个额外的*。
举个例子:
pragma solidity >=0.4.0 <0.7.0;
/// AI与区块链技术
/**
* AI与区块链技术
* AI and BlockChain technology
* 这里的多行注释参考了Java的写法
*/
注意:这种注释不是随便使用的,它们应该直接用在函数声明或语句的上方。下面是0.8.x系列注释的写法:
pragma solidity >=0.4.21 <0.9.0;
/** @title Shape calculator. */
contract ShapeCalculator {
/// @dev Calculates a rectangle's surface and perimeter.
/// @param w Width of the rectangle.
/// @param h Height of the rectangle.
/// @return s The calculated surface.
/// @return p The calculated perimeter.
function rectangle(uint w, uint h) public pure returns (uint s, uint p) {
s = w * h;
p = 2 * (w + h);
}
}
下面是0.5.X系列注释的写法:
pragma solidity >=0.4.0 <0.7.0;
/** @title Shape calculator. */
contract ShapeCalculator {
/** @dev Calculates a rectangle's surface and perimeter.
* @param w Width of the rectangle.
* @param h Height of the rectangle.
* @return s The calculated surface.
* @return p The calculated perimeter.
*/
function rectangle(uint w, uint h) public pure returns (uint s, uint p) {
s = w * h;
p = 2 * (w + h);
}
}
4 合约和最基本合约
接下来就是最重要的部分,合约了。
合约就好像是C++中的类,有类名,有类中变量,有类中方法。同样的,合约也有合约名,合约中变量,合约中方法。
合约中还有其他有趣的内容,我们后续会逐步拓展。现在就让我们掌握最基本的用法吧!
定义一个合约如下:
contract SYX {
}
其中,contract表示我们定义的是合约,SYX是我们合约的名称。需要注意的是,合约和左大括号中间要有一个空格。
上面这个合约里面没有任何内容,我们把这种合约叫做空合约。
只有空合约和版本标识指令的合约我们称之为最基本合约。
说在后面的话
这篇文章到这里就要结束啦,希望大家能够通过这篇文章,了解基本的合约结构,打好基础,在未来设计出更加强大的合约!
让我们在后续的课程中,再接再厉,学习更多知识吧。
AI与区块链技术
长按二维码关注
标签:02,Solidity,name,solidity,0.4,注释,版本,合约 From: https://blog.51cto.com/u_12001271/5851853