First App
前文介绍了什么是 Solidity、Solidity 的合约结构以及如何使用Remix IDE开发和测试智能合约。
在前文的例子里,合约只是简单的输出“Hello, world!”,我们无法与合约进行更多的交互。现在我们编写一个稍微复杂的合约,该合约实现加减操作:
get()
:获取当前变量的值addition()
:变量+1subtraction()
:变量-1
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract Counter{
// 定义了一个状态变量,将会存储在链上
// public表示该变量在合约外是看查看的
int256 public count;
// 查询链上当前的值
// 因为需要从链上查询,所以需要使用 view
// 如果不存链上查询,可以使用 pure
function get() public view returns(int256){
return count;
}
// 每调用一次,count+1
function addition() public {
count += 1;
}
// 每调用一次,count-1
function subtraction() public {
count -= 1;
}
}
合约说明:
// SPDX-License-Identifier: MIT
: 这不是Solidity的关键字,而是文件顶部的版权许可声明。它指定了使用哪个开源许可。在这个例子中,使用的是MIT许可。pragma solidity ^0.8.24;
:pragma
用来声明Solidity编译器的版本号。^
表示适用指定发布版本及补丁版本。在这个例子中,编译器版本设定的是0.8.24。contract
: 这是用来声明智能合约的关键字。所有在括号{}
中的代码组成了合约的主题。在这个例子中,合约的名字是Counter
。int256
: 这是Solidity的一个数据类型,代表256位整数。在这个例子中,count
被声明为int256
类型。public
: 这是一个可见性修饰符。在这个例子中,它表明count
变量和下面的函数可以在合约外部被访问。function
: 这是用来声明合约内的函数的关键字。在这个例子中,它被用来声明get
,addition
和subtraction
函数。view
: 这是一个函数状态修饰符,表示这个函数不会修改合约的状态变量。在这个例子中,它应用于get
函数。returns
: 这个关键字用于声明函数返回的变量类型。在这个例子中,get
函数返回一个int256
类型的数。+=
和-=
: 这是算数运算符,用于增加或减少变量的值。在这个例子中,它们分别在addition
和subtraction
函数中被用来改变count
值。
扩展知识
可见性修饰符
在Solidity中,有四种函数可见性修饰符:
- public :公开的,可以在合约内外部调用。这是默认的修饰符。
- private :私有的,只能在当前合约内部调用,不能通过其他合约或者transaction调用。
- internal :内部的,与 private 类似,只能在当前合约或继承此合约的合约中调用,但不能通过transaction调用。
- external :外部的,只能在合约外部(通过transaction或者使用this.function方式)调用。
选择合适的可见性修饰符可以帮助优化智能合约的gas消耗。具体来说,external
修饰的变量比public
更便宜,因为其跳过了一些可能导致的内部函数调用的复制操作。然而,如果一个函数被定义为external
,那它不能在合约内被其他函数调用。
此外,状态变量,示例中的count
,也有其自己的可见性:
- public :公开的。对于公开的状态变量,Solidity将自动创建一个getter函数,使得外部可以访问此状态变量的值。
- private :私有的。只有当前合约可以访问该状态变量。
- internal :内部的。只能在当前合约或继承此合约的合约中访问该状态变量。
这些可见性修饰符都可以帮助你更好地管理合约的权限和数据安全。
函数状态修饰符
在Solidity中,函数状态修饰符用于更改或调整函数的行为。以下是在Solidity中可用的状态修饰符:
- pure: 这种修饰符提醒读者该函数不会尝试读取或改变状态。也就是说,该函数不会读取或修改合约的状态。
- view: 这种修饰符告诉阅读者该函数不会尝试修改状态。也就是它不会修改合约的状态,但它可以读取当前合约的状态信息。
- payable: 这种修饰符允许函数接收以太币。如果一个函数被声明为可付费的,那么当调用它时可以附带以太币值。
- nonpayable: 这是默认的修饰符,表示函数不能接收以太币。
- revert: 此修饰符与assert类似,也会终止并回滚所有改变,但是,revert将不消耗所有剩余的gas,而assert会消耗所有的gas。
除了这些,还有一些自定义的状态修饰符可以用于实现特定的功能。比如,一些合约可能会定义一个只有所有者可以执行的状态修饰符,称为”onlyOwner”。这些自定义修饰符的用法可以根据具体的应用场景和需求来调整。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特