First Solidity App

2024-05-28 20:36:39 浏览数 (2)

First App

在前文Hello World with solidity介绍了什么是 Solidity、Solidity 的合约结构以及如何使用Remix IDE[1]开发和测试智能合约。

在前文的例子里,合约只是简单的输出“Hello, world!”,我们无法与合约进行更多的交互。现在我们编写一个稍微复杂的合约,该合约实现加减操作:

get():获取当前变量的值•addition():变量 1•subtraction():变量-1

代码语言:javascript复制
// 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, additionsubtraction函数。7.view: 这是一个函数状态修饰符,表示这个函数不会修改合约的状态变量。在这个例子中,它应用于get函数。8.returns: 这个关键字用于声明函数返回的变量类型。在这个例子中,get函数返回一个int256类型的数。9. =-=: 这是算数运算符,用于增加或减少变量的值。在这个例子中,它们分别在additionsubtraction函数中被用来改变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

0 人点赞