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